aboutsummaryrefslogtreecommitdiffstats
path: root/main/gcc/gcc-6-20160721.patch
diff options
context:
space:
mode:
Diffstat (limited to 'main/gcc/gcc-6-20160721.patch')
-rw-r--r--main/gcc/gcc-6-20160721.patch54444
1 files changed, 54444 insertions, 0 deletions
diff --git a/main/gcc/gcc-6-20160721.patch b/main/gcc/gcc-6-20160721.patch
new file mode 100644
index 0000000000..423a1e363e
--- /dev/null
+++ b/main/gcc/gcc-6-20160721.patch
@@ -0,0 +1,54444 @@
+diff -ru --unidirectional-new-file --exclude "po" gcc-6.1.0 gcc-6-20160721
+
+Only in gcc-6.1.0/INSTALL: binaries.html
+Only in gcc-6.1.0/INSTALL: build.html
+Only in gcc-6.1.0/INSTALL: configure.html
+Only in gcc-6.1.0/INSTALL: download.html
+Only in gcc-6.1.0/INSTALL: finalinstall.html
+Only in gcc-6.1.0/INSTALL: gfdl.html
+Only in gcc-6.1.0/INSTALL: index.html
+Only in gcc-6.1.0/INSTALL: old.html
+Only in gcc-6.1.0/INSTALL: prerequisites.html
+Only in gcc-6.1.0/INSTALL: specific.html
+Only in gcc-6.1.0/INSTALL: test.html
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/LAST_UPDATED gcc-6-20160721/LAST_UPDATED
+--- gcc-6.1.0/LAST_UPDATED 2016-04-27 08:22:13.000000000 +0000
++++ gcc-6-20160721/LAST_UPDATED 2016-07-21 22:33:07.000000000 +0000
+@@ -1 +1 @@
+-Obtained from SVN: tags/gcc_6_1_0_release revision 235474
++Obtained from SVN: branches/gcc-6-branch revision 238612
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/MD5SUMS gcc-6-20160721/MD5SUMS
+--- gcc-6.1.0/MD5SUMS 2016-04-27 10:13:12.000000000 +0000
++++ gcc-6-20160721/MD5SUMS 2016-07-21 22:33:11.000000000 +0000
+@@ -1,5 +1,5 @@
+ # This file contains the MD5 checksums of the files in the
+-# gcc-6.1.0.tar.bz2 tarball.
++# gcc-6-20160721.tar.bz2 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
+@@ -20,23 +20,11 @@
+ fd4ecdf5d672efe2b0e409aca9cf9446 ChangeLog.jit
+ 09538b708302f1735f6fa05b622ecf5e ChangeLog.tree-ssa
+ 24ab760126489e69436a43185dc3d202 INSTALL/README
+-faeedc4aa0a33b139dba3e37dfcc32e9 INSTALL/binaries.html
+-2ae07dc670badfddd880d0829f494717 INSTALL/build.html
+-e2df733daff96626c742335bf4a3068f INSTALL/configure.html
+-ea288f7e1bc7954c3de3261254314248 INSTALL/download.html
+-4ba2f0041409f363c2f2eb4f0dd77dff INSTALL/finalinstall.html
+-b19e611b013e13cf467d87dd2d5eba0d INSTALL/gfdl.html
+-f266c60ec900704e2125c1f55ef979fe INSTALL/index.html
+-d87c01263eb292cc6be0c98de9ba224f INSTALL/old.html
+-9fa79492a4fbc527f20e7c1d7f83880f INSTALL/prerequisites.html
+-897b84fa1251ef3d0db6d781c8bebe01 INSTALL/specific.html
+-85828d67c1ef58065b4271ab44018590 INSTALL/test.html
+-3ec6c77feebb68d73c98f35e6eecd408 LAST_UPDATED
++2019f60ae2fe0b2cc56e605eedd16555 LAST_UPDATED
+ b101e24e658738320c6f7460345cd30e MAINTAINERS
+ ac51a3b92098155704bd0e6f3e27e70f Makefile.def
+ 7fa740cb7ac3a6e647702770bb023340 Makefile.in
+ 5658e4a049df2f77bee1189b6603aa77 Makefile.tpl
+-a4e0e310ef9f1d033f44a34667d1bc42 NEWS
+ 80d26bc3b1ad4f6969a96a24c9181bf5 README
+ b510a5285eb05298b5f3d9f5ae920588 boehm-gc/AmigaOS.c
+ 2caafacabf758bb76a9dfce1fc544b97 boehm-gc/BCC_MAKEFILE
+@@ -441,7 +429,7 @@
+ d25174fd04b32bbeab5f3cc783277ec1 contrib/vimrc
+ 7cb42cbdf8becd280d1e16191416fb62 contrib/warn_summary
+ 8b59f0d0a2dcdced14765c514fbad719 depcomp
+-7fa381dd5b3470740f26874e57453fc7 fixincludes/ChangeLog
++03b936340a4cbe370fe25452c5eefabd fixincludes/ChangeLog
+ c23ba4c4f4ca4dfcdd9b4155e4626da7 fixincludes/Makefile.in
+ b6e3f4950abc6e254b467063381f6473 fixincludes/README
+ 455903ad4ff71fa5c5340ef7ae41a0e6 fixincludes/README-fixinc
+@@ -454,13 +442,13 @@
+ 497da58c4b47627a33f754b61f6eb051 fixincludes/fixinc.in
+ 9662d8ad173553c438e3ad3fc9db8352 fixincludes/fixincl.c
+ e1cd70e73f3c2d2319fd9d210ad6a5ff fixincludes/fixincl.tpl
+-2bc45da2368f2edd0afe13a68f13c8c6 fixincludes/fixincl.x
++189a30a5c8c04ee6145097e01dec36b9 fixincludes/fixincl.x
+ 47da6e634225e1667c26a71bcf234bfa fixincludes/fixlib.c
+ d8aac376a7311e465eb0a98d341103a1 fixincludes/fixlib.h
+ 5b2c1fd3ef9d44fb6beb1a0d45ddd533 fixincludes/fixopts.c
+ ed1415e9dbc8f421fd9288bde0d90ad1 fixincludes/fixtests.c
+ 6df145c7cea1e2099cf97a0d83564aca fixincludes/genfixes
+-052121f87ed1928d7b0b7be1850ce33b fixincludes/inclhack.def
++bafa3cf7b936fb735091aba9b601ed87 fixincludes/inclhack.def
+ 73354a5ccc669d3a585be10f1f7e7cb7 fixincludes/mkfixinc.sh
+ 5f9960cfe65b2e6bef658f770e52dfef fixincludes/mkheaders.in
+ 3aa0563cd682ee61ecd9eb6eea0b0bce fixincludes/procopen.c
+@@ -541,7 +529,7 @@
+ 1ee4e2b61ae5781d35271f3181927037 fixincludes/tests/base/stdint.h
+ bd72848710b6f098f5e44218bfe3202e fixincludes/tests/base/stdio.h
+ 1887d8bc1711dae9922852cda6027877 fixincludes/tests/base/stdio_tag.h
+-a35ebd909f0105b249e3af1c1b5826ab fixincludes/tests/base/stdlib.h
++6b842aa18e09c73db745cbffa3cb34cf fixincludes/tests/base/stdlib.h
+ 42a7de17fb8f2ac74bc30c7029199637 fixincludes/tests/base/string.h
+ 6931e261dc1cecb7983279cf909bd784 fixincludes/tests/base/strings.h
+ 127183621f8b29d6912c683be6102135 fixincludes/tests/base/sundev/vuid_event.h
+@@ -572,12 +560,12 @@
+ 955462b555900ecd3934223c64e21fa7 fixincludes/tests/base/types/vxTypesBase.h
+ c78e762f2c91f2af991feda7d3d7f4b2 fixincludes/tests/base/unistd.h
+ a2fe1dc808019c9134bca8a4a9a8eec2 gcc/ABOUT-GCC-NLS
+-06d0293a224884f2cc467d67f3b39573 gcc/BASE-VER
++401718b61199e799c9879210e445d03d gcc/BASE-VER
+ 59530bdf33659b29e73d4adb9f9f6552 gcc/COPYING
+ a916467b91076e631dd8edb7424769c7 gcc/COPYING.LIB
+ d32239bcb673463ab874e80d47fae504 gcc/COPYING3
+ 6a6a8e020838b23406c81b19c1d46df6 gcc/COPYING3.LIB
+-b3fff8c199e988a05ee713f0d584c272 gcc/ChangeLog
++47013cb6b7e3a068a8089357cc00568b gcc/ChangeLog
+ a3b63c675afa7a655cc2bfa8a907af79 gcc/ChangeLog-1997
+ d9a88529352a010253c2e8fb1ed6023b gcc/ChangeLog-1998
+ 240f08f81cb4699e8b49347db38233db gcc/ChangeLog-1999
+@@ -605,7 +593,7 @@
+ 3eb07e0b2e542409bf73d359f7f65609 gcc/ChangeLog.ptr
+ e13638e26743ba41e6011b76cc00d9a9 gcc/ChangeLog.tree-ssa
+ 739ab47f6425bcea1d05e4fc0542de54 gcc/ChangeLog.tuples
+-e8a6574a8534695f6f50d0345ddbcc52 gcc/DATESTAMP
++281e1cfb96402ae5f5610228d48687b7 gcc/DATESTAMP
+ d41d8cd98f00b204e9800998ecf8427e gcc/DEV-PHASE
+ eb92e1ff5e982ca07e173e0eb286d243 gcc/FSFChangeLog
+ 30e1e33411566388b3164558482dc5e6 gcc/FSFChangeLog.10
+@@ -617,7 +605,7 @@
+ e71640635091e22ac2f09f2573aee53d gcc/acinclude.m4
+ 9545fe83576dc99e441c64e268711730 gcc/aclocal.m4
+ 9063d23e571fcde20283b9f34d5e3422 gcc/ada/9drpc.adb
+-790bd4173abc2b4c3a18bb0d780ecbd2 gcc/ada/ChangeLog
++4cdae618932d452c197dc7aa6ae96df1 gcc/ada/ChangeLog
+ 683be0b07dc4f64f118fd5e8ae9cb30d gcc/ada/ChangeLog-2001
+ 7aff25efb203be4136b8776cdc812956 gcc/ada/ChangeLog-2002
+ cd2379152000f40157d349018fb9364d gcc/ada/ChangeLog-2003
+@@ -1076,7 +1064,7 @@
+ 281fc9a014bf9c5a3677f1dd38cc9d5d gcc/ada/a-taster.ads
+ 09e5467697bae79fd39e9e40a68afbab gcc/ada/a-teioed.adb
+ 4eb0094120306451664ed73cdafe1d74 gcc/ada/a-teioed.ads
+-2cf591e4878f55a978c94162e95e7267 gcc/ada/a-textio.adb
++7bbc8ad89fb1f29d8db561dc1e32fa14 gcc/ada/a-textio.adb
+ 8f8b52b35860a106600945520fa91ee6 gcc/ada/a-textio.ads
+ c74a673b222c3d0037a22fb766c67488 gcc/ada/a-tgdico.ads
+ e52f158e88867c99b27268762d9506b4 gcc/ada/a-tiboio.adb
+@@ -1456,7 +1444,7 @@
+ ffd0bc766345dd140e2b58fd781d013f gcc/ada/g-cgicoo.ads
+ 8f1d7bbecdcc4526e6981f20b2c6aa3c gcc/ada/g-cgideb.adb
+ 774b86530311360b01e1e5f5919cbbf2 gcc/ada/g-cgideb.ads
+-755d5b83deaada0e6ba24a69420a9998 gcc/ada/g-comlin.adb
++bacfa2f3967417c2ef2a1a22e0e1191d gcc/ada/g-comlin.adb
+ 5a463e3ab85c8c7a3123e5d216cfbd55 gcc/ada/g-comlin.ads
+ 810166883e82bd21c4358dc3983518f0 gcc/ada/g-comver.adb
+ ca3c61abdfe3cd9da8902dc86e3f6ee5 gcc/ada/g-comver.ads
+@@ -1632,22 +1620,22 @@
+ b45654446bc74bb68ae4adef78906e9b gcc/ada/g-zspche.ads
+ c97edf7ce39a908dcaec55eb49d0abee gcc/ada/g-zstspl.ads
+ 09160006db0a2d8dd0c3ce7884147582 gcc/ada/gcc-interface/Make-lang.in
+-fd793f79cc63bedd8ab6318c59159b4a gcc/ada/gcc-interface/Makefile.in
++c52ceda5eb7e9dea74d930a4ea1ea2a2 gcc/ada/gcc-interface/Makefile.in
+ 055be3d11fa6ccb53ffe7f8970a005ce gcc/ada/gcc-interface/ada-tree.def
+ 71ae48a6622bd120e6be917ab8d64bf6 gcc/ada/gcc-interface/ada-tree.h
+ 51c95420b5900990141d2e5705582197 gcc/ada/gcc-interface/ada.h
+ 4cbfd794461da0feb1b8661ec623b6c6 gcc/ada/gcc-interface/config-lang.in
+ 9779c4debc13c6f1cfa1e4e6a6e6c638 gcc/ada/gcc-interface/cuintp.c
+-b43bc9913a43c58f6b412f15b39d8b78 gcc/ada/gcc-interface/decl.c
++cb827270652e7128b12212e14a40dba0 gcc/ada/gcc-interface/decl.c
+ c413d4d50e9563859f4d751a4404b705 gcc/ada/gcc-interface/gadaint.h
+ 610fd259aa8c7f70adaecc1a439ee311 gcc/ada/gcc-interface/gigi.h
+ f2528ece7aa7e2ed8123de8fe434252a gcc/ada/gcc-interface/lang-specs.h
+ e3a177357a504878ee8863c5dddf3b44 gcc/ada/gcc-interface/lang.opt
+-ef866c2969fb8b3f13f2d3688bc695fe gcc/ada/gcc-interface/misc.c
++4c27c8d2e30202eac1e7d1e9bfffd989 gcc/ada/gcc-interface/misc.c
+ 7bd3630f35c5ac7b5c6cfaf8b16e5723 gcc/ada/gcc-interface/targtyps.c
+-5d1a57ddd9d57b180b4cd4a4be8576a9 gcc/ada/gcc-interface/trans.c
+-a02b6f4ab87fccca6fd7e17d5894186a gcc/ada/gcc-interface/utils.c
+-7a553c9da3a213884ffa3510657b2072 gcc/ada/gcc-interface/utils2.c
++c24acd0193cc38c43ad22911992a55b9 gcc/ada/gcc-interface/trans.c
++66f1fb7584990a73bddbcd0364e75218 gcc/ada/gcc-interface/utils.c
++453dbe7efe389a1246363b89d3072a77 gcc/ada/gcc-interface/utils2.c
+ 68b13816c95338a03ea3b161c2099ea1 gcc/ada/get_scos.adb
+ baa8fdaf8d693eb6c5a7e42944887584 gcc/ada/get_scos.ads
+ e867a4cc97f01b66441a6798d90d4453 gcc/ada/get_spark_xrefs.adb
+@@ -2111,16 +2099,16 @@
+ c444097cce82db9effcdd4c9c5a96b4a gcc/ada/s-osinte-freebsd.adb
+ e9bd5d8bc9bd1a613082cb3fdf78d0d4 gcc/ada/s-osinte-freebsd.ads
+ 94d967aaee13bf49e5e0e154e579871c gcc/ada/s-osinte-gnu.adb
+-7527080a292de10894550135dbed8017 gcc/ada/s-osinte-gnu.ads
++d92a6b091106c7dc15302b2da5f8f385 gcc/ada/s-osinte-gnu.ads
+ 7f1f83f2b78279e17d374e171c1da3b2 gcc/ada/s-osinte-hpux-dce.adb
+ e0c8077ba5d78f82edb8990863741a5e gcc/ada/s-osinte-hpux-dce.ads
+ 1b3ed31d0914d80bf259b7ee627bd948 gcc/ada/s-osinte-hpux.ads
+-7db31ded89ea5e94817f0e46cdcc32d4 gcc/ada/s-osinte-kfreebsd-gnu.ads
++335bc179fd59062a542c5d745fe2a8b5 gcc/ada/s-osinte-kfreebsd-gnu.ads
+ c42f30185875a0d4eb697a00df8d28d5 gcc/ada/s-osinte-linux.ads
+ f147ed363aba7bfd5210a6c9bad98d22 gcc/ada/s-osinte-mingw.ads
+ e0ccc12265d7031072307fee72e66441 gcc/ada/s-osinte-posix.adb
+ 95d33f38d09b64c6ddbdf6ca9013a19a gcc/ada/s-osinte-rtems.adb
+-fe47c19713c37f489761c788b554d4f0 gcc/ada/s-osinte-rtems.ads
++28b7f5c1fb0f8b5082fc0c24d6cd865e gcc/ada/s-osinte-rtems.ads
+ 8e43cb0ee20789269fc8a03e909f1a98 gcc/ada/s-osinte-solaris-posix.ads
+ 4b79cc58a1b73b941681456c8abba9f5 gcc/ada/s-osinte-solaris.adb
+ 5d8bb4d19a51168c31b3c222912bdd69 gcc/ada/s-osinte-solaris.ads
+@@ -2537,7 +2525,7 @@
+ 8e252740bca9edecd024787ce30f649d gcc/ada/sem_ch4.ads
+ 624244945a590748325c5c5c0a41223e gcc/ada/sem_ch5.adb
+ 701ea5362b9e04194e2db15e956540f0 gcc/ada/sem_ch5.ads
+-9e8a2c2a55cc006edca1ce8c49e4245e gcc/ada/sem_ch6.adb
++f4d25ba1c40eafec289a52f211f48aff gcc/ada/sem_ch6.adb
+ 28a7dfff005e523e7d01745dc51c5883 gcc/ada/sem_ch6.ads
+ 037bdc170487cf7dc07b15149dcf7465 gcc/ada/sem_ch7.adb
+ 56d3e6547a0912dd936ec7f605b2d8d1 gcc/ada/sem_ch7.ads
+@@ -2634,7 +2622,7 @@
+ e140d98af57d16903584d7d0bef3a524 gcc/ada/system-aix.ads
+ 17f25a90ee740067374ebd1d1c5a4b0c gcc/ada/system-aix64.ads
+ 30226a4fd428b16322030393cc04e28b gcc/ada/system-darwin-ppc.ads
+-e339f32e04ed66ca7791e54e5fe756c3 gcc/ada/system-darwin-ppc64.ads
++86a5b65c04f1712867b8fbdffa540f94 gcc/ada/system-darwin-ppc64.ads
+ e88ee6c9ecd12a0d06a8c427ce611528 gcc/ada/system-darwin-x86.ads
+ 2485a3790c11c9b2750ffd1aaf26da7b gcc/ada/system-darwin-x86_64.ads
+ f3529cf7e308b1c2f88769fece799df1 gcc/ada/system-dragonfly-x86_64.ads
+@@ -2643,25 +2631,25 @@
+ 25f3a3fee1b2a561ea63182dd634426c gcc/ada/system-hpux-ia64.ads
+ 47f63cb03002da080bd48f7efbb405e9 gcc/ada/system-hpux.ads
+ 0bd33a30d9268cd6f90606e6ce520649 gcc/ada/system-linux-alpha.ads
+-520bb2081f96d3ca2d165ecf2134b1e3 gcc/ada/system-linux-armeb.ads
++c6af2dc10c193c22c08348b38fa3b6ab gcc/ada/system-linux-armeb.ads
+ 01b0500080a147f99972b2d982e4125e gcc/ada/system-linux-armel.ads
+ 364fdafcdcb2a229ca3ca47224421c2a gcc/ada/system-linux-hppa.ads
+ 0e122414da38ed660e3eaa9c9be8dafb gcc/ada/system-linux-ia64.ads
+-68ff02dae1328e9f398e3c73dd4802df gcc/ada/system-linux-mips.ads
+-bc023c717df920237fbef95edbd226d3 gcc/ada/system-linux-mips64el.ads
+-d12178a6a0ba9ea4b121700cac935ad0 gcc/ada/system-linux-mipsel.ads
++ddf03d7b2a8cba5bab9193239c70e7b6 gcc/ada/system-linux-mips.ads
++fcc26e239c1a24371a4a78954ba317d3 gcc/ada/system-linux-mips64el.ads
++0b3bc0eb1bf2a000598beb1598f47fcb gcc/ada/system-linux-mipsel.ads
+ 9ade05d741bb6b9f44a182816caee26a gcc/ada/system-linux-ppc.ads
+-b6eae833e6fe2137efe0aa740315727c gcc/ada/system-linux-ppc64.ads
++7a62b37f000906c2a6a7443112ce3261 gcc/ada/system-linux-ppc64.ads
+ 5b5c779ee5bcde3977781e097b91c1a1 gcc/ada/system-linux-s390.ads
+ 8da865876fdebc15a9fab07fa62fd877 gcc/ada/system-linux-s390x.ads
+ 43432b26bef17aa65b2fd34e29a2f014 gcc/ada/system-linux-sh4.ads
+ ab6d2ca73fb5888b79fe9901adfb8a98 gcc/ada/system-linux-sparc.ads
+-746c66c11e22c3197cb994389e56e816 gcc/ada/system-linux-sparcv9.ads
++406a7e49e6e80be0426793c59092b568 gcc/ada/system-linux-sparcv9.ads
+ a9e779541250ed8a6f4806893a2f2ee8 gcc/ada/system-linux-x86.ads
+ 53f0201149b3a77de1cd4a7748ba2ddb gcc/ada/system-linux-x86_64.ads
+ 34b18e606f0f307a08fa56858c19d945 gcc/ada/system-mingw-x86_64.ads
+ 009f003dea0dd424ccad8aa6d022320c gcc/ada/system-mingw.ads
+-f88c313eaecc8e40a2484a6e48107810 gcc/ada/system-rtems.ads
++7f460166af9cc30048191b5fdb8d1f18 gcc/ada/system-rtems.ads
+ 82baebc8db3e7bfae7183b08fe31c2c3 gcc/ada/system-solaris-sparc.ads
+ 83f4ccb8086c6fee3b90a682436c1a6e gcc/ada/system-solaris-sparcv9.ads
+ 056b449ee14d58e8119219b0720b9287 gcc/ada/system-solaris-x86.ads
+@@ -2736,11 +2724,11 @@
+ 0493a7ed666c4b102be665a8e328be35 gcc/ada/xutil.adb
+ 2c8b2f1975e4e064d3803db6dbd516cb gcc/ada/xutil.ads
+ 50ccfa68b3ffc2cea9079d312bab3902 gcc/addresses.h
+-8b315dd0ca3dfd85ed4138a94f0226ba gcc/alias.c
++1ea67a8bdfe6758c1407490f0a8686b6 gcc/alias.c
+ 3f435b1cc17bbef3b90835cfda49b4eb gcc/alias.h
+ 2129a033ed56d38308ca40e1424337c0 gcc/alloc-pool.c
+ f9d22e8738cd46b8cd0075ae0e4bd5e1 gcc/alloc-pool.h
+-e6e8f06d2d315d03b3a5239d3f11d83c gcc/asan.c
++71922db6042ca44d9217d21a73c6b0be gcc/asan.c
+ f24bb3e6f685b695e4763d26c6d5f82e gcc/asan.h
+ f015e12bb7fc520fda759e96f1a39311 gcc/attribs.c
+ 01d94dd275ab10965e144d0b9fa042f9 gcc/attribs.h
+@@ -2759,7 +2747,7 @@
+ 998cc73d2ebc13688ba0738f7db6d87c gcc/builtins.c
+ d9b3f84012b6195bbd548885fa07798e gcc/builtins.def
+ 70361ef7d2d5ef5ab078cc31686c0bde gcc/builtins.h
+-d7427e86dbf8fbabd4a42de303b749b0 gcc/c-family/ChangeLog
++732f68d952d2dcaa1881fe602dba3d64 gcc/c-family/ChangeLog
+ ea3fa1f4d7390a105fa3caab4f79aaf7 gcc/c-family/ChangeLog.gimple-classes
+ a2097d99f50de5a2a2e9b9f45acca9af gcc/c-family/array-notation-common.c
+ d268d78fdd0da46755bad2715380ca60 gcc/c-family/c-ada-spec.c
+@@ -2767,17 +2755,17 @@
+ d1049a363c1ecd0f98eee1aeb9ff6bd1 gcc/c-family/c-cilkplus.c
+ 307acace620255e11a0a4278376f80e5 gcc/c-family/c-common.c
+ 2ace27db32acd08f6b79a83ac2586e45 gcc/c-family/c-common.def
+-61356ffa6a8522c2ff784912b59a3dfa gcc/c-family/c-common.h
+-285e5395a1948ee8a02d84a5c026bca0 gcc/c-family/c-cppbuiltin.c
++9f20703bcd296e28b53330fdacbaa6c4 gcc/c-family/c-common.h
++2726890948ddd8a7c99836847c4c465b gcc/c-family/c-cppbuiltin.c
+ 3b48128f9d0659eb1ac831b7d0309053 gcc/c-family/c-dump.c
+ dc79c0465bd1d84f8a2a1c8665086010 gcc/c-family/c-format.c
+ a722f61259b29e7519af2ea01a4cfbde gcc/c-family/c-format.h
+-46424f0d93a4f1c2958225b7a9635981 gcc/c-family/c-gimplify.c
++889f2fce374ebce16f1c541fafc3b2e6 gcc/c-family/c-gimplify.c
+ 070d0560fe68e0d18e80f7ea464773ae gcc/c-family/c-indentation.c
+ c40da6434275aba5adccc92809e6e2d6 gcc/c-family/c-indentation.h
+ 969f5257abd1441eb2e44ec57beac8a3 gcc/c-family/c-lex.c
+ f9fc887cc07ce21721909e6cc63fe030 gcc/c-family/c-objc.h
+-a9f7cdede5781cfd42fb0bf6a0cc4cc2 gcc/c-family/c-omp.c
++f10a78fbf89addf947056a7351a1eaad gcc/c-family/c-omp.c
+ 39020d7f69c32d241015c39dff40d502 gcc/c-family/c-opts.c
+ b243e9180d094b7539387b07231deb33 gcc/c-family/c-pch.c
+ 25b59b2fa2b392ea34e1eafa54f0641a gcc/c-family/c-ppoutput.c
+@@ -2791,11 +2779,11 @@
+ 84c72ad7037868dfe6b3ea01496d2b74 gcc/c-family/c-target.h
+ c332b723ec991da5fb10d4b3b450baf6 gcc/c-family/c-ubsan.c
+ 392b541b5038adb62676d41a74001649 gcc/c-family/c-ubsan.h
+-a3b0076967d29252976ba4145fa1867c gcc/c-family/c.opt
++cff22aa92cff7c3a722057eb507d5297 gcc/c-family/c.opt
+ 087e1ce4fd7400b0b286e3c2c7bd9aa4 gcc/c-family/cilk.c
+ 7deafa20602c6826937fab0a455cc8ed gcc/c-family/cppspec.c
+ dad64a3c28e8bbc124ca8c2f3a7a9f69 gcc/c-family/stub-objc.c
+-a575bf8a7604ea59dc92a649577f9ea6 gcc/c/ChangeLog
++8e4f5b6a681941881b61133b3accf1c9 gcc/c/ChangeLog
+ 9cdf859ec7692fe84b67ba9109e3995e gcc/c/Make-lang.in
+ 5bb4a410264b7f7ac0da9ddcffd92210 gcc/c/c-array-notation.c
+ 6d3e1a369a7f78b2f8b9d9f0f6f8aff7 gcc/c/c-aux-info.c
+@@ -2807,13 +2795,13 @@
+ 88a01d3181a5b0369e3febd6acfe9520 gcc/c/c-lang.h
+ 8cac2a5e96973c846bd33bb75d3f651d gcc/c/c-objc-common.c
+ 1092d3b7a8d0bc846e6d7f7433692208 gcc/c/c-objc-common.h
+-658fd55e81e04dbb9fdb65e25d4d41ee gcc/c/c-parser.c
+-e68d1d94dab107ca752ec21c2fd10485 gcc/c/c-tree.h
+-ebcf7804fa978c86de277f2cf45ac5b7 gcc/c/c-typeck.c
++99f360f887deb4bc4197d0ec6f6d6105 gcc/c/c-parser.c
++9b1855479c2c36717fefaba6896f2f8d gcc/c/c-tree.h
++b5ac8b88fc750cd755936cc794748d3f gcc/c/c-typeck.c
+ 3747bb41e8fd6a5de51dd6e7a7a47970 gcc/c/config-lang.in
+ 48ad75424472d7bdc1b734bf90e32a67 gcc/c/gccspec.c
+ 82c12673c34f23c306e289a9143864bc gcc/caller-save.c
+-ce68401b13ebe1bbabc9cea9313eaa28 gcc/calls.c
++9e1a94e39fbf3c650570aa64ccd735ad gcc/calls.c
+ f7110748a1375215f4469bde141b3432 gcc/calls.h
+ 0d087c05ff5dd25db84dedfbaf568d4b gcc/ccmp.c
+ d3d5b380ad6f749bd8db65a92d79e3ee gcc/ccmp.h
+@@ -2826,7 +2814,7 @@
+ 745b7c812796bf46765ebc99d5ad4566 gcc/cfgbuild.h
+ a6ae55469bb1b6ad19931eb0ce91c962 gcc/cfgcleanup.c
+ 3bc167b2db649ed6cbd7ce505e48d35d gcc/cfgcleanup.h
+-a30d4252b545009dd4ec82aabefc6904 gcc/cfgexpand.c
++3d4be9fe9feb4248e7822dbf2561140c gcc/cfgexpand.c
+ 020afc9cbf1b8f3e6768a0ce6a7e9b55 gcc/cfgexpand.h
+ 9d7a00e997730c1e512a0c8f318e1715 gcc/cfghooks.c
+ 86822fd705361191ce501823f4c84cf8 gcc/cfghooks.h
+@@ -2835,9 +2823,9 @@
+ e40d94d671641c4d2a68835c259d8098 gcc/cfgloopanal.c
+ 224984ea290493db3870a0ac1fcec23c gcc/cfgloopmanip.c
+ 6b8000ec10e5f8d86a76268393bcb5a2 gcc/cfgloopmanip.h
+-0b6b42e81311c9c0b90f384542f84a9b gcc/cfgrtl.c
++0e5a7f5771e6f0aeb4ab18b86f9b38ee gcc/cfgrtl.c
+ c5f49aa0380336a2a865262bdb6edf72 gcc/cfgrtl.h
+-71ded72dde0902e617fa2d55cbbb90e2 gcc/cgraph.c
++555e4220f0d3ea4b83dd17af16a2384d gcc/cgraph.c
+ 7605193302a08a7aa5813a2007e874ef gcc/cgraph.h
+ 6db406b55343fb518e9a72363f82202e gcc/cgraphbuild.c
+ 0dd454c4df9ab62c991b406f6ab4bf4f gcc/cgraphclones.c
+@@ -2911,9 +2899,9 @@
+ 833a4f3b8d4bd41edd9548e426fd27b3 gcc/compare-elim.c
+ 5d296c1586f1d268a85c2aa0a3b4d64a gcc/conditions.h
+ 9f336f22045efcaa67e235fba1bc08d6 gcc/config.build
+-0e141afdcf55ff62734835a38532e63f gcc/config.gcc
++ade5335c97576ae1c1ae6677f9cf4f6f gcc/config.gcc
+ 75d9643d9dc2c2d16c12cdcb12dd361a gcc/config.host
+-f4624f449d40e68419ea99e171e6360d gcc/config.in
++ab7e07d11b6403781c1f8e477b2a80ec gcc/config.in
+ 8e697813dc96ca90f5d0f4c196efe2cc gcc/config/README
+ b94306d00c5458b99b6b45830bf1eae6 gcc/config/aarch64/aarch64-arches.def
+ d70c159b70cc03592ac9fad295f8aff9 gcc/config/aarch64/aarch64-builtins.c
+@@ -2930,8 +2918,8 @@
+ 3f9b7aaf2703c560457dadd6e0c9148b gcc/config/aarch64/aarch64-opts.h
+ 5e44cc5092927352daf58d5d06792e96 gcc/config/aarch64/aarch64-protos.h
+ 34b37d5443fa4b7761945c006d214aff gcc/config/aarch64/aarch64-simd-builtin-types.def
+-52242be4568fcea119d6074ceb257d63 gcc/config/aarch64/aarch64-simd-builtins.def
+-e1fadf5e5e4d054343fce675c7613146 gcc/config/aarch64/aarch64-simd.md
++2900ce100d2c396ab04379ddcaebb97d gcc/config/aarch64/aarch64-simd-builtins.def
++d9316f824c3e2ed2fe92b3216a75a60f gcc/config/aarch64/aarch64-simd.md
+ e71203d59ad9d88352c651bf54967d4e gcc/config/aarch64/aarch64-tune.md
+ 56e698ddd35d4d45d1b27f04173c27cc gcc/config/aarch64/aarch64-tuning-flags.def
+ 28e8b35a70cddb3b2ecc24f45c6b1425 gcc/config/aarch64/aarch64.c
+@@ -2939,7 +2927,7 @@
+ 3283c054473233f66729a33663aba76a gcc/config/aarch64/aarch64.md
+ 8186400b6ebc5890fb03c1c392946923 gcc/config/aarch64/aarch64.opt
+ ffcb2d86bab40fbb01226fcbac5f8afb gcc/config/aarch64/arm_acle.h
+-3fa2d68117b6c049d2f042ef47cfaec0 gcc/config/aarch64/arm_neon.h
++2307be37347862696a1710a987cb4f58 gcc/config/aarch64/arm_neon.h
+ a775d873b993526c6094ca1b28d8e074 gcc/config/aarch64/atomics.md
+ aab77a9141d7d8e0d399251a034b05ae gcc/config/aarch64/biarchilp32.h
+ f9fb82867abfae70f536c437cabbe0ec gcc/config/aarch64/biarchlp64.h
+@@ -2960,7 +2948,7 @@
+ b0a8914a24f787dbee5e200ee917f621 gcc/config/alpha/alpha-protos.h
+ 07b69b4d54e4a57bf76dea6f05e45340 gcc/config/alpha/alpha.c
+ 0a25a7cfc4a2956d79c165776297f982 gcc/config/alpha/alpha.h
+-38517a12f3265291c74853b269c5cf0b gcc/config/alpha/alpha.md
++d248ba9c7788eb583ed7b179cc5029d8 gcc/config/alpha/alpha.md
+ a26177734159dae5679e9276b982ace6 gcc/config/alpha/alpha.opt
+ 4061b6fbc59a1083452389c88c59dc42 gcc/config/alpha/constraints.md
+ d6ffc31b378eda081971d2c468da4e2f gcc/config/alpha/driver-alpha.c
+@@ -3007,7 +2995,7 @@
+ 74de244fd60b2d76a3787960d782373f gcc/config/arm/aarch-cost-tables.h
+ f2b572d07746e403fd525bf9691ee2a5 gcc/config/arm/aout.h
+ 62fcdf218b75986907eca422e13aabd4 gcc/config/arm/arm-arches.def
+-9a616434ff1b3cb0ebf9fa48bab40ce3 gcc/config/arm/arm-builtins.c
++e4a314e21e266db6c5d485e913a6885c gcc/config/arm/arm-builtins.c
+ 1e0456dd3a7822f2fa3e26f77e2c2d26 gcc/config/arm/arm-c.c
+ 65b5dc7fa9360d10a9ca86119c20ba77 gcc/config/arm/arm-cores.def
+ b63afb8e425edc52c016b6c15066845e gcc/config/arm/arm-fixed.md
+@@ -3020,7 +3008,7 @@
+ b1cbf9ca4f296f2f39987d24e0af2530 gcc/config/arm/arm-simd-builtin-types.def
+ c103dfefc6fcb9ebb20a29729bfecb69 gcc/config/arm/arm-tables.opt
+ 3f73ffc85b17a98310aef5b53adc5d98 gcc/config/arm/arm-tune.md
+-cc2c987327ef9a3356a045e607ef2aec gcc/config/arm/arm.c
++ea7cd77a1db03fa7b565ffbde84298d3 gcc/config/arm/arm.c
+ 23e54a7c9fe7e1c62983bdd39f19951d gcc/config/arm/arm.h
+ 55f1f86069e992742e1b89abcc6ec7c4 gcc/config/arm/arm.md
+ 2d7e7f27748045f2d77a7377fda31d5e gcc/config/arm/arm.opt
+@@ -3060,7 +3048,7 @@
+ 3c4127440c24e5b23dce8d0f7cb8619b gcc/config/arm/fa626te.md
+ 2e52ace39749711dc3787f62948b77ec gcc/config/arm/fa726te.md
+ 197df6dea714a30f83e9b80aae52e81a gcc/config/arm/fmp626.md
+-4b74ce4cb188d764b7914f35639c2116 gcc/config/arm/freebsd.h
++0ecf27dc3b0558645025fe3aaa600593 gcc/config/arm/freebsd.h
+ 870d22c2f986f799ebc3522dace502f8 gcc/config/arm/genopt.sh
+ c8550f4949927e5334c212129185e2bb gcc/config/arm/gentune.sh
+ 05e346aff9b27762033d2fd03753ea06 gcc/config/arm/iterators.md
+@@ -3116,16 +3104,16 @@
+ 4c3c46eb845e3505658b81b8eaa14288 gcc/config/avr/avr-modes.def
+ 0fffc0f61c26f4c9de873ad542b094ed gcc/config/avr/avr-protos.h
+ 41b9882721bdec25585513f697848b5d gcc/config/avr/avr-stdint.h
+-88ca6ca8ed203bb11f9d74491a225841 gcc/config/avr/avr.c
++b38d57af8ead4be8ee87d298ed78c01e gcc/config/avr/avr.c
+ aea75b0a042f09c4610dfd149483ed2d gcc/config/avr/avr.h
+-66d5356d423c0d037897ef09cd81bc6d gcc/config/avr/avr.md
++eff9328f7a8233598fb881c52e6518cd gcc/config/avr/avr.md
+ 97ae0e97c66153cd01ba33e6dd23a191 gcc/config/avr/avr.opt
+ 6eea869c9b52b117753eab2b0bb544ab gcc/config/avr/avrlibc.h
+ 272063927d64ca768006dc1e703a4a4c gcc/config/avr/builtins.def
+ fe325d127710d93f8c73b9ebfdd07ef4 gcc/config/avr/constraints.md
+ 04cce33bd7b1254e4ef5acfd097d1e55 gcc/config/avr/driver-avr.c
+ 7ad86a6961289da9a41d477a7d06632f gcc/config/avr/elf.h
+-ccb997e1a0a2c184e23e1d255ddbd5d8 gcc/config/avr/gen-avr-mmcu-specs.c
++ea6ae4085ca32c92536855c96966835b gcc/config/avr/gen-avr-mmcu-specs.c
+ ba3b75183e01f578520c7f5ad4822d65 gcc/config/avr/gen-avr-mmcu-texi.c
+ a9056b0b6e3fde442dc545459462b61e gcc/config/avr/genmultilib.awk
+ 5ee74356b8bc2a97c70d2b19e9547ad4 gcc/config/avr/predicates.md
+@@ -3209,7 +3197,7 @@
+ 9a96119bd809f334545f28e92af4d7da gcc/config/darwin-protos.h
+ 158992b1d82c85cd69b4d3a96fa964ba gcc/config/darwin-sections.def
+ 56de9a396d23dd931c1f0dfd326f7fae gcc/config/darwin.c
+-1988031d70e01f816930f126da6a4f87 gcc/config/darwin.h
++217b6049deb67093ce6ace2e85e26144 gcc/config/darwin.h
+ b463a7c4d27e349e9f2cd0e00a61487f gcc/config/darwin.opt
+ f2c8f6f89fa8ec74c30f6d9bc2d0d4e8 gcc/config/darwin10.h
+ 3544d912bd14b11ecd2f3a94d712c1b9 gcc/config/darwin12.h
+@@ -3332,7 +3320,7 @@
+ fe17ca5109af0e6e93b74bae231d1a55 gcc/config/i386/clflushoptintrin.h
+ 8db337d30ef627209263315869a56a98 gcc/config/i386/clwbintrin.h
+ 876790e99f6c0bb421e1492c7ea46ff0 gcc/config/i386/clzerointrin.h
+-90532cc9b95026c43a798885aa570e2f gcc/config/i386/constraints.md
++a6979d6ddcc5bb8ecf2a26f5ea34c71c gcc/config/i386/constraints.md
+ 71baed36fc56f65d8c91aaefd5758aa1 gcc/config/i386/core2.md
+ 869e4b210e6f821bb16ac1e41fe7c5b7 gcc/config/i386/cpuid.h
+ 7fee26d8fedd334aa6fcd4bdc08cffb3 gcc/config/i386/cross-stdarg.h
+@@ -3350,7 +3338,7 @@
+ 8f07bf469832ed4bd2cf349351a4be27 gcc/config/i386/djgpp.h
+ c8e620657991f87382f5e2868a3a49e4 gcc/config/i386/djgpp.opt
+ bf04c6bfb2855901059ede3c90d91a0e gcc/config/i386/dragonfly.h
+-1d476bca8c104bac65750c75940c3f2f gcc/config/i386/driver-i386.c
++86578484e605e5669e9fa482de9ac349 gcc/config/i386/driver-i386.c
+ 0f5e3cbf6fc57e8c96539b55c3c5d03a gcc/config/i386/emmintrin.h
+ 4d39e44657c94313f49309df7592ed83 gcc/config/i386/f16cintrin.h
+ 0123c9ade82b62efeff1e8b33c49a4a9 gcc/config/i386/fma4intrin.h
+@@ -3371,15 +3359,15 @@
+ 7207180c0653cb9c7507f26a9a814675 gcc/config/i386/host-i386-darwin.c
+ b80037f63f5fd458518208bbd7dbaa4f gcc/config/i386/host-mingw32.c
+ 47ac29c21a60ee2ca29d54ea4a345deb gcc/config/i386/i386-builtin-types.awk
+-304099577fa33b6bf5bf012bfb1257d8 gcc/config/i386/i386-builtin-types.def
++b3837bf5c922be13974120be24db78c3 gcc/config/i386/i386-builtin-types.def
+ bbfe1f7b817a5b3321bdc8c5ca0d6b32 gcc/config/i386/i386-c.c
+ c29497fe4c1e5389895075d220252ca8 gcc/config/i386/i386-interix.h
+ 1c71860a666631f1a174dea14c52dbff gcc/config/i386/i386-modes.def
+ ac0b4653ef3d1e8200e8efbf73c5d8f0 gcc/config/i386/i386-opts.h
+ d3f3a1198cf0be4e2a3b9b10e0f761cc gcc/config/i386/i386-protos.h
+-8558c1ec5c184c6d477b1b353e12f1cc gcc/config/i386/i386.c
+-8d0d0d6956f44b2dd70e2ccc5677fdc0 gcc/config/i386/i386.h
+-ea9cb826551f214701f0ec1e3c12d742 gcc/config/i386/i386.md
++5dcd9d24f02d8cf92de3e00a69a09d94 gcc/config/i386/i386.c
++39295430120b7691bd2d787705eabfb1 gcc/config/i386/i386.h
++077d661cd9ce686cb9b40a9cb77c5c87 gcc/config/i386/i386.md
+ e16f0e58cf07c96d0511136d7c28611a gcc/config/i386/i386.opt
+ be209c39783d5218055012112fe03242 gcc/config/i386/i386elf.h
+ a56c5de1cde5aaa7a3753ce09e0be661 gcc/config/i386/ia32intrin.h
+@@ -3425,7 +3413,7 @@
+ 5aa912e76dac257cfe5012440f7ad90a gcc/config/i386/pmmintrin.h
+ 7810065fc76773a3b740126a476af54d gcc/config/i386/popcntintrin.h
+ 4dcd1cf3c734c77f06e840e1fbd678f8 gcc/config/i386/ppro.md
+-d0e6526febb471bb3acfeb59218f2847 gcc/config/i386/predicates.md
++50884030e7b9ddc82422cf705f6659d7 gcc/config/i386/predicates.md
+ a0f562fc0aef289f6cdef5b931f5e39f gcc/config/i386/prfchwintrin.h
+ 7feefb44b5c73254b20e5b7820e45ba1 gcc/config/i386/rdos.h
+ d57b23dfe66e6405fed787f9047ce355 gcc/config/i386/rdos64.h
+@@ -3437,7 +3425,7 @@
+ 6d7b4d52cdc2a6db01f9c20c45be0795 gcc/config/i386/slm.md
+ d1a02c4509457e48895953880e756b4a gcc/config/i386/smmintrin.h
+ 0a7e726af98f6a39952052f361cdfbee gcc/config/i386/sol2.h
+-9f55c5a60dd162d1ae5fb93d69b7a4a3 gcc/config/i386/sse.md
++30d0c0c8fd58d4ffee139d715d1e1b66 gcc/config/i386/sse.md
+ 91d7c7f7b9b34e3ae4e87882a355bf2b gcc/config/i386/ssemath.h
+ be9c2b7e2ff5d3a32ab3d902b56762ac gcc/config/i386/stringop.def
+ 96f9e071c5c165d0cc21e51cfebe5b92 gcc/config/i386/stringop.opt
+@@ -3662,7 +3650,7 @@
+ f298ec31e1348e797caa9f7a1a7ea94d gcc/config/microblaze/microblaze.md
+ 4dec1d8cba0ae9e95e0ae11ad82575dd gcc/config/microblaze/microblaze.opt
+ a16c7f39b0b2862c81dd0f0a4b232307 gcc/config/microblaze/predicates.md
+-f986ab14af6b81f50248b55de266dfbb gcc/config/microblaze/rtems.h
++c560707d4508d14056eaacb33c6b00bf gcc/config/microblaze/rtems.h
+ ca8367ac97d24747376a746a1a3806c2 gcc/config/microblaze/sync.md
+ 17818a25ae3112098cd91d698e37f0f7 gcc/config/microblaze/t-microblaze
+ 63ccba4e7f745d36609d7c129bac6288 gcc/config/microblaze/t-microblaze-linux
+@@ -3851,7 +3839,7 @@
+ d835d08884a2846e70bef505767bd3f1 gcc/config/nios2/t-rtems
+ c2be83b7f197d233a6ce04c2245a312a gcc/config/nvptx/mkoffload.c
+ 71182308acd7b24f983c5c3836f21e97 gcc/config/nvptx/nvptx-protos.h
+-656dbc77c4631baba2d2fc786dbfd286 gcc/config/nvptx/nvptx.c
++d16914348f2acdb5a72c4e8cd5c348d9 gcc/config/nvptx/nvptx.c
+ ee26c09dc69c862b8465425e61efb50d gcc/config/nvptx/nvptx.h
+ b6d00d17aa4debe5cbfb686a317af311 gcc/config/nvptx/nvptx.md
+ f20baafe92ab83b58eced858f6668a59 gcc/config/nvptx/nvptx.opt
+@@ -3881,9 +3869,9 @@
+ e1c6685604f681faea2ce89975cb7fb0 gcc/config/pa/pa-openbsd.h
+ 7fe7a5966510922de22aeefc35c8e010 gcc/config/pa/pa-opts.h
+ b1fa12eef4f2d69520c8e33ff00ea833 gcc/config/pa/pa-protos.h
+-8db4f36dd448d091f4e3942edf612201 gcc/config/pa/pa.c
++9a436df6ba10cb315e4759c263bb20f7 gcc/config/pa/pa.c
+ 0cb5f8b8230c90bd6580010bb9088794 gcc/config/pa/pa.h
+-85cf1e3de4bb1b1e4842fc2d8277c179 gcc/config/pa/pa.md
++870d0b3ff5e10512bbebb34482e95aa9 gcc/config/pa/pa.md
+ 2a55715c21637c72f4c2306798f28715 gcc/config/pa/pa.opt
+ 2c84ac4128fba0f0ec7a3a85f7724f7f gcc/config/pa/pa32-linux.h
+ 3eb3ff97a411ccda47b603da5c8cc95f gcc/config/pa/pa32-openbsd.h
+@@ -3921,19 +3909,19 @@
+ dbafb0fbae9820ebfe82de65a3b83f68 gcc/config/rl78/rl78.opt
+ 013aededeacbccea80fe3b6306066322 gcc/config/rl78/t-rl78
+ ad241b2a8851ae9d5b6641c7b7b479cb gcc/config/rpath.opt
+-a3432c56bcb7fc05fd6b64099e48f679 gcc/config/rs6000/40x.md
+-8fc4d37e67deb5fe12ee814274162f79 gcc/config/rs6000/440.md
++be34836d1ba31c631716d5010c1fe037 gcc/config/rs6000/40x.md
++e2c353cd79f9a4399a0dc40fe79e035c gcc/config/rs6000/440.md
+ cfc1fff1a1e39dd4fd2f1e047c1b010d gcc/config/rs6000/476.h
+-615d3d843859a69803593326d4b04616 gcc/config/rs6000/476.md
++76c22ba4be588931c8b58aff695d1d6f gcc/config/rs6000/476.md
+ 1da0524d2d6d22f5cb7d53d9fe1c611b gcc/config/rs6000/476.opt
+-6c88c644d7df100d13787b316e121593 gcc/config/rs6000/601.md
+-a6556ad3f85c0f4b0b1e84217fa9e114 gcc/config/rs6000/603.md
+-d37c6f2ae8b08b04cff356c70860d541 gcc/config/rs6000/6xx.md
+-fe7aaac8aa1b8059c3116b73e397f690 gcc/config/rs6000/7450.md
++7c0fa5cb3b835130227458f0f69f813b gcc/config/rs6000/601.md
++ecbb83eea3d6a47a6af5584c6be12ca9 gcc/config/rs6000/603.md
++481cf4bf7f0be523a61462b9fb81de69 gcc/config/rs6000/6xx.md
++0fe53917723a9db222e730f098ace1fa gcc/config/rs6000/7450.md
+ 03b5a697e67b56138a872018df4c3bab gcc/config/rs6000/750cl.h
+-010f2f4c822c612437243e649ec4c102 gcc/config/rs6000/7xx.md
+-c8e123f1b622c43a3745ff2b5f799035 gcc/config/rs6000/8540.md
+-cc8a63fb23e95bd165f77f99193198fc gcc/config/rs6000/a2.md
++6eae8bf4ae5936dd0db712c9458f6901 gcc/config/rs6000/7xx.md
++02e47ab90dd56329510ee3801d6d700f gcc/config/rs6000/8540.md
++f27e2df971a7f7e80091bf85b9be16dc gcc/config/rs6000/a2.md
+ 215c8a4ac1298c2f899cb270f784122e gcc/config/rs6000/aix-stdint.h
+ d4d5391a097711b67df3082070de4c3a gcc/config/rs6000/aix.h
+ e580ffd868554681a147b5173478fb59 gcc/config/rs6000/aix43.h
+@@ -3943,12 +3931,12 @@
+ 02a3d453ca7e43f4bf70187e1c3cf346 gcc/config/rs6000/aix61.h
+ 21c1c24d19668403ff77dc915a743342 gcc/config/rs6000/aix64.opt
+ 1088dba38de5967f615c2c010164ec48 gcc/config/rs6000/aix71.h
+-4b64a4bbfc491cdb49ae51bf4dbdbbb8 gcc/config/rs6000/altivec.h
+-890c898bb424f6b9a14e77361e11c737 gcc/config/rs6000/altivec.md
++72b7be964acfdeb0ca6642e9bb019ee4 gcc/config/rs6000/altivec.h
++1ae5cce9f95be1f33759897a0e901575 gcc/config/rs6000/altivec.md
+ ebb5e6bcfc1093c0aff7c41cd9353433 gcc/config/rs6000/biarch64.h
+-eb88cb402ce0ae76bea0e2669d29faf1 gcc/config/rs6000/cell.md
+-ab77897337ed0bcc94d911de0a9b84d9 gcc/config/rs6000/constraints.md
+-74ed46696e6d8336ffbaf386d75e54cf gcc/config/rs6000/crypto.md
++936aede56563f66921091a90d3d1d56a gcc/config/rs6000/cell.md
++2697e3b9700fedaea4ff0e78242d1382 gcc/config/rs6000/constraints.md
++3989f0e14500049f924ab6bf76471a93 gcc/config/rs6000/crypto.md
+ c85b3bacf772d069c8a138ff0cf48400 gcc/config/rs6000/darwin.h
+ cd92ef7ed3430ad83c27c94fc7c97de4 gcc/config/rs6000/darwin.md
+ e8e5a87925f97e07063bc36de5dc3b22 gcc/config/rs6000/darwin.opt
+@@ -3956,14 +3944,14 @@
+ 78939b2279a4d082aea92f53a289d711 gcc/config/rs6000/darwin7.h
+ ac431f1a0b8ae0c72fc7cab9bc9e2f1d gcc/config/rs6000/darwin8.h
+ a77da74ccfb88c7b6bcd77d4a5f98c90 gcc/config/rs6000/default64.h
+-522858d4ee17f4b8129dc2ff6eac0b08 gcc/config/rs6000/dfp.md
++1a96a05c3098cba8dcad9a84f4da9c74 gcc/config/rs6000/dfp.md
+ b9490f963c3648aa2f0de7bc1cd5af58 gcc/config/rs6000/driver-rs6000.c
+-d7a141c5235cb379dfa386c990ea731b gcc/config/rs6000/e300c2c3.md
++d949390c82f3443dbfb82eef160fa0c7 gcc/config/rs6000/e300c2c3.md
+ 85e4c2a561d394919589b92fdf2a6da3 gcc/config/rs6000/e500.h
+ 8bb8b4dc450a6089b1cfca551026bfce gcc/config/rs6000/e500mc.md
+ 3a8a9616dd1a37f5c41ea0eebe2b140b gcc/config/rs6000/e500mc64.md
+ 0474b71c5e8814f8a2c2929068ebd209 gcc/config/rs6000/e5500.md
+-91ac3cc581488d8d5149cbb4bfb5925d gcc/config/rs6000/e6500.md
++fe4ae385f84f18458badf29e377e0771 gcc/config/rs6000/e6500.md
+ a737c12b8f7510a91988a05012db3ccf gcc/config/rs6000/eabi.h
+ cbd3019152cc1036fd011d0059012250 gcc/config/rs6000/eabialtivec.h
+ cb63806e3e70caa314033e967b7d4bb5 gcc/config/rs6000/eabisim.h
+@@ -3973,7 +3961,7 @@
+ 8eabfc237f6f5d69a39b97c2a170287b gcc/config/rs6000/genopt.sh
+ 386c32703bb134082430ae71c03664c9 gcc/config/rs6000/host-darwin.c
+ ff786276df16ab764e024e79f389d1f0 gcc/config/rs6000/host-ppc64-darwin.c
+-e8f836ba652ea98cf75c38a9a51571f2 gcc/config/rs6000/htm.md
++2299a6244b44c4fa0b0180101f4c9284 gcc/config/rs6000/htm.md
+ 4902896bbb0c8507f0cef5391b46f052 gcc/config/rs6000/htmintrin.h
+ f8855608896ff92f191cd0ec0e8debce gcc/config/rs6000/htmxlintrin.h
+ c6a61039cfb5b76277bcccaa262e3ee0 gcc/config/rs6000/linux.h
+@@ -3983,33 +3971,34 @@
+ a0078bcc38f4ed35217a24ccfae5c528 gcc/config/rs6000/linuxspe.h
+ 27fed5a1c278b05b79d11ceb2b575b91 gcc/config/rs6000/lynx.h
+ 0cc3c5f9101501b8253ce3176c3ffce4 gcc/config/rs6000/milli.exp
+-c624579cdc2079804105ce3d1189c52b gcc/config/rs6000/mpc.md
++2fa8dcb8bc43d9ba7fffddb47770b257 gcc/config/rs6000/mpc.md
+ c2fd14dbafe257185d6e8d9378100414 gcc/config/rs6000/netbsd.h
+ dbc5748d385f0a366a69b70e5f4b5200 gcc/config/rs6000/option-defaults.h
+ 41f286ebbc56d4aa7ccf8cab2e90cfc5 gcc/config/rs6000/paired.h
+ 55af659a3619ef1966eece3320f3c9dd gcc/config/rs6000/paired.md
+-02aa07ccdebf9ed3f0df6f5d31a4dace gcc/config/rs6000/power4.md
+-3cb4b79927603a40dcc7f54b0a07948c gcc/config/rs6000/power5.md
+-253d89e0957e9e5492d8dcf15d208fc5 gcc/config/rs6000/power6.md
+-83bc851e7693aeadfdf97ba3f11aec17 gcc/config/rs6000/power7.md
+-9ad7a77314079c9e0cd64370c950c42b gcc/config/rs6000/power8.md
++31242fa4ed8abafeba3b82a860474603 gcc/config/rs6000/power4.md
++44d38db73ba888118ad2e68d58f463c5 gcc/config/rs6000/power5.md
++9c803622bb5146608fe9539f2af34f36 gcc/config/rs6000/power6.md
++392d61b850052a84dca819f18d09ec44 gcc/config/rs6000/power7.md
++d8b143420c8e25c7b2a8df221ae27589 gcc/config/rs6000/power8.md
++4c6843f36ebb8e0c06de737adda165b0 gcc/config/rs6000/power9.md
+ c335f4f65801de1318cd4db8b62934ba gcc/config/rs6000/ppc-asm.h
+ ea4871edf7de554404015404bafd83e6 gcc/config/rs6000/ppc-auxv.h
+ 30884ec5924e409646acd1aa99423fc5 gcc/config/rs6000/ppu_intrinsics.h
+-6d9c1ca23d345218b3077b98e639e07b gcc/config/rs6000/predicates.md
+-a68302ec6a66487c8ecec6e28ef0e043 gcc/config/rs6000/rs6000-builtin.def
+-596338f547ae69967d84ba7f4f847693 gcc/config/rs6000/rs6000-c.c
+-7c301066108088876ee2e09362770be1 gcc/config/rs6000/rs6000-cpus.def
++195cd4f51261ae5a6bab57f4be102730 gcc/config/rs6000/predicates.md
++fed7519f3fb7d3f6e3b9e82dd640d7c0 gcc/config/rs6000/rs6000-builtin.def
++7baaf3b9a76f29c14d1e20e921eef7da gcc/config/rs6000/rs6000-c.c
++3e5ef6c30730e4575563890ec3cfe76b gcc/config/rs6000/rs6000-cpus.def
+ 2f0d36a3bf95d74249364237cf04e29c gcc/config/rs6000/rs6000-linux.c
+ 192ddf2c1b6fd7fe7e53b1acadaee645 gcc/config/rs6000/rs6000-modes.def
+ 14f48bec5cd76d2a5aada931fb1fedf4 gcc/config/rs6000/rs6000-opts.h
+-be801487c27166d61655a5ee6fb17163 gcc/config/rs6000/rs6000-protos.h
++7389795c236e28309f4187cce6e2dc55 gcc/config/rs6000/rs6000-protos.h
+ b43d18bcb08f2293531b3302947868a2 gcc/config/rs6000/rs6000-tables.opt
+-157543f273b999d4aa0589bd9ec62145 gcc/config/rs6000/rs6000.c
+-b3d76f8a9e6c3f285875d109152cac89 gcc/config/rs6000/rs6000.h
+-79d11c1b7f5b67bf5e7dc1b88beb3be9 gcc/config/rs6000/rs6000.md
+-334e5a36e5ba56cf459f5d29dc275a86 gcc/config/rs6000/rs6000.opt
+-bc7c7fd50f8133954bd162f41163a526 gcc/config/rs6000/rs64.md
++71c5cdb7a1b42c30338eb5001a658ae1 gcc/config/rs6000/rs6000.c
++219d2a37391d11dee8e606c70d31fa65 gcc/config/rs6000/rs6000.h
++b555f8e178f9b8bd13235a2c7ed5ac40 gcc/config/rs6000/rs6000.md
++ca447d624d64bde7352a3632cff4e012 gcc/config/rs6000/rs6000.opt
++23eae5c1992970cba9db6c157ab8c4f6 gcc/config/rs6000/rs64.md
+ 089f55bc6e1565ba82f6d496569d3280 gcc/config/rs6000/rtems.h
+ 510ae383bcc5df111af9d4407a82b6cb gcc/config/rs6000/secureplt.h
+ 0377ddd2fcdd6253e75cfe7f6a9aee18 gcc/config/rs6000/si2vmx.h
+@@ -4018,7 +4007,7 @@
+ 4916c7683b7e0a7036c40eb6d7ee92f0 gcc/config/rs6000/spe.md
+ 70e488f99d30586ce36bfe7b9dc08fec gcc/config/rs6000/spu2vmx.h
+ 89082edb09e5818e9e5f9f05685cadcd gcc/config/rs6000/sync.md
+-975824c5c614d1480831eb06f3b18f10 gcc/config/rs6000/sysv4.h
++056da47aa9e7eb07f8dea417fb567401 gcc/config/rs6000/sysv4.h
+ 2913dacd00e26860f7ad46828646ca14 gcc/config/rs6000/sysv4.opt
+ 72d0179bc61a6d4aa963be895a0d6e5b gcc/config/rs6000/sysv4le.h
+ 93056159fe947e9f851f95a932a97bfe gcc/config/rs6000/t-aix43
+@@ -4038,17 +4027,17 @@
+ 7116c0a8cdb50f6a880f3e39b38fbee9 gcc/config/rs6000/t-ppcendian
+ 7f0dbbdf1e014933add4051db875bfae gcc/config/rs6000/t-ppcgas
+ 1b8aba690a39464c4ea9c647d73d6983 gcc/config/rs6000/t-ppcos
+-7389d8d00e632c8845d538dc99e5c6b7 gcc/config/rs6000/t-rs6000
++98cf7ab5ad50cd5fa7d1d38921be79a1 gcc/config/rs6000/t-rs6000
+ ae9fccfa6dbce7c4de5e57cb98ea316e gcc/config/rs6000/t-rtems
+ 3139a8aaf8df8e678d1895cd6e6cdbc5 gcc/config/rs6000/t-spe
+ 0bd38a9da8637b9ca3a43b70bcd7f6ad gcc/config/rs6000/t-vxworks
+ f11925c88524d2fd457bf77944da1302 gcc/config/rs6000/t-vxworksae
+ 3f0601a68de7a0aee8264b538228d943 gcc/config/rs6000/t-vxworksmils
+ bb61df2b42a69a90853a503710200de1 gcc/config/rs6000/t-xilinx
+-90d8139c477dc9d8ff1374f594342cd1 gcc/config/rs6000/titan.md
++cc22792d76d22d8203dc7c3680c1dbc7 gcc/config/rs6000/titan.md
+ 7369115a6bfe8259388f41e912c060f2 gcc/config/rs6000/vec_types.h
+-3895f5086b0451178d2cab3a8edc0df6 gcc/config/rs6000/vector.md
+-64991c6a25d1e8270725d50368b8fb85 gcc/config/rs6000/vsx.md
++ed5c9b710457da108e718e8517f71c08 gcc/config/rs6000/vector.md
++444b4ec5dd2806e425c1e3138284f3d2 gcc/config/rs6000/vsx.md
+ 4d14358837cff46d3efb3a12dfa4fb39 gcc/config/rs6000/vxworks.h
+ 724f6bc5a165006b67c0526f1bd7477f gcc/config/rs6000/vxworksae.h
+ d0482b801e0a94640973282cfb41b1a4 gcc/config/rs6000/vxworksmils.h
+@@ -4059,10 +4048,10 @@
+ 1aff8cb3714b63b6c3367f552dae743f gcc/config/rs6000/x-rs6000
+ e5e773649ecdb110972c35e49c42b3e5 gcc/config/rs6000/xcoff.h
+ 14b84186ff830f20eb02a0e254ead887 gcc/config/rs6000/xfpu.h
+-36a1d4af1d8697adca6a1af98b7b0cf4 gcc/config/rs6000/xfpu.md
++1c69fd8a6a2d3aa89f111d94a29c74a8 gcc/config/rs6000/xfpu.md
+ 750508def567aebb2fcd9b027515ce60 gcc/config/rs6000/xilinx.h
+ 1701cee04ec5d0023ee2f2ceb0ff7490 gcc/config/rs6000/xilinx.opt
+-3735d6fa9e1f7a056f86652bf630d59e gcc/config/rtems.h
++c259e167d92ed9ea65d4529c9ac58029 gcc/config/rtems.h
+ 29973834f5994d1d1eb068d452b4912b gcc/config/rtems.opt
+ 7ade2acf000a30e0e591946c40cc5802 gcc/config/rx/constraints.md
+ e6126d96e89716a341e26fa279f84be1 gcc/config/rx/predicates.md
+@@ -4093,9 +4082,9 @@
+ df9ea5d53147f236d75784dfea931042 gcc/config/s390/s390-modes.def
+ 9fbc56cdaa1a0bfa0e8af1c738f747cb gcc/config/s390/s390-opts.h
+ ec6ce661c7b87984fbda470242973d68 gcc/config/s390/s390-protos.h
+-286c274799f9c837c69299a3d92749cd gcc/config/s390/s390.c
++cf2b018db73bc2242c43e8fd064460b9 gcc/config/s390/s390.c
+ 6128183534b6460c3504e49da918f124 gcc/config/s390/s390.h
+-aef50f68871f4a43a28df1fa615b7353 gcc/config/s390/s390.md
++3d0ed16a636ca7198d07e174a4bb3ec1 gcc/config/s390/s390.md
+ 93ff0c316888e0ae1e6e5fcbb89614ea gcc/config/s390/s390.opt
+ b92144af9dcab9d6a6bd0a619e8bd90a gcc/config/s390/s390intrin.h
+ 7182f5655f81cbe30f04b3209bb50a8c gcc/config/s390/s390x.h
+@@ -4166,32 +4155,33 @@
+ cce52944785c3c1036a7380adda38c22 gcc/config/sparc/constraints.md
+ 4899a6b24fe9d952cbb0a117c5014933 gcc/config/sparc/cypress.md
+ a6f5c02cb556d4484b510b1b080970f1 gcc/config/sparc/default-64.h
+-8861dca695ebec27403ede9cba2e83aa gcc/config/sparc/driver-sparc.c
++999b81b4a3d65c9f3913d9c5ac50116e gcc/config/sparc/driver-sparc.c
+ 24b6ddb0c85a7d35c6bef23e162f238d gcc/config/sparc/freebsd.h
+ e3873b9f7262fe2e5e1c1ff303fd07f1 gcc/config/sparc/hypersparc.md
+ ceb5379ddc5c41b514ec37a1902d2f2e gcc/config/sparc/leon.md
+ bce3eb1a406fa181a3518aeca8a5f851 gcc/config/sparc/linux.h
+-4d0b279be0d03ade9a7a03dea9aab8c6 gcc/config/sparc/linux64.h
++e90fb5dab384ef61b70412869846e81a gcc/config/sparc/linux64.h
+ 44524f5016f24f5db03ad91912a30fa7 gcc/config/sparc/long-double-switch.opt
+ d14affc9d9a7c6d706ac72f92b369f54 gcc/config/sparc/netbsd-elf.h
+ 08f60d645b2128365c08c0f6c6e221ff gcc/config/sparc/niagara.md
+ 16b7243175105a0d257eb4421bedc2ec gcc/config/sparc/niagara2.md
+-e597ae6bcd05bbe47a86aea7463c12ae gcc/config/sparc/niagara4.md
++78dfd78b0f3609e0494bbaf344d70695 gcc/config/sparc/niagara4.md
++60463e86a2bfe089ae54632abf1cd938 gcc/config/sparc/niagara7.md
+ 3f126aec8253ea73daa2fbaafc3f7153 gcc/config/sparc/openbsd1-64.h
+ df546d4092fe20ba80bd5a3954f0bd35 gcc/config/sparc/openbsd64.h
+ fdf6ab88ad0b4e36a3b8ebf25cfdd547 gcc/config/sparc/predicates.md
+ 2042472acbe05e3e6c55253f1b308604 gcc/config/sparc/rtemself.h
+-e105faae60a663602a2c212e0d82be55 gcc/config/sparc/sol2.h
++ea486cef33954ec2c7cd6b2bcd57b5c1 gcc/config/sparc/sol2.h
+ 027897262736bac521955a4e91403e9d gcc/config/sparc/sp-elf.h
+ 16197cb93f1fda192e849bde60b989d3 gcc/config/sparc/sp64-elf.h
+-b16df431afbd3ad37c03599441a6a068 gcc/config/sparc/sparc-c.c
++24821a14bcdbe2e146ed8e020c06d35c gcc/config/sparc/sparc-c.c
+ 6e05fd82c65a1c0b69f52820e4e2c82a gcc/config/sparc/sparc-modes.def
+-e7e72eec1accf85bc1badbb0941af4f6 gcc/config/sparc/sparc-opts.h
++76ec8424fd03e5e3660223b5ca3cf59a gcc/config/sparc/sparc-opts.h
+ 3b12f88afd2307417ea049e4a24a9bb8 gcc/config/sparc/sparc-protos.h
+-9266b115b2f0af3232f05cf0c525c3e3 gcc/config/sparc/sparc.c
+-28bbdfc6758c9c5ab027f2c08ef7a013 gcc/config/sparc/sparc.h
+-1e404c290eca635c799aa01eb4d8d355 gcc/config/sparc/sparc.md
+-48c9d42cb9fd0422c5cf112826aa7ffa gcc/config/sparc/sparc.opt
++c45d5a341822603b1d2e3234df6c4200 gcc/config/sparc/sparc.c
++da3c18895492fa52031c534e5825b3fe gcc/config/sparc/sparc.h
++1f89fb1ea3b02cbe8c12395bdcef59a6 gcc/config/sparc/sparc.md
++18fcbfcaaf4ebb852311426ae9f8571d gcc/config/sparc/sparc.opt
+ 9cb87fbe1c20a8991a89a8c2215a7c07 gcc/config/sparc/sparclet.md
+ 8fa2a5576a24f640750e744d90353334 gcc/config/sparc/supersparc.md
+ 12aaadc74ad00986b0b584b5670f83a2 gcc/config/sparc/sync.md
+@@ -4210,7 +4200,7 @@
+ 410423780343a1431e1c0dc5bf60dba8 gcc/config/sparc/tso.h
+ b6612a314463771600938ccbd967e4c1 gcc/config/sparc/ultra1_2.md
+ 664dc34c9e8a2da763a8d607cdd40c28 gcc/config/sparc/ultra3.md
+-172bd3dd1afbcc416192c4348f242e3b gcc/config/sparc/visintrin.h
++6dd43af528bb6984a85f9b73d6cf430b gcc/config/sparc/visintrin.h
+ bf27cffd7002ed10c819216944e1fc8d gcc/config/sparc/vxworks.h
+ 9b2ddc345afcea4f415dd0c8bc2d2ed3 gcc/config/sparc/x-sparc
+ ec6f83b17b1625fed43638a36dc76ae5 gcc/config/spu/constraints.md
+@@ -4327,10 +4317,10 @@
+ 905539c10b01b14270085b2ff8a8e401 gcc/config/visium/t-visium
+ 5970b7b34f57ccb9e61f7e6ca0b0990b gcc/config/visium/visium-modes.def
+ bcbe3f2a16b7c074ac5b3f63ddaa9fe2 gcc/config/visium/visium-opts.h
+-8b4eaf75ea504e522ec4e6f7e5d0a800 gcc/config/visium/visium-protos.h
+-4a68104ef84d725cd7c9b18678dc889a gcc/config/visium/visium.c
++f179b316529c1e1aef8dd4a708a79edf gcc/config/visium/visium-protos.h
++f211ad99efeaa709f4eed4515950528d gcc/config/visium/visium.c
+ 13491427224304bc418ddad214bd2666 gcc/config/visium/visium.h
+-5301760e9c5059d01ad49e4a4d27b512 gcc/config/visium/visium.md
++49f063ffb6ecc0eb5d9533b269661a66 gcc/config/visium/visium.md
+ 809a10680b60475e5abe66769cac59e5 gcc/config/visium/visium.opt
+ 883b3e153a9672ad32f1c8cb18cbea9d gcc/config/vms/make-crtlmap.awk
+ 9b09f55f7820a1189c8b3dd933aca2ea gcc/config/vms/t-vms
+@@ -4374,8 +4364,8 @@
+ bb1965ec2a1e0ce5e60d527c23ca610b gcc/config/xtensa/xtensa.h
+ d3ed3f2851a6ee9f647a0fe488ad1639 gcc/config/xtensa/xtensa.md
+ 6bc76a8cf807646d45ffd30b5ca7d2b2 gcc/config/xtensa/xtensa.opt
+-a46aba5ea3ed52179bc15d322a73bab7 gcc/configure
+-75eefe68ea80541c25dd77c91182eefa gcc/configure.ac
++ebf9ee0b037a06c3e8bd155c4eedc1eb gcc/configure
++19074c8f1663edb2fd70e9230c4b2bfd gcc/configure.ac
+ 0ec5b41e50536d76b12ce8977926b0df gcc/context.c
+ 26da2cb861339f31f80bd959e0d59598 gcc/context.h
+ cccacb2ac29511a68f30d50c4f2a9655 gcc/convert.c
+@@ -4383,7 +4373,7 @@
+ d80857164629763d35964508054ddcda gcc/coretypes.h
+ c1d9055612e35b11f4c86de664f8e1a7 gcc/coverage.c
+ 653580fc0a70e3ade04c5b00362b0daa gcc/coverage.h
+-588dd1bd87a8445d4a2ce8e3c9bf6dc5 gcc/cp/ChangeLog
++07a267d95fe6b59a9cdf0b9c83620aa5 gcc/cp/ChangeLog
+ d271e3663538ba1f3281cab3838e92cd gcc/cp/ChangeLog-1993
+ f5a44adbc05521162350ca409d1d95ce gcc/cp/ChangeLog-1994
+ ac55db48d964cb5469ff03c1cd3ee04d gcc/cp/ChangeLog-1995
+@@ -4411,57 +4401,57 @@
+ 9aa3cd9f75c785de9f51446e3f295515 gcc/cp/ChangeLog.tree-ssa
+ 40c026d4c25f7d1b05e9209c1db5fce9 gcc/cp/Make-lang.in
+ 9bc6241e715c32f1a0f6e1b8028cb853 gcc/cp/NEWS
+-659647be28973c09cf89af9df4953b6d gcc/cp/call.c
++bd82179542d443d90a79880b14342022 gcc/cp/call.c
+ afb9bd2c59a27b9a4e01674e6ef4c2d2 gcc/cp/cfns.gperf
+ 4dc84f7aecf8adaa3133cffb6b7a9ca6 gcc/cp/cfns.h
+ 650800f32b775564604880eaff2b3561 gcc/cp/class.c
+ 739c569e48a7b41b606f425cbc9123d2 gcc/cp/config-lang.in
+-fa7d60199ae182f298f4f68808ace2c0 gcc/cp/constexpr.c
+-98f8a059d857e8d87b37bf2bfbdbd4cf gcc/cp/constraint.cc
++fb0b6d2fe3954f87dc683f9bdc764d67 gcc/cp/constexpr.c
++c683759a418cb72958ad21fa84df0a0e gcc/cp/constraint.cc
+ 3ba51b5d6be105c2076c7c57590c4ef3 gcc/cp/cp-array-notation.c
+ 186d27a5d5d478e09c882e0110153c3e gcc/cp/cp-cilkplus.c
+-3691807d913946b1b8f0532b509b32df gcc/cp/cp-gimplify.c
++0baa9bffcd0cdbf12af9016cc861530a gcc/cp/cp-gimplify.c
+ bb99af59da6436bd29f57f3f050c526f gcc/cp/cp-lang.c
+ f3d5c0a13bc26cb7c946210741aa3848 gcc/cp/cp-objcp-common.c
+ f21d1769c40e5fb7e0b4bb740c877732 gcc/cp/cp-objcp-common.h
+-3c6dca654babce1444b010ecc13ce3a4 gcc/cp/cp-tree.def
+-65470cc5483576513deae6ce5062ffac gcc/cp/cp-tree.h
++d21831b373779814d66d82151827a70a gcc/cp/cp-tree.def
++7bb799426f6eedb92c6eca4182368c66 gcc/cp/cp-tree.h
+ 1369f5ca78bd37e84d0985faff35f429 gcc/cp/cp-ubsan.c
+ 9f77a7a0c8d02ceef78c0f1cc355cca6 gcc/cp/cvt.c
+-788228fb10c82f2c976b6a846bbabdb0 gcc/cp/cxx-pretty-print.c
++4fb925f8c277dfd445a3480f29c7ab2a gcc/cp/cxx-pretty-print.c
+ eb1c2da742513f6f21d3de7d3d531d78 gcc/cp/cxx-pretty-print.h
+-f1c55a4f73e8b4520a611dcc1b78359e gcc/cp/decl.c
++678407e0e9072d19a0290980484e5bdb gcc/cp/decl.c
+ f43394b8806c96193cee8cfd4a55336b gcc/cp/decl.h
+-212843cd9766a8b772323ee342b0a165 gcc/cp/decl2.c
++fdc369a0b616bd3345804d936c8247ec gcc/cp/decl2.c
+ 7ae2c1642094de5138fbb999f0ba1dd7 gcc/cp/dump.c
+-f0f9894e1405b5c87b3b4ce0cc7e52a0 gcc/cp/error.c
++aa416944f27c2d2b0973de74aa86cf45 gcc/cp/error.c
+ 55f92fe617bd4f1e45207eb0c41885fa gcc/cp/except.c
+ e68580c70d9bfd1c150485b9fca85280 gcc/cp/expr.c
+ 7fd276d735538ed700d62bbcceed734c gcc/cp/friend.c
+ 953a6283c57f96c8e1146ea75f4e288b gcc/cp/g++spec.c
+-1442133c15bbf554bb5469f74b8e5f65 gcc/cp/init.c
+-b9700c4afbc31914aa5aee27ae6f88c0 gcc/cp/lambda.c
++4bba39f4a689ecbc74bf127fd4263f02 gcc/cp/init.c
++3d2180f996851dedb628a5e874ec66a6 gcc/cp/lambda.c
+ dd9fc96e1760180eadcc31d884bd5258 gcc/cp/lang-specs.h
+ e978132617f114d81875d7e4a46eb0e9 gcc/cp/lex.c
+-d87143518404a056fce1d858724c78d4 gcc/cp/logic.cc
+-6334c1ba17789914f5b23f4a1a3f69d2 gcc/cp/mangle.c
+-c5a1c61dd0126d95c56b54d9296a34e6 gcc/cp/method.c
+-f81d03ee229696edc6da94e176422028 gcc/cp/name-lookup.c
+-c30a346c475398a513900a6416b9a66f gcc/cp/name-lookup.h
+-deb968fc50478455c08d96ee047fe9dd gcc/cp/operators.def
++bd372ca4699c268d003b88bba0920d87 gcc/cp/logic.cc
++baa9e5359a2757db5e2b361df4a146c5 gcc/cp/mangle.c
++326b441b0bc0067d256b4b72cd6b73a0 gcc/cp/method.c
++447088dbb1483cd82cfd32ddd03aaeb5 gcc/cp/name-lookup.c
++70b3b6f7199163918e5d2a0c1452b772 gcc/cp/name-lookup.h
++764366090f3163fb5ccd85cb19a94cff gcc/cp/operators.def
+ 1cad434894b0845fc0a6f03de2d39180 gcc/cp/optimize.c
+-511ff1c2f521689cce1705bdde1fdb9b gcc/cp/parser.c
++d361550a9a144223bd187d146b434eeb gcc/cp/parser.c
+ b5da26fff61760a30cbda1f01a4c4808 gcc/cp/parser.h
+-2efcaf76971f5ba20b51e40b1af73f3a gcc/cp/pt.c
+-d27b06455de42b40c3aa59809ce8e5d0 gcc/cp/ptree.c
++b90b86ba7f3a492099acfd67ab97cbff gcc/cp/pt.c
++e61259963d803da8e625c96134d4f5a6 gcc/cp/ptree.c
+ f06807decf6ff4b02873679e35ef5865 gcc/cp/repo.c
+ fc320188ae1e308c62b750b92ce39885 gcc/cp/rtti.c
+-9a7cb8e4675ba96266c69dde701fa938 gcc/cp/search.c
+-166191d8843b08d730837b3af2dce517 gcc/cp/semantics.c
+-2f7b6936624a3d96e86609871f84abc6 gcc/cp/tree.c
++f0b16ecd9783b80773d4b1b34c7cca79 gcc/cp/search.c
++63057d814cda7d68459be27649fd4772 gcc/cp/semantics.c
++79d814f96502c3b714d31e97796e9d17 gcc/cp/tree.c
+ 4ac4dcdc19063fd7ea7055b2064b4d37 gcc/cp/type-utils.h
+-ff2ed2489e1b5c86c141aa685a39105f gcc/cp/typeck.c
+-1f202024e77b011bfd17bef5ce12de4e gcc/cp/typeck2.c
++c8be854d952188928c591e6f91ccea64 gcc/cp/typeck.c
++0270a989f06efe3bd572525956fe0cb4 gcc/cp/typeck2.c
+ 8b2699a100775446f1d3379bfb10c109 gcc/cp/vtable-class-hierarchy.c
+ bd835b9ee78a94f4ae3f8adee63f9a51 gcc/cppbuiltin.c
+ a8b7256c689701d5c714e06099ce8503 gcc/cppbuiltin.h
+@@ -4489,7 +4479,7 @@
+ d91a67e4d82e6bdeaf9fffd22877f0c6 gcc/debug.h
+ a2f5dd98d48b024b1d8e92d344a4b25c gcc/defaults.h
+ 1668c0a4a49475062d63b5e7e79dc0bd gcc/df-core.c
+-d9d3dfc948e383e99d89b9bf94d0270d gcc/df-problems.c
++b7719ad67f0aeddd22383a71f99829dc gcc/df-problems.c
+ 8b863d46f0db1d704fb337492860e696 gcc/df-scan.c
+ 2c97a89f9d8933b777cbcc4c48cf4a89 gcc/df.h
+ cbe294220fc2c2e1131c4aa645acf01e gcc/dfp.c
+@@ -4501,7 +4491,6 @@
+ 6bb8763d2cd82acf9315292a011edb6a gcc/diagnostic.c
+ cc2592797ca4befcbb1163c1a7a00f80 gcc/diagnostic.def
+ b5b5c842e04bed80ee2680523e412d59 gcc/diagnostic.h
+-5fc479a26716b39889254afe283c3601 gcc/doc/aot-compile.1
+ 4b0e646c5de4431c5d6bbfe40f0cd073 gcc/doc/avr-mmcu.texi
+ 67be61d4feeb4a05b9c19af733aa05ae gcc/doc/bugreport.texi
+ 0615182a653a9840fd7ae8745219a5be gcc/doc/cfg.texi
+@@ -4511,40 +4500,20 @@
+ 240a91046efda88ae96dd3386f6e431c gcc/doc/configterms.texi
+ de72fb12d4dca40f7a8d5b4429df7991 gcc/doc/contrib.texi
+ c498cc82ef6af94189c770012a2a18e9 gcc/doc/contribute.texi
+-cef4aa06bdc96ae8433d4ef6eb0d9e17 gcc/doc/cpp.1
+-e33796d8f10e03971c17c727c0ed98ac gcc/doc/cpp.info
+ 0f2a72efa57326c8f726620c490228a1 gcc/doc/cpp.texi
+ c558a3f6cb1b068e5bdc0406d2ed7217 gcc/doc/cppenv.texi
+-ae059b34b3ba2259010d90020291b4f1 gcc/doc/cppinternals.info
+ 5e146b7ee23d2aecc854dcc8ab494552 gcc/doc/cppinternals.texi
+ 594e4c25acf69b6587158d05dd033b24 gcc/doc/cppopts.texi
+-b932543840194c4e96437fd2ceecac4b gcc/doc/extend.texi
++7dad3edc6db5ea68a12718e08cc14d81 gcc/doc/extend.texi
+ 95f852d1ef912c794a713c43da587f55 gcc/doc/fragments.texi
+ 6f0ea8cb29b8222c190965f0c877a2fa gcc/doc/frontends.texi
+-d9402bb24605de2195da4ff24876e5a4 gcc/doc/fsf-funding.7
+-0991a56b1679183382c28bcbb676992f gcc/doc/g++.1
+-173801a593681cce80cead8f82d17bb5 gcc/doc/gc-analyze.1
+-0991a56b1679183382c28bcbb676992f gcc/doc/gcc.1
+-a59de0b25ac96403053a8406e13e0413 gcc/doc/gcc.info
+ 88763fd4a2ca7b1f84637c92258f12c3 gcc/doc/gcc.texi
+-6aeca8a702bc8b889395d5d5cff7e7ea gcc/doc/gccinstall.info
+-c57b5c8adcbc824265f2af1eac66db5f gcc/doc/gccint.info
+ a1072c7fe384b26d4053192ee158b54a gcc/doc/gccint.texi
+-2e55b10f3b9f54aea645919f7503c4d0 gcc/doc/gcj-dbtool.1
+-c27b0341270205e4019a6ea6664bac87 gcc/doc/gcj.1
+-61cc329dd6acc1b861a08867a5436ef9 gcc/doc/gcj.info
+-50ffacc2debe4799d45cb09ad3f79cf4 gcc/doc/gcov-tool.1
+ 600e5ec8739c8b59da149866fceeb218 gcc/doc/gcov-tool.texi
+-0078d98bb3433a8e24cba1b419527449 gcc/doc/gcov.1
+ 72bbc01b16e62773dff9dfa7a60f2e01 gcc/doc/gcov.texi
+ ccdbce7ea9c6edf013744bebd58a7236 gcc/doc/generic.texi
+-7f263eee8bc8903e68cc203013fa1f53 gcc/doc/gfdl.7
+-32e298859d6afe21751a0a14eb789580 gcc/doc/gfortran.1
+-5599bfd4bc2ba8a372d0ecbe55f61166 gcc/doc/gij.1
+ 5d1606771c73c06954506e0770209ad6 gcc/doc/gimple.texi
+ 290370669f02bef1502ada9273e5261f gcc/doc/gnu.texi
+-d61436fe79b7893fb9c4c4e4f3e30f87 gcc/doc/gpl.7
+-cdd2c1f4af54045dde46712d1a27a02a gcc/doc/grmic.1
+ 07064b30149463ca48cad1274d117022 gcc/doc/gty.texi
+ ffbbf9909dbcbd3ce420b273106fe852 gcc/doc/headerdirs.texi
+ 5ddad8e0920359df62f566823c25331e gcc/doc/hostconfig.texi
+@@ -4556,26 +4525,23 @@
+ 5f5adc2c6c4ebdcf03cc0125250f5995 gcc/doc/include/gpl_v3.texi
+ 73819b3930a3d4be5d6234070d02386a gcc/doc/include/texinfo.tex
+ a57e0b900d0ae5846091a1e5f722fcf7 gcc/doc/install-old.texi
+-908618ce1dc5bb94c6d123dd8d74971f gcc/doc/install.texi
++b0727164f0afe4cdc4f1d83d19d4029d gcc/doc/install.texi
+ 9e425a943a46a878a1f546f928d14b04 gcc/doc/install.texi2html
+ a869466cbfcd212e8988279541bdda16 gcc/doc/interface.texi
+-9370b86f1acf47dd44addb607f8a18fa gcc/doc/invoke.texi
+-157e4d0432e64fcdedb1c96345c820bb gcc/doc/jcf-dump.1
+-e63f6f4d2f72b8b7a2b1ec6bdf7db68d gcc/doc/jv-convert.1
++8acd73b8868d165bb592a2448c7f9df7 gcc/doc/invoke.texi
+ a0e7c077817653eddca3b287b2ec1499 gcc/doc/languages.texi
+ ab4011897f2095293d3a4d9443678fb5 gcc/doc/libgcc.texi
+ b0981441c4f9daaa09818d68a36bd67f gcc/doc/loop.texi
+ fc3fd4aafdd4ab47930dcb216ffe03cc gcc/doc/lto.texi
+ 5c2acf2b3a4a6b50ab9b1544cc49e81f gcc/doc/makefile.texi
+ ab9503a1420248f03274f60100f0648a gcc/doc/match-and-simplify.texi
+-c94a6e10ecd4c7f73a44d5488d883968 gcc/doc/md.texi
++27523cb487a4388cb994819a94202ec0 gcc/doc/md.texi
+ 1f5569ca70207eb8ded92ebefd130c2e gcc/doc/objc.texi
+ 83bbf74c59b8849c2b8d083a134672c7 gcc/doc/optinfo.texi
+ e2a974acfc3260f2407c7fe05a990bce gcc/doc/options.texi
+ 6cd361bc13e8ff0fd0523b24175f2317 gcc/doc/passes.texi
+ a989acbeb85b23b1813e7e65a54c288f gcc/doc/plugins.texi
+ 6f4f5f396ee46b12e48520f7305e57d9 gcc/doc/portability.texi
+-03b5d223de456bb73f15d0b1a5a84f63 gcc/doc/rebuild-gcj-db.1
+ bb856e2cc8413005478956f3edee2c25 gcc/doc/rtl.texi
+ 29e91cae40a54cd373834ec123131f3d gcc/doc/service.texi
+ 43460cd9078a9e21d9ac0d9315448c43 gcc/doc/sourcebuild.texi
+@@ -4598,7 +4564,7 @@
+ 3f5963da7e097503d222ddfc4cdf7f81 gcc/dwarf2asm.c
+ 73944fce2a805f3b1672e5ed81f76558 gcc/dwarf2asm.h
+ 8b34c3660aa997b685d65ad9a84e597b gcc/dwarf2cfi.c
+-51d0612220d98685eda04b28b7ea03da gcc/dwarf2out.c
++f7421d7c819ea7001d975537283f1a8c gcc/dwarf2out.c
+ f2cf5c1bba29ec5e6a5fe0e97d33704b gcc/dwarf2out.h
+ 07467e53d8d2dd27f0b59fe696a8fcdf gcc/emit-rtl.c
+ abbd65c7d3f556b7463e8840d7f9d930 gcc/emit-rtl.h
+@@ -4625,9 +4591,9 @@
+ 9666a2458f11468dd9979a7cfca842e3 gcc/flags.h
+ b34c1b95a54e16d433363b08e57e7f85 gcc/fold-const-call.c
+ f4d19b0528d646f769792430919be6ff gcc/fold-const-call.h
+-1bf1b7a47740199e5e017d0f600ea220 gcc/fold-const.c
++ab9e31d4b5b605eaefc60186362e2cc6 gcc/fold-const.c
+ b6b5bb4a4f17604d5bcfb47ecba0768c gcc/fold-const.h
+-ed25f9d2614579b109469f8baa000ba2 gcc/fortran/ChangeLog
++b725b15824f1c7b81c7c09cd56e1047e gcc/fortran/ChangeLog
+ 3330102ad3a0217cba963be6b5eefd58 gcc/fortran/ChangeLog-2002
+ d000ab985b1eeb1ad5749f98b8fef99f gcc/fortran/ChangeLog-2003
+ bf42f94f0c51dcc7d8051cc7fda1efdc gcc/fortran/ChangeLog-2004
+@@ -4648,8 +4614,8 @@
+ 7c9d0f5b639be38a283363657ac1f70c gcc/fortran/arith.h
+ 47059c016e7595b3af1c42922178dc19 gcc/fortran/array.c
+ c9fae371f8d0a027b1391ff1d82faaa8 gcc/fortran/bbt.c
+-f59852c5908a5588db5020c4a01cbee9 gcc/fortran/check.c
+-f7730bc6ae7c77ead5b22c3f2b5461a3 gcc/fortran/class.c
++b82a728d2bb98adde289da10985ecbf6 gcc/fortran/check.c
++a54bd3b33cbf5c815eca096b74430780 gcc/fortran/class.c
+ 4819f6163cdda697542442ead8d1edb9 gcc/fortran/config-lang.in
+ 1564600ca4ee09dae677a32e9632817c gcc/fortran/constructor.c
+ 03ded9e724f957a8caca8c58de189bf9 gcc/fortran/constructor.h
+@@ -4658,71 +4624,70 @@
+ 83041f3879c600754744a8da84761bc9 gcc/fortran/cpp.h
+ 112c4ba412ed2704834031ec9a0838fa gcc/fortran/data.c
+ 167ea51b39af01ee143176fe03d80fb1 gcc/fortran/data.h
+-3d4d10f9c3e0c5d35981b319a48df113 gcc/fortran/decl.c
++041660eff35c68c150d0c59550bcdc63 gcc/fortran/decl.c
+ 76e1e7c9f910f76e4134669998e6f5ac gcc/fortran/dependency.c
+ 272c4deffabcf4caf71d639c1c58c42d gcc/fortran/dependency.h
+-56d1d5b261cad142e3fc2bcfa6a69537 gcc/fortran/dump-parse-tree.c
++749e2d991f54b00758f19992599df58f gcc/fortran/dump-parse-tree.c
+ 726b63587675a95a5baa3c5ecd44fdea gcc/fortran/error.c
+-53ea5a6a4cfd9e58dc9d21a5fdf3a66b gcc/fortran/expr.c
+-03994a1d9a0e1e568a7e80de80cadd76 gcc/fortran/f95-lang.c
+-5d5cd20adfebef574904cf848b554c25 gcc/fortran/frontend-passes.c
++91f1586393e9f6eb09a1561d84979855 gcc/fortran/expr.c
++8183028b3162dfef1b367f187a615b42 gcc/fortran/f95-lang.c
++91fd2dbe4eb9796193093e1bcaa31c35 gcc/fortran/frontend-passes.c
+ 9295becaf3bc8598cfdf49e3a4dd9f9b gcc/fortran/gfc-diagnostic.def
+ 23d6c9cd5c12c7f2aca8fd69d8420b43 gcc/fortran/gfc-internals.texi
+-a91b46a5fa5e96eb13e61cc2659add8a gcc/fortran/gfortran.h
+-69a791c44c97de4c0fa19fc541a917b3 gcc/fortran/gfortran.info
+-5cf4acb87001e9c73595e36b73c568b8 gcc/fortran/gfortran.texi
++d27235635f3a8da5058b24e0f055bf7d gcc/fortran/gfortran.h
++80c16dc56896ccc10c0dc114ac976580 gcc/fortran/gfortran.texi
+ f3790a90748e52fe5ebfcdc7a009181c gcc/fortran/gfortranspec.c
+-636f2f2ff53625bc7cbe85f8bcdddec7 gcc/fortran/interface.c
++6cde23691b96f6c87e0d76a0dcd7e1c5 gcc/fortran/interface.c
+ 5ca2460ab8e955aa2f34d6add206ff50 gcc/fortran/intrinsic.c
+ abc87572b30804f606b83e64ad5d40b1 gcc/fortran/intrinsic.h
+ 142af973fab400802b42296914efd857 gcc/fortran/intrinsic.texi
+-8b7f5aaf3c22e50130731d0800d89704 gcc/fortran/invoke.texi
+-8acca318648ff2c56c871a498daca0e2 gcc/fortran/io.c
++e8e86258dcee5ce75ba45253468ca0db gcc/fortran/invoke.texi
++df84ac32a26404cf85547111270da776 gcc/fortran/io.c
+ 16ad8502e6ce930b9b973c52995c76cb gcc/fortran/ioparm.def
+ 459cab99c8502733fbd738cabfbdd329 gcc/fortran/iresolve.c
+ c0cd4b25b09215a792a381b8685eaabb gcc/fortran/iso-c-binding.def
+ 5ca7449ebd20d33390a2d51e103db236 gcc/fortran/iso-fortran-env.def
+ 278f6140c8d0ffbc2aa9d5f5fe6915f5 gcc/fortran/lang-specs.h
+-e3f67bf5957e58cc1a3b62ea7bfcd9b1 gcc/fortran/lang.opt
+-911edc7f24a9b8ac6bf223d3fcd525cc gcc/fortran/libgfortran.h
+-25ef827d548f8cb705a38ba62f6db89c gcc/fortran/match.c
+-7b8b9983bd8ed1ce9c04851260d8eb27 gcc/fortran/match.h
++c3e9aefddeb997bc391f60d52a473432 gcc/fortran/lang.opt
++c1444c8a9c2ed90afc8ea627a0d94f85 gcc/fortran/libgfortran.h
++cec7003f1a53e551725030fefc65eae1 gcc/fortran/match.c
++65f0f415082a41f7976f30657958fc69 gcc/fortran/match.h
+ 8cd46cabc2dfb1a7496801a089b86445 gcc/fortran/matchexp.c
+ e91ec831c84ed9fa96a1533122ba5461 gcc/fortran/mathbuiltins.def
+-4a5bd735a771c8b0245b0bf5c972216a gcc/fortran/misc.c
+-100ade2e21fec64ad80d084582a5f622 gcc/fortran/module.c
+-5b1a6971820f53e62c69d0455d6d93b4 gcc/fortran/openmp.c
+-32b64c520ae2d457708ccafb56bdb398 gcc/fortran/options.c
+-e4982905a015e74a947f5cba2fd5bf8e gcc/fortran/parse.c
+-5163fc3c6029dd5a8197395b4377afa0 gcc/fortran/parse.h
+-061decb36333beede21dd5b1e6397fe8 gcc/fortran/primary.c
+-5905d4d8099abc01becd40e015f04536 gcc/fortran/resolve.c
+-9ed23a8532184ec8065a2896d8638c3c gcc/fortran/scanner.c
++0b73aa1351022bc9b69b35d237f97d12 gcc/fortran/misc.c
++90de8ceb7bf48f35b7e7bc456635ccb5 gcc/fortran/module.c
++e023aea3b853e2aac54c491b0c7dceaa gcc/fortran/openmp.c
++f8b10b2e5c40bc25b4d9eef7295880fc gcc/fortran/options.c
++025d3494f9ed075d99b64b4a7781543b gcc/fortran/parse.c
++043cf75f229c25d3de2bb79cc984c69d gcc/fortran/parse.h
++4e0e2fd36510d98c289456edbed2c292 gcc/fortran/primary.c
++be434b3f3d88d0010cc278c8d17d84f6 gcc/fortran/resolve.c
++99540dc62dd0f048881facab0517a129 gcc/fortran/scanner.c
+ 075cca4c5736634c587f4ed50ddc9f93 gcc/fortran/scanner.h
+ 4b5ab4f68e70934e8adea730a3fa4149 gcc/fortran/simplify.c
+ 75d50e5ade35f92e65fab4fe0b20630b gcc/fortran/st.c
+-80b966958d6948acbf1c4c33cbe28c3b gcc/fortran/symbol.c
++f8bbffd124aabc78dbead99719f3d071 gcc/fortran/symbol.c
+ 186ec08e98303bc7e25afdb9f5e9aab9 gcc/fortran/target-memory.c
+ 2e5ed3113ab460b7be0e63a724f9f45d gcc/fortran/target-memory.h
+-0295dbb04ca0ac845ba36122f250b6e6 gcc/fortran/trans-array.c
++adab4b79e93efc39a98d2bde342814f8 gcc/fortran/trans-array.c
+ 4e46ac05c6b8e884925b4b58c7d78a30 gcc/fortran/trans-array.h
+ e9814dc5252693185f3e60d55d55a701 gcc/fortran/trans-common.c
+ 7ca10244eca4229e1c832b3c393d9a24 gcc/fortran/trans-const.c
+ d23a0f8bcd86907559306d74723ffdbd gcc/fortran/trans-const.h
+-9ed6a0a514291d5e841dd6379125ab8e gcc/fortran/trans-decl.c
+-341c6bcf2a7d37d50cb6d5c0ed1affb6 gcc/fortran/trans-expr.c
++36a4681903f12b16f44566186a2691b9 gcc/fortran/trans-decl.c
++a146a0181d77d0294e107bf0c9ce93f6 gcc/fortran/trans-expr.c
+ 55c2dd391599f5dc06e34c6058f48ee4 gcc/fortran/trans-intrinsic.c
+-6388c76555cc1e06e93cbe1e40796c0f gcc/fortran/trans-io.c
+-109c58b7d897545dbe960eef88f09a06 gcc/fortran/trans-openmp.c
+-12c15965589066ffdc046103e74eb21e gcc/fortran/trans-stmt.c
++988afa7187f8648d73cbbdd53cf6155b gcc/fortran/trans-io.c
++2f638266866f5af39a561ef341e82662 gcc/fortran/trans-openmp.c
++368d4cd52e8634e9fc5c1072a5640e29 gcc/fortran/trans-stmt.c
+ bd26fd364f82b04b35ca797f1500c5cd gcc/fortran/trans-stmt.h
+-2dc8f56209eae7fbe3d3ad38d2c6fca0 gcc/fortran/trans-types.c
++3a0a015557497b74675a5808c440f290 gcc/fortran/trans-types.c
+ 82b8673b874f75d8200f4128222beeee gcc/fortran/trans-types.h
+ adca0f1898c7b04c8e1d9aee387964bd gcc/fortran/trans.c
+ 584e7bad1d3257b528944c0a88ac18e9 gcc/fortran/trans.h
+ ce4ba327ea19d94b982917bf5b2884d4 gcc/fortran/types.def
+ e02967179fdfb529c8aff94baaf469c2 gcc/fp-test.c
+-59bd42fe759500cea34d37618a023b2e gcc/function.c
++b61f1a62642aad6032bd3875e55d56ac gcc/function.c
+ 047cfc91e18845f3b5cf442dbbdd1ee7 gcc/function.h
+ 497184e6dc781c16b3012d224ab58dd0 gcc/fwprop.c
+ 51d4643fae226ae5cb6c726118db12a3 gcc/gcc-ar.c
+@@ -4731,7 +4696,7 @@
+ 22091c79c390a71cf211f90328383954 gcc/gcc-rich-location.c
+ 6ab0670ac8edcc1a6f5cd76e7e47a982 gcc/gcc-rich-location.h
+ 3ec648b31caf0bcc6b2062384510367b gcc/gcc-symtab.h
+-c8beb6d15ada1f869e8a126ba1fe0944 gcc/gcc.c
++1c6a4afc775cce3b78a2d8cedde32118 gcc/gcc.c
+ 8a5a93ab3252c5ded6be74e451700891 gcc/gcc.h
+ 1bf3695cc620fbe4091e454d41be48a5 gcc/gcov-counter.def
+ 46c61075acf42b3a7891409b607f0d19 gcc/gcov-dump.c
+@@ -4766,7 +4731,6 @@
+ 25b1b08c7f2e15a61f67137a395f2be5 gcc/genextract.c
+ 282f3c7433a024d985ddccc10c82d417 gcc/genflags.c
+ d44b194500c23b5c542dbac2c46abcec gcc/gengenrtl.c
+-48ade094be628d6e2f9bf4c0255ab482 gcc/gengtype-lex.c
+ 5a1368b972210328f48b0ea87a7191c1 gcc/gengtype-lex.l
+ ff52666a6b0aebb48f2a4f746fe39b50 gcc/gengtype-parse.c
+ 0151a4b7715cf1cb836ee33cf7bfdf27 gcc/gengtype-state.c
+@@ -4776,7 +4740,7 @@
+ 3be5935abab096a672b81c80b559ef1b gcc/genmatch.c
+ 07b0962a5b0ac2a5f29d44d710ce1ea7 gcc/genmddeps.c
+ 43130364faec8aac159d938938a22fad gcc/genmddump.c
+-7ecbd5f6591a89cdfd2fa1fff7b6db01 gcc/genmodes.c
++7c6aaaace1e7de1494b16ba3c1abbdb0 gcc/genmodes.c
+ ed5f5653c43e59c6b9281e0950f9666d gcc/genmultilib
+ 5dc9ce1d95f7efc01f7131e05df3e506 gcc/genopinit.c
+ 6b491dad9092e779224522d123ead72d gcc/genoutput.c
+@@ -4795,7 +4759,7 @@
+ 18fb4705ad51bdf06734fbcfc8e39d64 gcc/gimple-builder.h
+ f4acee1cf4c45a5b6db4d0ce9806d3cd gcc/gimple-expr.c
+ c17954a852b3ab19a3008cca3b24c128 gcc/gimple-expr.h
+-b0cdbb6b0843346f1808c16e699dcbee gcc/gimple-fold.c
++a86905e31e7631aeec47b8745ae228f1 gcc/gimple-fold.c
+ 8951c8587158bdc60d4e7d612c6f838c gcc/gimple-fold.h
+ a14e519ebabb942d1e8a48a4403acab5 gcc/gimple-iterator.c
+ efd0e45c5f633c150550050337d54cd2 gcc/gimple-iterator.h
+@@ -4818,12 +4782,12 @@
+ 8c571fcc3b1ac0c3989e3a4973246484 gcc/gimple-streamer.h
+ 5b4269de0e90ff1a0e228f16c36acf15 gcc/gimple-walk.c
+ ad1356d1aee1bfaba3647e9dd12fb0bc gcc/gimple-walk.h
+-e38c521db81137fc28162233d6a5c618 gcc/gimple.c
++b174a67cf43b8c8919274680e0b3ed21 gcc/gimple.c
+ 65f6f08852f115424e8495c343dcba61 gcc/gimple.def
+ 641cc4b975ba19a5b0e628733901c0cd gcc/gimple.h
+ e679c1b4ca7b2361262d0c6fa84805d2 gcc/gimplify-me.c
+ 16af853ca2f3e873e723eb5ff29a8168 gcc/gimplify-me.h
+-965c6bde778d881723e3447c823a254f gcc/gimplify.c
++c685b720121fa09a6b261d5e5056561b gcc/gimplify.c
+ 89047a7045c4653b6016516742695593 gcc/gimplify.h
+ f8d3ba18b33f417a9767d330d93c0783 gcc/ginclude/float.h
+ 619900a9f2191899ea818da9819f1182 gcc/ginclude/iso646.h
+@@ -4901,10 +4865,10 @@
+ 02e7e8c97cb2d8864b2f8a3135ed0011 gcc/graphds.c
+ 43af169612c4e4d04e00673de385a56b gcc/graphds.h
+ 800359328b63c4c5c0ef9d59bad00fca gcc/graphite-dependences.c
+-1527a741b446889615bccc68cd40c1ed gcc/graphite-isl-ast-to-gimple.c
++b3037189d263bf2518bd3521a8652edb gcc/graphite-isl-ast-to-gimple.c
+ d7586bd35c3d11933ceb61445987b1be gcc/graphite-optimize-isl.c
+ 44fa75ae4f5cb0ac377521ea75ea1739 gcc/graphite-poly.c
+-a6fb22307a3a995855f46e2bb900025b gcc/graphite-scop-detection.c
++24cb5670390b40885b9f7e8cbc9e8f2d gcc/graphite-scop-detection.c
+ 2145e44f71f0e71c5d7525d412b11dc6 gcc/graphite-sese-to-poly.c
+ 5b53b1f39257a74d35d74267a10667d2 gcc/graphite.c
+ e2a89ed2d54d88eb79e9c45ac760ba2d gcc/graphite.h
+@@ -4930,7 +4894,7 @@
+ 3b0d55aa66be65dbe57933c94fa21773 gcc/hsa-brig-format.h
+ 68951ed27601fde925296e7050c19b08 gcc/hsa-brig.c
+ 3b45b6386324afbef0330d9d8cdbc09d gcc/hsa-dump.c
+-78fc9f283cc1eabaf8bd8d95e6461dfe gcc/hsa-gen.c
++cbd0b5366af70ed50a5aa9583995daed gcc/hsa-gen.c
+ 74ffebc0a61f0ac8bd7a90c8454cdc14 gcc/hsa-regalloc.c
+ ca9a2dd3e189ffb7385e163641e91f95 gcc/hsa.c
+ e13e5df371956a53173b7fb59f95b1d5 gcc/hsa.h
+@@ -4954,7 +4918,7 @@
+ f6eb1829b56b52c1a98e463764f15bb2 gcc/internal-fn.h
+ fdde96aa99d01f4a2e122427c73416e1 gcc/intl.c
+ 364233341b4f1261da8627eb826e6269 gcc/intl.h
+-8a05f2b124212ea048784639ae1805fc gcc/ipa-chkp.c
++26faa305263ec4b39061a74359f92d08 gcc/ipa-chkp.c
+ 0c2184ed06610d2b6afe4b6f4d417dbe gcc/ipa-chkp.h
+ f3a24a98107ccc8ad76113ede465029e gcc/ipa-comdats.c
+ 0da86e2392b6146c88d243312dd82027 gcc/ipa-cp.c
+@@ -4962,15 +4926,15 @@
+ 09da3707dcc58023f746ab4e5fabd815 gcc/ipa-hsa.c
+ 8cbeebf152275e9611ce91064d1006f3 gcc/ipa-icf-gimple.c
+ 455a02b19595e17d311284b20cd9946f gcc/ipa-icf-gimple.h
+-a46784b0082b24c3723a6bd34efd2056 gcc/ipa-icf.c
++a42f3827f0d168e29f65c96a9e41e40a gcc/ipa-icf.c
+ 5021b0bbc0eb5fdd57764d9440bc112c gcc/ipa-icf.h
+-937ec1ea45a11c5be2f5a51a4835000a gcc/ipa-inline-analysis.c
+-55c5111a5231b83f1b37edd7c28362a2 gcc/ipa-inline-transform.c
++a218a778bd374b99f367df36983a2e05 gcc/ipa-inline-analysis.c
++02dbb68319cd1e4e8561bbcdc37e0b9d gcc/ipa-inline-transform.c
+ 6ffb5637e26835334d307237572a86d3 gcc/ipa-inline.c
+-1ede16ebb03f841de4dd96f559a4147b gcc/ipa-inline.h
++5b9e28f57d5dcf8db033236d6d5ff9d7 gcc/ipa-inline.h
+ 6229fae545ec5dfe5099feff68acbc25 gcc/ipa-polymorphic-call.c
+ dd94f55f59c59919fcfe73719b53804c gcc/ipa-profile.c
+-449b3b4152d0852cd2ec595c89f56dda gcc/ipa-prop.c
++6ece3a1963d838aa977b891f381ccc7f gcc/ipa-prop.c
+ 7a7386b290a6a93fcfde58bd22cfb1f2 gcc/ipa-prop.h
+ 74d1b10d200d7553ee6f2ca92c0887df gcc/ipa-pure-const.c
+ ef575b78ba6545da9a738bb6492ffaea gcc/ipa-ref.c
+@@ -4982,7 +4946,7 @@
+ d01eb784d4a63008ba2460c3b47972b2 gcc/ipa-utils.h
+ 380724728441c80c569b8ee31d8ab4f1 gcc/ipa-visibility.c
+ f5194dfc342426fb120aa6ef0dac2984 gcc/ipa.c
+-bb05e32e874641496c916e3bbe6bd1d5 gcc/ira-build.c
++d40b36379402518db3bf0d60d97b5b55 gcc/ira-build.c
+ 964fe62f78d9da617c7eb903c20eb3da gcc/ira-color.c
+ e983cefc45ef903cf9ff61d0968b3bab gcc/ira-conflicts.c
+ 4a40c778a56feadfe0bd42965dbe084b gcc/ira-costs.c
+@@ -4992,7 +4956,7 @@
+ 048a61ff1463a425c9c13312cc4f2b77 gcc/ira.c
+ 74580aa160542aa4992d6a08ca5bc8f2 gcc/ira.h
+ 31f4d25e8f125875a26ac35cbc927cb8 gcc/is-a.h
+-ffc43ab034b5486bf1b22c4e25652589 gcc/java/ChangeLog
++ceee6770040d5c58de02381d5a65fb30 gcc/java/ChangeLog
+ 507793f7d137759eaebce11bb6904781 gcc/java/ChangeLog.gimple-classes
+ c52fb3faa0748d26588a8c62e7a032e3 gcc/java/ChangeLog.jit
+ 3becfaac793f49e1f52cd74e78172b48 gcc/java/ChangeLog.ptr
+@@ -5003,7 +4967,7 @@
+ dd4e349eb537ed7cee7033421af1777f gcc/java/class.c
+ 08aee25cbbca0291809291e30cdd28e9 gcc/java/config-lang.in
+ 597e80cf93fe17c733b3325596a87089 gcc/java/constants.c
+-62abdb3fb4dda2d1403f2255fcf02e67 gcc/java/decl.c
++4357af4636c74da6a36170ca55e3d8da gcc/java/decl.c
+ 87a5f387a742a553449af36a17f3d81f gcc/java/except.c
+ 193d30afff097161bfcd483e0fbf9389 gcc/java/expr.c
+ 6ca90df13b6db79a291d03502b2d026a gcc/java/gcj.texi
+@@ -5157,7 +5121,7 @@
+ 0e62588ade895bd5b41e9a9f468db224 gcc/lto-streamer-in.c
+ b93b516820b533bd1682f7a148299c10 gcc/lto-streamer-out.c
+ bdae986759b0d2c19d10cd95a3469cd6 gcc/lto-streamer.c
+-239c64daad087416ff10a8a4cee81b36 gcc/lto-streamer.h
++cbc225f3a9d78c6fa301299f140baa3b gcc/lto-streamer.h
+ fdd4f9b1c13609e47f794ce0d6f0e8da gcc/lto-wrapper.c
+ 1ecfbd8094590b170282d2a351b69028 gcc/lto/ChangeLog
+ bdc9ad4ddf80ce5b1548924f27f8df54 gcc/lto/Make-lang.in
+@@ -5176,9 +5140,9 @@
+ 7055ad53a5a9d81672428d858bc0affe gcc/lto/lto.c
+ ccfecfc6344c571f12776c61c50b98e1 gcc/lto/lto.h
+ 1ad92c4f2096f1f11a9d722298472ee5 gcc/machmode.def
+-2c8fae29dd077ed25751d1dd04ca361f gcc/machmode.h
++89fb633ceadc86168379eec86b822225 gcc/machmode.h
+ cf42eb61030c258fdda933a353c46798 gcc/main.c
+-cd34301f756f23f585a735b5e74be501 gcc/match.pd
++541198a830d7864394eae8377a18b824 gcc/match.pd
+ b4586a3a75b5dc7b5d62ccb834ea81ef gcc/mcf.c
+ 2befd16012fa1d3dc246e33d405b79f8 gcc/mem-stats-traits.h
+ 3e4b7d3dfbb311377553673371f9561e gcc/mem-stats.h
+@@ -5216,7 +5180,7 @@
+ 7d680f67db0eb1b8ff1b353ceb2caa2c gcc/objcp/objcp-decl.h
+ 8cfb48ffee764ccd1ab5dbf70f0234e0 gcc/objcp/objcp-lang.c
+ 742609336d1f57839866345f3fe16a98 gcc/omp-builtins.def
+-4933dc01313d0d9f8a01f52eee41e354 gcc/omp-low.c
++264284b664c34974388708ea2973fc49 gcc/omp-low.c
+ 17f7f9a5279dd46aca82fdd23c6ed175 gcc/omp-low.h
+ 56f009a0f93f52fc6e4bec4b17949a48 gcc/omp-simd-clone.c
+ f773f4ea009b64414353473ab70fc22d gcc/opt-functions.awk
+@@ -5235,11 +5199,11 @@
+ 5d7c8672928d8e9cb91ef0f415fdbedc gcc/optc-gen.awk
+ c4436c027680fe15e299195629d8d8ab gcc/optc-save-gen.awk
+ 0d8d3a459ed81fd2fa69cc19981521a8 gcc/opth-gen.awk
+-ff58d1ec1d48045472754120b193b85c gcc/opts-common.c
++99b50659a43b24a13195fa23816dcca5 gcc/opts-common.c
+ 52240b1476d05158d2811656568e12f0 gcc/opts-diagnostic.h
+ 2f24b289e6b216a31c7775b6bcbe41e4 gcc/opts-global.c
+ b2e8f32205053e2c288e98224914182a gcc/opts.c
+-6af4347f770893f6a8f33ce0d86e55da gcc/opts.h
++8bd47fc4db78292cef3e264347c4e0d3 gcc/opts.h
+ f7daf01f2540429baa36f933638dd34d gcc/output.h
+ ffc82aaffe672d77f230f006908b6fd0 gcc/params-enum.h
+ 6d350f6a56aff3c29a7b7ca665bc7c77 gcc/params-list.h
+@@ -5252,48 +5216,29 @@
+ c35d166939d6fdbd9bb5853c96bb673b gcc/plugin.c
+ 03231f119da6e6638a69e3c5111324f8 gcc/plugin.def
+ eb08b5caab095677d912ce793705caf7 gcc/plugin.h
+-c896550ea8a704b726f70ca8cbe9f083 gcc/po/ChangeLog
++ba8a67e2a742b229f49c824c74fdb505 gcc/po/ChangeLog
+ b2d1566753aedf7900d55d33f985138c gcc/po/EXCLUDES
+-73f5a360156bb96df0876f8ae49ee539 gcc/po/be.gmo
+-858a8db5418c9d759b39a4a7da86584a gcc/po/be.po
+-34603ebce82e592915a19c8e7c06f46b gcc/po/da.gmo
+-f2678a98410da89c6ec8aa2b1908d0c6 gcc/po/da.po
+-fa35eedf6605508229d033bc58e2a1f0 gcc/po/de.gmo
+-1b41215282905586b826b85e24c8d1a3 gcc/po/de.po
+-7e7ab58b8fc61fe93e33decf96ef8c73 gcc/po/el.gmo
+-6b015487bd35c40a3fb5996908172cda gcc/po/el.po
+-053a5568dc887cbbc880dfc566074b43 gcc/po/es.gmo
+-d7b7435f6bfba7bcf40b5414a1358ea3 gcc/po/es.po
++da41f20602b08cf3060fdc3573e8bcf3 gcc/po/be.po
++94220484b47be9ea5471835c19a32a5b gcc/po/da.po
++739379c3b5456e6649601d0c629fd327 gcc/po/de.po
++6db04b03851e69d9513b958b788474a7 gcc/po/el.po
++cddbc322a1b9f50ba1b2de6c0235a2da gcc/po/es.po
+ f9ca050e999d59313ea3c78909a9f041 gcc/po/exgettext
+-0e57143fe61f4f6ee0257ca229d161ad gcc/po/fi.gmo
+-75abf91d71cecb1c755024e40d93ab22 gcc/po/fi.po
+-b62f58644438cf2aaaae0f59982e73f8 gcc/po/fr.gmo
+-b55a5d1e9f16c3a3aa2a44cfe4efec60 gcc/po/fr.po
++288d71e5a20c49fd49706768856b698f gcc/po/fi.po
++34a30c8ec15ddbd58918aa29b49d7faa gcc/po/fr.po
+ 7b979b2fb5ee1d4b22999b6b9f35f0d3 gcc/po/gcc.pot
+-c2a77d92023af97b968c73b45528e1b0 gcc/po/hr.gmo
+-e17454f620b1863396f3f2683af797ae gcc/po/hr.po
+-f15aba6d908d5270942778e0ccbfb6cc gcc/po/id.gmo
+-dd277eb29469e63bfe00ae4782905714 gcc/po/id.po
+-77592ad1824b3f39700fe7b1894b1349 gcc/po/ja.gmo
+-3fdef1cfc12a664bf8d23dde1e55244d gcc/po/ja.po
+-2b1aa89972f54a139e091dbbeb7aa326 gcc/po/nl.gmo
+-4605a46fbbc2dc43cf1ce2801b22d368 gcc/po/nl.po
+-4a8ad42adb20bb31f9221cdbaa8f0d56 gcc/po/ru.gmo
+-c15f983cd43fd56b2e0eed90ca85a5fe gcc/po/ru.po
+-cd4395a161628525beb444f240c2307d gcc/po/sr.gmo
+-fc88c9385f4e2e71082a6abd49bc898f gcc/po/sr.po
+-ce69b0580d1817b86e13fd6c4428f476 gcc/po/sv.gmo
+-e0a608252df131356ec65d17a9061c8b gcc/po/sv.po
+-ff242c916dea333c8e317ec48003d4d1 gcc/po/tr.gmo
+-45707ffef56abe9faf5b143a3bd3fdab gcc/po/tr.po
+-4334a12890be23c351f96df0fffe489b gcc/po/uk.gmo
+-baa5ef734ce0408426feb6b807ce880f gcc/po/uk.po
+-29fda96b949730c3b7a8b4189bccabca gcc/po/vi.gmo
+-f3ba9df1249e315a2d10d2cb75d5e357 gcc/po/vi.po
+-6659d133d2a567dc01c9940413a53a17 gcc/po/zh_CN.gmo
+-d8948f3a5f1de605509a5eb57b822e59 gcc/po/zh_CN.po
+-c51a9eefbe0b85753a8853ac8eeb2caa gcc/po/zh_TW.gmo
+-e0670c5e297590bdd0c77686fc15685a gcc/po/zh_TW.po
++abb2afd8fe7053a42cdea743592af384 gcc/po/hr.po
++ba1393a5c416098225a3f67e87525864 gcc/po/id.po
++26448d201f1c6a7c98d3da75046f49fb gcc/po/ja.po
++ea4a08bfee865ce879b44946bacb60eb gcc/po/nl.po
++71622d38892673e00a8acb1e9e495835 gcc/po/ru.po
++3d67f8989dd67ea4d0e1f94afa44e6e2 gcc/po/sr.po
++b6679504541e91960333afe4e78cf341 gcc/po/sv.po
++a986ac0aa1813678d4f968df72abdf9d gcc/po/tr.po
++289dcc1d2584b6c8ae1700abf19b1501 gcc/po/uk.po
++9a88bed7d4b0cfa06a9710a236f1dd37 gcc/po/vi.po
++6a15d527f4bb660ac2ebc11b87810e21 gcc/po/zh_CN.po
++14871a1a198c4b42159769507328fab2 gcc/po/zh_TW.po
+ 69cb8c2cd669d2ccb4d80d86bafa9b03 gcc/postreload-gcse.c
+ 136c02b2e1e680f2f1222e7b27b7719a gcc/postreload.c
+ 02aac36ac6c8089e57cdd45796f95237 gcc/predict.c
+@@ -5353,7 +5298,7 @@
+ a65b0839331cc74338b9a698a8c6516e gcc/sanopt.c
+ b765a177a40fac9fa436794081ec1a30 gcc/sbitmap.c
+ baf1028052c2a830de61b24d81ee5da7 gcc/sbitmap.h
+-0aab6489f94f24f5fe2eafe5261de2dd gcc/sched-deps.c
++75438eaf5eff450c06d49e939f97fc11 gcc/sched-deps.c
+ d30bdfafacf75a59010d260990ec7582 gcc/sched-ebb.c
+ b3011146b1ff654e200cdd1c84fec4f0 gcc/sched-int.h
+ 39622a83269e62f7612fe8d39aea6bce gcc/sched-rgn.c
+@@ -5386,8 +5331,8 @@
+ 704b277d6624cf0434ceb4413e457e58 gcc/statistics.h
+ 7b179dec806446f7af9f32ba1fa83b4e gcc/stmt.c
+ db0a871bfd07020c451cf0485edc8552 gcc/stmt.h
+-49f0ea4833afb345b5e18ca1f285b75c gcc/stor-layout.c
+-e6d4593c48e3361d44b0e1053250fd6c gcc/stor-layout.h
++7e2228b71f5d90edc613ec0c4848cdac gcc/stor-layout.c
++364b3f58d3ac50134a8eefb5f91fa0ad gcc/stor-layout.h
+ 8e3a2b656051f3ce59d1cde56e90e8ff gcc/store-motion.c
+ f5f79d3f7f15413b9096d592037d0446 gcc/streamer-hooks.c
+ 1a4f5f53317ad7289c572457c76a8610 gcc/streamer-hooks.h
+@@ -5406,7 +5351,7 @@
+ 43bc671be91bb4d94848b3e7f27a2930 gcc/target.h
+ 390fdb346018f2dac89921ab740e4205 gcc/targhooks.c
+ 4e44e54a960fb8713cc9c2975d7d27f9 gcc/targhooks.h
+-5787a5d3f70d58542e3517734f0ad8f1 gcc/testsuite/ChangeLog
++71f38c7eec649ccf0aa40be00b8367a6 gcc/testsuite/ChangeLog
+ 862f04afbd87da2cc6bc432c3f28430f gcc/testsuite/ChangeLog-1993-2007
+ 029a5d8dacd25eb5d4711452ac448e5b gcc/testsuite/ChangeLog-2008
+ 13ac28c41d51b66b4ec40dba6bd50f39 gcc/testsuite/ChangeLog-2009
+@@ -8145,6 +8090,7 @@
+ 0a221c339accacadef51e91e2f07b9ba gcc/testsuite/c-c++-common/asan/pr63888.c
+ 2a794af8b446f3413fe5b973ea309b7b gcc/testsuite/c-c++-common/asan/pr64820.c
+ 430079f735bd0792e25216b9c0862dae gcc/testsuite/c-c++-common/asan/pr70541.c
++dee6718aa031ca364c15580524cba02b gcc/testsuite/c-c++-common/asan/pr70712.c
+ 53382ff9da47e361b5e5dc525d26e518 gcc/testsuite/c-c++-common/asan/red-align-1.c
+ 40dc4b3092482d9427dfbc9415f0b0a8 gcc/testsuite/c-c++-common/asan/red-align-2.c
+ 8940936501084c6e4d7f6d110ba612d8 gcc/testsuite/c-c++-common/asan/rlimit-mmap-test-1.c
+@@ -8428,11 +8374,13 @@
+ 25018148b12e7e9ba0bb52c882a3c39b gcc/testsuite/c-c++-common/goacc-gomp/nesting-fail-1.c
+ 318406ae2dc40af036abc40c46d96836 gcc/testsuite/c-c++-common/goacc/Wparentheses-1.c
+ a784e64918008022358c8ee789eb6150 gcc/testsuite/c-c++-common/goacc/asyncwait-1.c
+-8c9f8683e5b47206924e6f5b01d98e86 gcc/testsuite/c-c++-common/goacc/cache-1.c
++f2b008762a25069d1c4d34ad85325ccc gcc/testsuite/c-c++-common/goacc/cache-1.c
++23d462264295eb148c028e9cc0c451ea gcc/testsuite/c-c++-common/goacc/cache-2.c
+ ed0df84115a0f8b333602804bdee2a95 gcc/testsuite/c-c++-common/goacc/clauses-fail.c
+ 8bfd01f209498815723e71000488572c gcc/testsuite/c-c++-common/goacc/collapse-1.c
+ ca2517a3cc3cd3ae7a63df0a68ad4598 gcc/testsuite/c-c++-common/goacc/combined-directives-2.c
+-6a3920d3728f9ade384ff4fd7f3a5d2c gcc/testsuite/c-c++-common/goacc/combined-directives.c
++4b20350010ccaafbe6720c0beec63fb9 gcc/testsuite/c-c++-common/goacc/combined-directives.c
++c68fccfb3ff8b00b01d51396677c6d59 gcc/testsuite/c-c++-common/goacc/combined-reduction.c
+ 6ff2b7486e948a4634adb071ea7906c0 gcc/testsuite/c-c++-common/goacc/data-1.c
+ c6b67854e61db0e6384c49c9402e9939 gcc/testsuite/c-c++-common/goacc/data-2.c
+ b0b60bf50600ebe553878a82dfa99c8d gcc/testsuite/c-c++-common/goacc/data-clause-duplicate-1.c
+@@ -8531,7 +8479,7 @@
+ 99033a31ad0844a80bb561d39f21bc2c gcc/testsuite/c-c++-common/gomp/atomic-8.c
+ a6583e4cf6c5bb3b1a46172a0635d197 gcc/testsuite/c-c++-common/gomp/atomic-9.c
+ 6eec1bac67576f5cb167599634a153cb gcc/testsuite/c-c++-common/gomp/cancel-1.c
+-443946b78808c77b5280fbe5ad4c87ff gcc/testsuite/c-c++-common/gomp/clauses-1.c
++4643decfdedb2843b4b2903c5f686d54 gcc/testsuite/c-c++-common/gomp/clauses-1.c
+ aeca3a50d934c2d4e5e18c86aa8ec65c gcc/testsuite/c-c++-common/gomp/clauses-2.c
+ 657094047e2432f3bc3c5cafde1eafcd gcc/testsuite/c-c++-common/gomp/clauses-3.c
+ 8d9ef02ce9840a58a8c64026e4df30b2 gcc/testsuite/c-c++-common/gomp/clauses-4.c
+@@ -8592,6 +8540,8 @@
+ f230f09eac11df86e31192d6bf15c8d3 gcc/testsuite/c-c++-common/gomp/pr67521.c
+ befbc361d92f725fefa0029d54d3c22b gcc/testsuite/c-c++-common/gomp/pr70550-1.c
+ 4c7e38cbcd8c76fb43d8ce5a9a036711 gcc/testsuite/c-c++-common/gomp/pr70550-2.c
++9c6ccd1b697ca4b2f7de134bafdfda56 gcc/testsuite/c-c++-common/gomp/pr71371.c
++8d4187a1bda8777b2ff9ff3a8693ac86 gcc/testsuite/c-c++-common/gomp/pr71758.c
+ 5d522e2f1f7455bc45f6c1f230d5a5b0 gcc/testsuite/c-c++-common/gomp/priority-1.c
+ 1dc7bbbafb91e179ac43fa3959ab125f gcc/testsuite/c-c++-common/gomp/reduction-1.c
+ a73d7c3b3886856e6621c6e5854c3333 gcc/testsuite/c-c++-common/gomp/schedule-modifiers-1.c
+@@ -8714,7 +8664,7 @@
+ cbe3fc815940c07168eae35940a68240 gcc/testsuite/c-c++-common/pr69558-3.c
+ 021fff0470a2865e5a38b50712393164 gcc/testsuite/c-c++-common/pr69558-4.c
+ 11a73961cd31ec2471c0e9cc3200e966 gcc/testsuite/c-c++-common/pr69558.c
+-31a4c6dc3751ea2efa2efa81ce54fc52 gcc/testsuite/c-c++-common/pr69669.c
++388b963ce0a6d74b387fe44e74666652 gcc/testsuite/c-c++-common/pr69669.c
+ dc7d9d40dac973e012fc8b7b6f54d784 gcc/testsuite/c-c++-common/pr69764.c
+ f4386df5fa5c32d56388c75bdf15c9d4 gcc/testsuite/c-c++-common/pr69797.c
+ 65bc4d5f65c8acc789b20b18a397a09c gcc/testsuite/c-c++-common/pr70144-1.c
+@@ -8723,6 +8673,7 @@
+ 25c6ea4844eb15010d49a3780fb6bb37 gcc/testsuite/c-c++-common/pr70297.c
+ ccc164356d4817396e516749bf924ce8 gcc/testsuite/c-c++-common/pr70336.c
+ ddcfc64c63208f870fb7e0fe0276319d gcc/testsuite/c-c++-common/pr70651.c
++ab8ceba35b76e5122ef1d15e5a6d31ba gcc/testsuite/c-c++-common/pr71372.c
+ b0ba836310044e7b419ef679f0b48d6f gcc/testsuite/c-c++-common/raw-string-1.c
+ 554e7071d2525351de28445762633866 gcc/testsuite/c-c++-common/raw-string-10.c
+ fc54e7227094f307fa566b3a8cd0ba9a gcc/testsuite/c-c++-common/raw-string-11.c
+@@ -8901,6 +8852,7 @@
+ f7ac21b5467fdafd31e4d63c13bba697 gcc/testsuite/c-c++-common/ubsan/bounds-10.c
+ 8a79b5ac2324b237d4b97f40d8caef20 gcc/testsuite/c-c++-common/ubsan/bounds-11.c
+ c0cea811b60785fdbeb5a8c17cbfe97d gcc/testsuite/c-c++-common/ubsan/bounds-12.c
++e41a9c9640280bfabdc970ff41f1e444 gcc/testsuite/c-c++-common/ubsan/bounds-13.c
+ 5ce7dbfd4301c9cde8b861eef45a151b gcc/testsuite/c-c++-common/ubsan/bounds-2.c
+ e7f60e0642d24587e57ad55271053c36 gcc/testsuite/c-c++-common/ubsan/bounds-3.c
+ 55d21c141077691618a0992441b77856 gcc/testsuite/c-c++-common/ubsan/bounds-4.c
+@@ -9522,9 +9474,9 @@
+ 0f37e29f62414944ff8ae0b75a77f2c0 gcc/testsuite/g++.dg/concepts/constrained-parm.C
+ b5e01f926b642aa30736fa60d24db29a gcc/testsuite/g++.dg/concepts/decl-diagnose.C
+ 391bcf94c298040bce05a2bc3c1fe6a6 gcc/testsuite/g++.dg/concepts/deduction-constraint1.C
+-61025db31db6fc9bd377f8dbcc5b997c gcc/testsuite/g++.dg/concepts/diagnostic1.C
++ef831b23357717a1194aabd267da39eb gcc/testsuite/g++.dg/concepts/diagnostic1.C
+ d8f521f37e4f01ddd0581d00a83a9be0 gcc/testsuite/g++.dg/concepts/disjunction1.C
+-d9435abbf2c120b3e86351722c471f92 gcc/testsuite/g++.dg/concepts/dr1430.C
++eca2e51caee3cfce80ec8e3714c464f4 gcc/testsuite/g++.dg/concepts/dr1430.C
+ 5088c07f3bb6eeb91fa790bf5e35ac12 gcc/testsuite/g++.dg/concepts/equiv.C
+ 8d8c066843ef43dad83d062249b81c9e gcc/testsuite/g++.dg/concepts/equiv2.C
+ 1952696facfb66a6315b0d4f4705c4ee gcc/testsuite/g++.dg/concepts/explicit-inst1.C
+@@ -9538,7 +9490,7 @@
+ 501c4dfeab8ff32a18f46ad605b6546d gcc/testsuite/g++.dg/concepts/explicit-spec5.C
+ 8119a7faeb5616c44ff49d2bd334eac9 gcc/testsuite/g++.dg/concepts/explicit-spec6.C
+ 96104c437a91a0fb547269950a1e36f4 gcc/testsuite/g++.dg/concepts/expression.C
+-52f0561a49ff6a8c9b047023f5157daf gcc/testsuite/g++.dg/concepts/expression2.C
++9cd0bdf0163dc59d13bb259276c6ae5e gcc/testsuite/g++.dg/concepts/expression2.C
+ 87c2debb21e393a5ad7cace00e6e3ebc gcc/testsuite/g++.dg/concepts/expression3.C
+ 1014808baa24324e788c7dd8365e1ce3 gcc/testsuite/g++.dg/concepts/feature-macro.C
+ b7abb47c2caa2a79fd16fab511bb2732 gcc/testsuite/g++.dg/concepts/fn-concept1.C
+@@ -9608,11 +9560,13 @@
+ 027f2c7c0ad7e093a74f28f9d0d7d647 gcc/testsuite/g++.dg/concepts/req16.C
+ 561f41b46177b2306d20376cbf26d558 gcc/testsuite/g++.dg/concepts/req17.C
+ 8af4e2969556c6e997e15e5f597d1321 gcc/testsuite/g++.dg/concepts/req18.C
++9ffd899c33f7220af9323a4c2742bd97 gcc/testsuite/g++.dg/concepts/req19.C
+ fc37b1d1ffeb8646c92ec29e5dedb414 gcc/testsuite/g++.dg/concepts/req2.C
++0ca7d0d8ad43bd2d06816711d6448be1 gcc/testsuite/g++.dg/concepts/req20.C
+ 9240432b308eb3d01848b9219bf54574 gcc/testsuite/g++.dg/concepts/req3.C
+-789edfd6a18eb7aefdb70de5ee2d7fc0 gcc/testsuite/g++.dg/concepts/req4.C
+-e6fadc6e6565a21c82b671cf83db5509 gcc/testsuite/g++.dg/concepts/req5.C
+-a837c9f121398c34d9d464990ba30ef4 gcc/testsuite/g++.dg/concepts/req6.C
++1bdb8c23a97fc02dc59b0fca6be8514d gcc/testsuite/g++.dg/concepts/req4.C
++a847d33fd2714f5bc1c7bf82c0176102 gcc/testsuite/g++.dg/concepts/req5.C
++9553bc47ec33281c4ec07de996a4989b gcc/testsuite/g++.dg/concepts/req6.C
+ cf1a1cf4f90160b4b86afb8e6484459d gcc/testsuite/g++.dg/concepts/req7.C
+ 16d982b507ffee80be5a1bc873fff0ea gcc/testsuite/g++.dg/concepts/req8.C
+ 8280cb973b01ac7880086901d73a394e gcc/testsuite/g++.dg/concepts/req9.C
+@@ -9637,16 +9591,17 @@
+ 28cce2ca57d1f29a0d0eade359d3c202 gcc/testsuite/g++.dg/concepts/var-concept4.C
+ 014df05bdbdfd4aef2968bb90ad28e65 gcc/testsuite/g++.dg/concepts/var-concept5.C
+ c0a0dd84a577ada307b7869dc3ea7612 gcc/testsuite/g++.dg/concepts/var-concept6.C
+-b6115b5e4ac7a76ce3c27db80d14c531 gcc/testsuite/g++.dg/concepts/var-templ1.C
++d686009ae0430347493849435d065149 gcc/testsuite/g++.dg/concepts/var-templ1.C
+ e943848fb59fdc24e521fa408a8d7684 gcc/testsuite/g++.dg/concepts/var-templ2.C
+ 55d37ce4725b2bb2562b6bf081fb2d6e gcc/testsuite/g++.dg/concepts/variadic1.C
+-1c6ba3dc03a4aac6e93ecddc77820621 gcc/testsuite/g++.dg/concepts/variadic2.C
++49188af171efd3fc7a4910e5f4c2ed79 gcc/testsuite/g++.dg/concepts/variadic2.C
+ b090b7633124e41a8ed5f692e4b2bdef gcc/testsuite/g++.dg/concepts/variadic3.C
+ 47d50ea9841dfff2e1add4fe21d8cdd8 gcc/testsuite/g++.dg/conflict-markers-1.C
+ f25f03bef75b49b3242b2b981a26687a gcc/testsuite/g++.dg/constexpr-null1.C
+ f0aed431ce3357281e21fdd3e10a7644 gcc/testsuite/g++.dg/conversion/access1.C
+ cae83e7bca15183b3b346f9a00467f2c gcc/testsuite/g++.dg/conversion/ambig1.C
+ 65bec450f1ba3239f73319431b72958b gcc/testsuite/g++.dg/conversion/ambig2.C
++722f350c4414b8268cd41e6ba6e87739 gcc/testsuite/g++.dg/conversion/ambig3.C
+ 692916f43054879ce077252221b118a2 gcc/testsuite/g++.dg/conversion/base1.C
+ f1b5334044ded17fb9949549b0502764 gcc/testsuite/g++.dg/conversion/bitfield1.C
+ 38f6bad87ae88f3b5e8814eb2a0cb3cd gcc/testsuite/g++.dg/conversion/bitfield10.C
+@@ -9747,6 +9702,7 @@
+ 74bb2cd707774dcc79b45b939b21d2a8 gcc/testsuite/g++.dg/cpp0x/Wnarrowing3.C
+ 98f5997ac53fff61b85f99bfe358a506 gcc/testsuite/g++.dg/cpp0x/Wnarrowing4.C
+ 6ae3451e0c7b222e73c985a0c76a4253 gcc/testsuite/g++.dg/cpp0x/Wunused-parm.C
++c9c65f2ce729014de1f8d5a02bf08a2a gcc/testsuite/g++.dg/cpp0x/Wunused-variable-1.C
+ 948a776d6405969529e65e69911b6f98 gcc/testsuite/g++.dg/cpp0x/Wzero-as-null-pointer-constant-1.C
+ 1821a76c969bbe9fe98225106370d360 gcc/testsuite/g++.dg/cpp0x/Wzero-as-null-pointer-constant-2.C
+ 1388db9b52c8fb258faed2c95049bb99 gcc/testsuite/g++.dg/cpp0x/__func__.C
+@@ -9804,6 +9760,7 @@
+ 8202db24e0fe65d1f9e1618bd0be1554 gcc/testsuite/g++.dg/cpp0x/alias-decl-50.C
+ 72736d15450a5e2c6eff6d212a1c62ea gcc/testsuite/g++.dg/cpp0x/alias-decl-51.C
+ ff3cdd35e9b74954a4247257ac643335 gcc/testsuite/g++.dg/cpp0x/alias-decl-52.C
++aeae7dcc61eb495ebb095caa00a5f429 gcc/testsuite/g++.dg/cpp0x/alias-decl-55.C
+ a16b0e12dce894e9bc097e3fbad8787d gcc/testsuite/g++.dg/cpp0x/alias-decl-6.C
+ 816dbf372a71890f9515376534ec312b gcc/testsuite/g++.dg/cpp0x/alias-decl-7.C
+ 77aa48fcd9f9b9ffab08fa7ebc5d52e2 gcc/testsuite/g++.dg/cpp0x/alias-decl-8.C
+@@ -9820,6 +9777,7 @@
+ f441b8f61e57b375afffc578a0ab410b gcc/testsuite/g++.dg/cpp0x/alignas3.C
+ 842d4bc39d9ce4591190d72ce324a6a8 gcc/testsuite/g++.dg/cpp0x/alignas4.C
+ 2490568ef637fae72e27c31a035040f2 gcc/testsuite/g++.dg/cpp0x/alignas5.C
++6cd5b5dc6ccc7b589a806bdced15c4db gcc/testsuite/g++.dg/cpp0x/alignas7.C
+ dad14da1d0b01a33c9cdabaaf609eb0a gcc/testsuite/g++.dg/cpp0x/alignof.C
+ f6ed96119608d817c8a36a47de91e2bc gcc/testsuite/g++.dg/cpp0x/alignof2.C
+ a341935f38f4b4581206e23c9027c975 gcc/testsuite/g++.dg/cpp0x/alignof3.C
+@@ -9866,6 +9824,7 @@
+ d9b716e1c070d979f6ba213732af91c4 gcc/testsuite/g++.dg/cpp0x/auto45.C
+ 19479e39ea80e3649e4b4b41c4c2abeb gcc/testsuite/g++.dg/cpp0x/auto46.C
+ 44db23ed368948ddb9b1a48f48c7bdaa gcc/testsuite/g++.dg/cpp0x/auto47.C
++a9475f77c4033a39fd7cae71ded2db91 gcc/testsuite/g++.dg/cpp0x/auto48.C
+ 7abd7f6467fdec05adaab6e23e984bfb gcc/testsuite/g++.dg/cpp0x/auto5.C
+ a2ff527dcef7e9b2af2703655b2eda60 gcc/testsuite/g++.dg/cpp0x/auto7.C
+ e90d2ff3c84b5ead3e920a1d12881e02 gcc/testsuite/g++.dg/cpp0x/auto9.C
+@@ -9928,6 +9887,7 @@
+ 6d2a7bdbddfaf87d584b814bf1961f04 gcc/testsuite/g++.dg/cpp0x/constexpr-70204b.C
+ 4b441a48b11747fe319801157a36c4a6 gcc/testsuite/g++.dg/cpp0x/constexpr-70323.C
+ afb210848d078a6555666048b75692fb gcc/testsuite/g++.dg/cpp0x/constexpr-70323a.C
++34638f51d99af855474a3feb1f02e5d7 gcc/testsuite/g++.dg/cpp0x/constexpr-71828.C
+ de3d6255780c29f63df3f8d96932bd39 gcc/testsuite/g++.dg/cpp0x/constexpr-98.C
+ 1bc1c995533b047ed8df6f6f24905cd1 gcc/testsuite/g++.dg/cpp0x/constexpr-99.C
+ 3ccc1912e7827aae6b55936a3bf3bb24 gcc/testsuite/g++.dg/cpp0x/constexpr-__func__.C
+@@ -9955,6 +9915,8 @@
+ c674590e5f0bbd6aa35938ccaa364818 gcc/testsuite/g++.dg/cpp0x/constexpr-array13.C
+ a3fe89999694d5e28c05f50283b43674 gcc/testsuite/g++.dg/cpp0x/constexpr-array14.C
+ 9a2ca70ccd537baf9a32359fd8f4b890 gcc/testsuite/g++.dg/cpp0x/constexpr-array15.C
++0d357130ee7bed073a309d7d917b8baa gcc/testsuite/g++.dg/cpp0x/constexpr-array16.C
++b67bdded4c1fdae8a63fc397fa97f855 gcc/testsuite/g++.dg/cpp0x/constexpr-array17.C
+ 687c6e77d4af3cd918c0ff421773a66c gcc/testsuite/g++.dg/cpp0x/constexpr-array2.C
+ 8b7c8e7c1b64cfa0626f7f2311c9fef5 gcc/testsuite/g++.dg/cpp0x/constexpr-array3.C
+ 6451aa5bb5fa736dda3ebad1dc2e8336 gcc/testsuite/g++.dg/cpp0x/constexpr-array4.C
+@@ -10123,10 +10085,11 @@
+ 4d49e9b974a931e39b282bff1452e17a gcc/testsuite/g++.dg/cpp0x/constexpr-ptrmem3.C
+ 3123b806108a774709cd5a02856fa2a3 gcc/testsuite/g++.dg/cpp0x/constexpr-ptrmem4.C
+ 207019aa55e1983b45122db974bd0948 gcc/testsuite/g++.dg/cpp0x/constexpr-ptrmem5.C
++bdbdee9b8211644ca4eaf7ef1be48857 gcc/testsuite/g++.dg/cpp0x/constexpr-ptrmem6.C
+ 32da508b62d5ba45ac51680a9a5638a4 gcc/testsuite/g++.dg/cpp0x/constexpr-ptrsub.C
+ c893e2388f9acef593b874b1e6b02071 gcc/testsuite/g++.dg/cpp0x/constexpr-pure.C
+ 3d462eb6b34feb0c1cf9349c9e6e976c gcc/testsuite/g++.dg/cpp0x/constexpr-recursion.C
+-e928dbbe606fe0e66600ffb39f8ec1ac gcc/testsuite/g++.dg/cpp0x/constexpr-recursion2.C
++d0613cd67d583f80a028bb4816e6c9e8 gcc/testsuite/g++.dg/cpp0x/constexpr-recursion2.C
+ 5e160a188aef7805034f272bd43d2ab7 gcc/testsuite/g++.dg/cpp0x/constexpr-redeclaration1.C
+ dc7a7eb622691a6363e90822f0e39072 gcc/testsuite/g++.dg/cpp0x/constexpr-ref1.C
+ d1d1aecd66ba1c7f2b50e13b37172d43 gcc/testsuite/g++.dg/cpp0x/constexpr-ref2.C
+@@ -10204,7 +10167,7 @@
+ 58e380f5c0bc16e86009e605e19acb07 gcc/testsuite/g++.dg/cpp0x/constexpr-volatile.C
+ 7bca20d6ac21d6cb78ab16d5c52b7e64 gcc/testsuite/g++.dg/cpp0x/constexpr-wstring1.C
+ 1bd363de99cf0f80a7a4045242fee01f gcc/testsuite/g++.dg/cpp0x/constexpr-wstring2.C
+-dd5a416dd6cf70c8d633073c2bdfd8b3 gcc/testsuite/g++.dg/cpp0x/conv-tmpl1.C
++70dc080523c40a07cec30261f6f7007a gcc/testsuite/g++.dg/cpp0x/conv-tmpl1.C
+ 38cf671e2c9af718ef5149c2d09c8383 gcc/testsuite/g++.dg/cpp0x/cplusplus.C
+ 61947bc3307a11bf874ab41c139e4d41 gcc/testsuite/g++.dg/cpp0x/cplusplus_0x.C
+ 785a499e3417eea504fae30dbd16a77f gcc/testsuite/g++.dg/cpp0x/dc1.C
+@@ -10287,6 +10250,7 @@
+ 052b7eec67bbc39fded7404fdeff4428 gcc/testsuite/g++.dg/cpp0x/decltype61.C
+ b7d187347381223b6effdb89e05e85df gcc/testsuite/g++.dg/cpp0x/decltype62.C
+ e0815b98196aea0739acd0b3e2b6b78f gcc/testsuite/g++.dg/cpp0x/decltype63.C
++d2625dbb2a029ee93a5c64304e4db88e gcc/testsuite/g++.dg/cpp0x/decltype65.C
+ c3626f3b26fbb53bd234a4e39649b63f gcc/testsuite/g++.dg/cpp0x/decltype7.C
+ bbdff105c665351973aaa6a25eaa0940 gcc/testsuite/g++.dg/cpp0x/decltype8.C
+ 4b13c00f57a3a7cb225369c29f8fd6f6 gcc/testsuite/g++.dg/cpp0x/decltype9.C
+@@ -10534,6 +10498,8 @@
+ d3df2168b01c7df3891e31a076616e58 gcc/testsuite/g++.dg/cpp0x/inh-ctor18.C
+ 798dc3612d523e6b99b6a497b1f8ae60 gcc/testsuite/g++.dg/cpp0x/inh-ctor19.C
+ 69ee4b066e7054d7163a882761fcc7c7 gcc/testsuite/g++.dg/cpp0x/inh-ctor2.C
++1e245cab6f0228068139bd22ddc79d66 gcc/testsuite/g++.dg/cpp0x/inh-ctor20.C
++ae53be78261501cbb9b25c7630f78cb5 gcc/testsuite/g++.dg/cpp0x/inh-ctor21.C
+ 6a7a4b5897b83f2f6ebdd08eb567d152 gcc/testsuite/g++.dg/cpp0x/inh-ctor3.C
+ 071eafda7f7d2d4bff42921fbd048a45 gcc/testsuite/g++.dg/cpp0x/inh-ctor4.C
+ fda4f7d4f4b57c79d7734d634ae9041f gcc/testsuite/g++.dg/cpp0x/inh-ctor5.C
+@@ -10558,6 +10524,7 @@
+ e3ec7ab89d20e6ccf50aa92954896f07 gcc/testsuite/g++.dg/cpp0x/initlist-postfix-open-square.C
+ 1b5c7e432be89c3edcbfaad424a2e353 gcc/testsuite/g++.dg/cpp0x/initlist-protected.C
+ fd02e573e3be3d0a146192cd840840a1 gcc/testsuite/g++.dg/cpp0x/initlist-pure.C
++b981bb775821a5230961a162ba38ff43 gcc/testsuite/g++.dg/cpp0x/initlist-template1.C
+ 742c772ced8eedc3c0511b94b8410082 gcc/testsuite/g++.dg/cpp0x/initlist-value.C
+ fab23eb9efdcf1b8c0f8393aa5ad7913 gcc/testsuite/g++.dg/cpp0x/initlist-value2.C
+ 93763afe3eb7edb5553f76daf0ed0de3 gcc/testsuite/g++.dg/cpp0x/initlist-vect.C
+@@ -10690,6 +10657,7 @@
+ fc87adf1aa8763a35e80b1067faf9948 gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const5.C
+ 25265bcafc26c3a0ab3727a9ff348916 gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv.C
+ 862ed5b4e67a8a0e32b42b5792ae7fff gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv10.C
++522c3e9a3e7905c1f6e87fc6ce263930 gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv11.C
+ 299fbfde279f22ba6cf7e79d7e17f49b gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv2.C
+ 13859d1112ce3900c792dcdc2e8ae085 gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv3.C
+ b91c55a7472ec7a8d2f35a01f04cc387 gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv4.C
+@@ -10737,6 +10705,7 @@
+ c4dbb33289335abfc0e81ecec97d4f05 gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice13.C
+ dc3a51c8d29b09710666fc488cca027c gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice14.C
+ 1042a4840f48bd0952ae8bb7b25b0885 gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice15.C
++37dfc8c9afae1533f73b7fca269e891d gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice16.C
+ f7f1dbbd136c0efa4e64ac7431acecd4 gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice2.C
+ 32e4ddab4dbbba84634a9be94759430d gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice3.C
+ 47226bea0ac5dc3c286fd8fe05473a80 gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice4.C
+@@ -11095,6 +11064,9 @@
+ ab186fe632aff8530f69060d5961b489 gcc/testsuite/g++.dg/cpp0x/pr68726.C
+ d584417478a609ab589447aa7e173812 gcc/testsuite/g++.dg/cpp0x/pr69056.C
+ 4ca96cbe7b69845eba2cf016007957a4 gcc/testsuite/g++.dg/cpp0x/pr70528.C
++cf9cf154014255688dedeb39cfe8e73b gcc/testsuite/g++.dg/cpp0x/pr70869.C
++c69896dc2fac3243e492d5e8acf8d0b8 gcc/testsuite/g++.dg/cpp0x/pr71054.C
++bf28b34cff6af29465046bf24b9bff82 gcc/testsuite/g++.dg/cpp0x/pr71739.C
+ 53428f69a6d0153074c9b06ee9fbe9e7 gcc/testsuite/g++.dg/cpp0x/ptrmem-cst-arg1.C
+ 6e8e648c26d9bf237cc152180e88c2c2 gcc/testsuite/g++.dg/cpp0x/range-for1.C
+ 5c7a98d8ca2f0f427c081bf6902aa831 gcc/testsuite/g++.dg/cpp0x/range-for10.C
+@@ -11120,11 +11092,12 @@
+ 64c77a507ebcd58347cb4a538ae16807 gcc/testsuite/g++.dg/cpp0x/range-for29.C
+ ba9e5975a5058b94945c4d18bb19b344 gcc/testsuite/g++.dg/cpp0x/range-for3.C
+ 4b0681c49d2c294d37da68e8ae679248 gcc/testsuite/g++.dg/cpp0x/range-for30.C
++2e0b59cf549f3ada1e2c24f0828fd564 gcc/testsuite/g++.dg/cpp0x/range-for31.C
+ cf3faabae812bd6f8ade13f3c1d36871 gcc/testsuite/g++.dg/cpp0x/range-for4.C
+ 9d70da20463079b62be580867a3e6601 gcc/testsuite/g++.dg/cpp0x/range-for5.C
+ bf09a13cfe61445a898ea383c44bc795 gcc/testsuite/g++.dg/cpp0x/range-for6.C
+ cf6c66c2c1f26f78f53b3a006d996662 gcc/testsuite/g++.dg/cpp0x/range-for7.C
+-52e4fd10daa41fb157218e52014c09f1 gcc/testsuite/g++.dg/cpp0x/range-for8.C
++b111f953ff16a99ffc3ad09a151f0958 gcc/testsuite/g++.dg/cpp0x/range-for8.C
+ 68a9925bd047631ad89890587ebf286d gcc/testsuite/g++.dg/cpp0x/range-for9.C
+ 87cba3bd81389f956a4ab8405ad5dc46 gcc/testsuite/g++.dg/cpp0x/ref-qual-mangle1.C
+ af4673410b97bcc5393dd82a2599c2d1 gcc/testsuite/g++.dg/cpp0x/ref-qual-multi-neg.C
+@@ -11251,6 +11224,7 @@
+ 6cdcb8a895c4b3868012fd320d412513 gcc/testsuite/g++.dg/cpp0x/sfinae54.C
+ 1e0939ee9e6841aacffde1ae4c5d3023 gcc/testsuite/g++.dg/cpp0x/sfinae55.C
+ c0fee994e880e6032fe6c1fa1a6efa69 gcc/testsuite/g++.dg/cpp0x/sfinae56.C
++2628399b955cc58affa3be676427e085 gcc/testsuite/g++.dg/cpp0x/sfinae57.C
+ 7d2a515d9dca41b0e82b2e6ea54bd2d3 gcc/testsuite/g++.dg/cpp0x/sfinae6.C
+ ec1a51ea3fd41e6e61c8f425bde1fd0b gcc/testsuite/g++.dg/cpp0x/sfinae7.C
+ 547894832b1452d5f513938e0cb8a166 gcc/testsuite/g++.dg/cpp0x/sfinae8.C
+@@ -11385,6 +11359,10 @@
+ aaa90c1c2261698f9319415498163db1 gcc/testsuite/g++.dg/cpp0x/variadic-function.C
+ fb23a824547af5cbc2d6ee6a52d5e3c0 gcc/testsuite/g++.dg/cpp0x/variadic-init.C
+ f64443a27f946984ec474714387b99a8 gcc/testsuite/g++.dg/cpp0x/variadic-lambda.C
++61d159a494882dad368e53517bf8df8d gcc/testsuite/g++.dg/cpp0x/variadic-mangle1a.C
++7727443a155c2eed9930c6bc3f808465 gcc/testsuite/g++.dg/cpp0x/variadic-mangle2a.C
++8dd845093d366e371bdaf222fda42413 gcc/testsuite/g++.dg/cpp0x/variadic-mangle3.C
++efdeb5b65b79fc6ff926b12f711edcb1 gcc/testsuite/g++.dg/cpp0x/variadic-mangle3a.C
+ 6c67e276177a53a05508b5e974504d12 gcc/testsuite/g++.dg/cpp0x/variadic-mem_fn.C
+ 7d2b8191fa109fd1786f979fbfa18b4e gcc/testsuite/g++.dg/cpp0x/variadic-new.C
+ 5ad1db01bdd9d87f2a8276b08cff8db7 gcc/testsuite/g++.dg/cpp0x/variadic-new2.C
+@@ -11646,6 +11624,8 @@
+ c62290c3433fd946afe248d80f2f0e63 gcc/testsuite/g++.dg/cpp1y/auto-fn29.C
+ c4e86a95bc6b38f69a4a30b1b1cf1e4e gcc/testsuite/g++.dg/cpp1y/auto-fn3.C
+ 51f8ba9d1f0f20256658a6298e611261 gcc/testsuite/g++.dg/cpp1y/auto-fn30.C
++2166d3092f2a511f64d91ad91795c1ac gcc/testsuite/g++.dg/cpp1y/auto-fn31.C
++f475a3e97ef5d08fb361f8070d183611 gcc/testsuite/g++.dg/cpp1y/auto-fn32.C
+ a87641c12e6bf65af1e8d592973cba76 gcc/testsuite/g++.dg/cpp1y/auto-fn4.C
+ eaab8c47716923537d6580ede6fbe3ae gcc/testsuite/g++.dg/cpp1y/auto-fn5.C
+ 3861eed28323480e4913eea3d9c0ec00 gcc/testsuite/g++.dg/cpp1y/auto-fn6.C
+@@ -11702,28 +11682,34 @@
+ 695cc86426b24103c2a80eda00cf2189 gcc/testsuite/g++.dg/cpp1y/digit-sep-neg.C
+ 2ccf049767734b973a90dea30576d8a8 gcc/testsuite/g++.dg/cpp1y/digit-sep.C
+ 7f7fdf0f184e22144c0d2d80c0827581 gcc/testsuite/g++.dg/cpp1y/feat-cxx11-neg.C
+-c254f2d5cb21443479f2bf917857354d gcc/testsuite/g++.dg/cpp1y/feat-cxx11.C
++f7b649949cc8d31bf746a3565f161066 gcc/testsuite/g++.dg/cpp1y/feat-cxx11.C
+ a3ed2dff5176ed6eef5ae2d57cf13c3c gcc/testsuite/g++.dg/cpp1y/feat-cxx14-neg.C
+-abea85deb4cd6b8a3a2d8a806b4779a7 gcc/testsuite/g++.dg/cpp1y/feat-cxx14.C
+-3aa0ecb004b47e939728528453a77d12 gcc/testsuite/g++.dg/cpp1y/feat-cxx98-neg.C
++593fb77a3a5089f92e2c81898ae570ff gcc/testsuite/g++.dg/cpp1y/feat-cxx14.C
++d8f10984fce17881f14be647e37c6342 gcc/testsuite/g++.dg/cpp1y/feat-cxx98-neg.C
+ d9680a99825535ba499a795339ce02c2 gcc/testsuite/g++.dg/cpp1y/feat-cxx98.C
+ 01260d1a223a8398c967796299932d12 gcc/testsuite/g++.dg/cpp1y/feat-neg.C
+ 018149928d964ce66689bf4960400c07 gcc/testsuite/g++.dg/cpp1y/feat-sized-dealloc-neg.C
+ b7edad357bb503949f49802295729019 gcc/testsuite/g++.dg/cpp1y/feat-sized-dealloc.C
+ fc5875e8af08d0f9488344e80bf6f764 gcc/testsuite/g++.dg/cpp1y/feat-vla.C
+ f4be44f045dc9cb6f8b7acd5e3193c1d gcc/testsuite/g++.dg/cpp1y/fn-generic-member-ool.C
++2cf8b2b7a7dc5ba828766c37a54e2315 gcc/testsuite/g++.dg/cpp1y/lambda-conv1.C
++4734b77212418e40ce4f8965c6017a39 gcc/testsuite/g++.dg/cpp1y/lambda-conv2.C
+ 5f112fcc57ff57c8e803342bde4e9c25 gcc/testsuite/g++.dg/cpp1y/lambda-deduce-mult-neg.C
+ a5fcad1d0708a6218c6fe69c1871df02 gcc/testsuite/g++.dg/cpp1y/lambda-deduce-mult.C
+ 18a2431f49a5d003b8c4af0ee1ee26fb gcc/testsuite/g++.dg/cpp1y/lambda-generic-cfun.C
+ 043e19917f87f2b2acd754fc6d7db469 gcc/testsuite/g++.dg/cpp1y/lambda-generic-const1.C
+ 565bd59fb2dca8cbcfbfa5b7e1e94368 gcc/testsuite/g++.dg/cpp1y/lambda-generic-const2.C
+ 2e80b291e01a2cfa45ff49e595eefeb5 gcc/testsuite/g++.dg/cpp1y/lambda-generic-conv1.C
++4826d92e5c4d99fa506ff2e846ff01a4 gcc/testsuite/g++.dg/cpp1y/lambda-generic-conv2.C
++78cdb2dc3c8d671d96c375fa61f96dc5 gcc/testsuite/g++.dg/cpp1y/lambda-generic-conv3.C
+ 254c0618a7c86ead274dccfd78d8434f gcc/testsuite/g++.dg/cpp1y/lambda-generic-dep.C
+ 82fea772a2540cf9ab702c17cc2cdb54 gcc/testsuite/g++.dg/cpp1y/lambda-generic-ice1.C
+ 767d5be8b02f5e7228313580ecdc27bf gcc/testsuite/g++.dg/cpp1y/lambda-generic-ice2.C
+ fd449c2760b279bd0767e28da8a563bf gcc/testsuite/g++.dg/cpp1y/lambda-generic-ice3.C
+ 2d18bbc76edb8b7a9ae068d833d222fb gcc/testsuite/g++.dg/cpp1y/lambda-generic-ice4.C
+ 3982e2c97cd56293f3566844b67df18c gcc/testsuite/g++.dg/cpp1y/lambda-generic-mixed.C
++db3760d317d0220aeddc9a1ce4072105 gcc/testsuite/g++.dg/cpp1y/lambda-generic-static1.C
++c6cfff44332b8bfb7c52ace4e1af76c5 gcc/testsuite/g++.dg/cpp1y/lambda-generic-static2.C
+ 06ba6684e3759115ec5098f38667687b gcc/testsuite/g++.dg/cpp1y/lambda-generic-trailing1.C
+ c175c183205acb7386648c9340cb5b77 gcc/testsuite/g++.dg/cpp1y/lambda-generic-udt.C
+ 7515a5372d247dd5a94ef0626c25c2ae gcc/testsuite/g++.dg/cpp1y/lambda-generic-uneval1.C
+@@ -11766,6 +11752,7 @@
+ 7d97ba4392709fc8da484e897e085d27 gcc/testsuite/g++.dg/cpp1y/paren1.C
+ b37062a8a2160ab7a8f6b2faf63a7687 gcc/testsuite/g++.dg/cpp1y/paren2.C
+ e8c6da7fb812f06074a9399c95d62136 gcc/testsuite/g++.dg/cpp1y/paren3.C
++86a0b848e4db7d7f6ee1c78dcc897448 gcc/testsuite/g++.dg/cpp1y/paren4.C
+ a59e5fd28eae5235838080483b6939a6 gcc/testsuite/g++.dg/cpp1y/phoobhar.h
+ 7d18afb36bcaa55af2030c6546d5df38 gcc/testsuite/g++.dg/cpp1y/pr57640.C
+ c4165eafc91468f7acbe5ba99603b2e7 gcc/testsuite/g++.dg/cpp1y/pr57644.C
+@@ -11863,7 +11850,8 @@
+ 1d11dd14feca38229a393d32dcdfc3d2 gcc/testsuite/g++.dg/cpp1y/var-templ36.C
+ 69d95f597d98b91cb3856be43d3c5546 gcc/testsuite/g++.dg/cpp1y/var-templ37.C
+ 8794fe86c499aa19549c780c79aa368a gcc/testsuite/g++.dg/cpp1y/var-templ38.C
+-f050d11349ddbf7b7819f451dc9afd8d gcc/testsuite/g++.dg/cpp1y/var-templ39.C
++8d67f45e619e5e401002587bef8da3a5 gcc/testsuite/g++.dg/cpp1y/var-templ39.C
++8fbb09c96293e0ad0adec02f8c333330 gcc/testsuite/g++.dg/cpp1y/var-templ39a.C
+ a82697cf228f6c067aa7a0fdefbfe94c gcc/testsuite/g++.dg/cpp1y/var-templ4.C
+ bb4283f25d1a9ee27311f1ab54256222 gcc/testsuite/g++.dg/cpp1y/var-templ40.C
+ da28be896a54e4517281f1dced095bee gcc/testsuite/g++.dg/cpp1y/var-templ42.C
+@@ -11876,6 +11864,8 @@
+ 6795aca168270525552bd48975a98225 gcc/testsuite/g++.dg/cpp1y/var-templ49.C
+ 34e14d27e3c00f201eeb1fb1d4d286c1 gcc/testsuite/g++.dg/cpp1y/var-templ5.C
+ 5160d45ceedf6faed4671f12ca9eae37 gcc/testsuite/g++.dg/cpp1y/var-templ50.C
++868d0756ba26f1a2a91e775d64bad123 gcc/testsuite/g++.dg/cpp1y/var-templ51.C
++145d4d5f8a5e4afaf223d9a444d14037 gcc/testsuite/g++.dg/cpp1y/var-templ52.C
+ 46f96806c3f041172407dd6ff7943dc8 gcc/testsuite/g++.dg/cpp1y/var-templ6.C
+ 3c670164f1a7f8f91ef1db2f80526182 gcc/testsuite/g++.dg/cpp1y/var-templ7.C
+ 7490ba7f2bf9511118a48f52e8c4ceed gcc/testsuite/g++.dg/cpp1y/var-templ8.C
+@@ -11894,8 +11884,9 @@
+ 68f716938002307e7dcda9d5dc357f14 gcc/testsuite/g++.dg/cpp1z/attributes-enum-1.C
+ c0f76eabaeee19f702ca129c32355700 gcc/testsuite/g++.dg/cpp1z/attributes-enum-1a.C
+ 98b1106ed209b91da77baabfe32a0221 gcc/testsuite/g++.dg/cpp1z/cplusplus.C
+-90ef12e7060fa023a9c65acb99fbd917 gcc/testsuite/g++.dg/cpp1z/feat-cxx1z.C
++b78ef62cdf62c62127e6ef6b082f3bbf gcc/testsuite/g++.dg/cpp1z/feat-cxx1z.C
+ f6bf72fc22cf2e0b2625b0da029798a4 gcc/testsuite/g++.dg/cpp1z/fold-ice1.C
++89cd455176ece385a64d1d1b18aa7468 gcc/testsuite/g++.dg/cpp1z/fold-mangle.C
+ 31887e84574fe8c28417b43ab6292361 gcc/testsuite/g++.dg/cpp1z/fold1.C
+ ec8f049d9f6e3cc6a0a94adeaf70a315 gcc/testsuite/g++.dg/cpp1z/fold2.C
+ 402016faa295175165f8ebd8f741b826 gcc/testsuite/g++.dg/cpp1z/fold3.C
+@@ -12078,6 +12069,7 @@
+ 5c1e2db64783ad9531a0a03f6e23da46 gcc/testsuite/g++.dg/debug/pr56819.C
+ 41269ba367aaa19e5abac5932fdc247c gcc/testsuite/g++.dg/debug/pr65678.C
+ ccda43f2f659360264083e64ebc66d22 gcc/testsuite/g++.dg/debug/pr70271.C
++441b2b85c00e5fb81636a85d6732eb55 gcc/testsuite/g++.dg/debug/pr71057.C
+ a5e8d546d53a780cc3eb41574ea9f263 gcc/testsuite/g++.dg/debug/ra1.C
+ c3f392076ad11f8768ef0321b89abd5f gcc/testsuite/g++.dg/debug/static1.C
+ 7e13d86d33b17cfb7cdf61b7b8cca961 gcc/testsuite/g++.dg/debug/template1.C
+@@ -12630,6 +12622,7 @@
+ 53628223a07c6bbfb1cd7aef3f2b93cf gcc/testsuite/g++.dg/ext/flexary13.C
+ c4a658a25ef8a25aeef375a3ce711fa2 gcc/testsuite/g++.dg/ext/flexary14.C
+ aaba8fe44d3e6fec2f01feeb83885ba8 gcc/testsuite/g++.dg/ext/flexary15.C
++858ff0064f04a2ffe669c5f8458aa820 gcc/testsuite/g++.dg/ext/flexary16.C
+ fa0fdbfe242e37c8962c867f656e7e36 gcc/testsuite/g++.dg/ext/flexary2.C
+ 21926590c31816347bbb7ba438127f63 gcc/testsuite/g++.dg/ext/flexary3.C
+ c59d230f31793ac10c850433a29a2a25 gcc/testsuite/g++.dg/ext/flexary4.C
+@@ -12946,6 +12939,7 @@
+ 586098ef0e0e0ff1300efeabda4cf0fa gcc/testsuite/g++.dg/ext/vector29.C
+ 06e44a4208434952189cfd9cd55ae2d8 gcc/testsuite/g++.dg/ext/vector3.C
+ 6ca255361ad69ad75b523ad0b133b0fb gcc/testsuite/g++.dg/ext/vector30.C
++c3b38049951f0b2eddec58e423441ed3 gcc/testsuite/g++.dg/ext/vector31.C
+ 1d6b45dce331a414b31b64c5104ab383 gcc/testsuite/g++.dg/ext/vector4.C
+ 3231264b4b96091ab8a2351e76707e8d gcc/testsuite/g++.dg/ext/vector5.C
+ 9dca9632e59d179ee1b85a181a34cae7 gcc/testsuite/g++.dg/ext/vector6.C
+@@ -13102,6 +13096,7 @@
+ aba75e24bfe044cbb1a628f1d1daccc3 gcc/testsuite/g++.dg/gomp/declare-simd-3.C
+ 7cee1de25d2f28d3760c1bdfb7d95411 gcc/testsuite/g++.dg/gomp/declare-simd-4.C
+ d66c2d955608b28091f45938dce39989 gcc/testsuite/g++.dg/gomp/declare-simd-5.C
++5a587ac99f134c07ba81955351d61058 gcc/testsuite/g++.dg/gomp/declare-simd-6.C
+ 634bd3d929883e4c691a682ea0817a3e gcc/testsuite/g++.dg/gomp/declare-target-1.C
+ c75b0d654d83deb86c542efca3d79c2b gcc/testsuite/g++.dg/gomp/depend-1.C
+ cdd29f4ee662c46448400d10d8f0535c gcc/testsuite/g++.dg/gomp/depend-2.C
+@@ -13243,6 +13238,7 @@
+ 69587a534832b53372f1e04087c04986 gcc/testsuite/g++.dg/gomp/pr67514.C
+ 55299f8d5853e349499aeed5c702a80a gcc/testsuite/g++.dg/gomp/pr67522.C
+ 1c935120e3c1e7d165ea068f57519a6e gcc/testsuite/g++.dg/gomp/pr67523.C
++79e222486ea33d87026b4ecac4bb3593 gcc/testsuite/g++.dg/gomp/pr71941.C
+ d2c2484d4d1236326efc32a01fddaa03 gcc/testsuite/g++.dg/gomp/predetermined-1.C
+ edac71d2b358ecd6e646fece69c5426d gcc/testsuite/g++.dg/gomp/private-1.C
+ d447246d410ae61ed9f733998e77b958 gcc/testsuite/g++.dg/gomp/reference-1.C
+@@ -13635,6 +13631,7 @@
+ a5a0c6bb188e4c01d4db2d84a5014752 gcc/testsuite/g++.dg/init/pr66857.C
+ 788ed5b002d14f945d06c72d6b7c78bc gcc/testsuite/g++.dg/init/pr69658.C
+ 154196e0320831a54c0ed5e880a704cd gcc/testsuite/g++.dg/init/pr70501.C
++effadbfc637d03ffccebf5ad6b37c6c0 gcc/testsuite/g++.dg/init/pr71516.C
+ 697d82f637fb8839d98efadd58ededf5 gcc/testsuite/g++.dg/init/ptrfn1.C
+ c3eaccdcf8e35f944dee4d4b3d720336 gcc/testsuite/g++.dg/init/ptrfn2.C
+ 111716aa5bd4c456321772f776bd97d1 gcc/testsuite/g++.dg/init/ptrfn3.C
+@@ -13781,6 +13778,7 @@
+ 890af13d278e4e0706986dbc2c5a1884 gcc/testsuite/g++.dg/ipa/ipa-icf-5.C
+ 97e97070da1c97a8b6352ba2dbe100c3 gcc/testsuite/g++.dg/ipa/ipa-icf-6.C
+ baa7a26fbd7f93011660ae486b2d5a03 gcc/testsuite/g++.dg/ipa/ipa-pta-1.C
++10ce8060f456afad572b21a436f24c5c gcc/testsuite/g++.dg/ipa/ipa-pta-2.C
+ dce8034edae4f3ebb13a737d288cc800 gcc/testsuite/g++.dg/ipa/ivinline-1.C
+ 394623fa3c8fc8afefe76c7e05bcd23d gcc/testsuite/g++.dg/ipa/ivinline-2.C
+ 4ade5754b9cadd69737394051664462b gcc/testsuite/g++.dg/ipa/ivinline-3.C
+@@ -14018,6 +14016,7 @@
+ bcba89d3ec64e8fc005f26cebc29ef75 gcc/testsuite/g++.dg/lookup/redecl1.C
+ a0c29cb4b5f7577e6f70badabcf54df5 gcc/testsuite/g++.dg/lookup/scope-operator1.C
+ ac54cbb864f44961ac42e88050c9ad49 gcc/testsuite/g++.dg/lookup/scoped1.C
++bf3eaff26a33ccd4611b5f6e55765a4d gcc/testsuite/g++.dg/lookup/scoped10.C
+ b7a658adf99cb82ba017f02f1f2411c6 gcc/testsuite/g++.dg/lookup/scoped2.C
+ fd5b1d6b45ff24d721908d389585b869 gcc/testsuite/g++.dg/lookup/scoped3.C
+ aa72bf12de95e37fe79a3293544473d4 gcc/testsuite/g++.dg/lookup/scoped4.C
+@@ -14025,6 +14024,7 @@
+ d0e63df38adea95bde4f29a4a8adbd7a gcc/testsuite/g++.dg/lookup/scoped6.C
+ 36c8df686ba39d71b24a97d15b78bcba gcc/testsuite/g++.dg/lookup/scoped7.C
+ 26af3964407b493bd173a74dadeb7ffb gcc/testsuite/g++.dg/lookup/scoped8.C
++6369d16eb28b1bd2774c54434aaec082 gcc/testsuite/g++.dg/lookup/scoped9.C
+ 2b1b09d91910d20eece0379cd7533859 gcc/testsuite/g++.dg/lookup/strong-using-1.C
+ 9cf5f616cd7d12356a4b60ef67aaf1e1 gcc/testsuite/g++.dg/lookup/strong-using-2.C
+ 7da1d317c0e74ab901f17a10189784da gcc/testsuite/g++.dg/lookup/strong-using-3.C
+@@ -14592,6 +14592,12 @@
+ 3cc6fd0213a86e9af54303b476324b4f gcc/testsuite/g++.dg/opt/pr70245.C
+ 3ca6d038cb6338c3f99ac2cf4bb8b829 gcc/testsuite/g++.dg/opt/pr70245.h
+ 4c279781e65c3062bc3ebe4f9a883ad8 gcc/testsuite/g++.dg/opt/pr70641.C
++1248cf51218287e0763e9bafddb6e95e gcc/testsuite/g++.dg/opt/pr70847.C
++b4565019d3f57b4cde7d76aea63e2b00 gcc/testsuite/g++.dg/opt/pr71100.C
++2683b031136335ebc445306bbda40ed6 gcc/testsuite/g++.dg/opt/pr71210-1.C
++e8fd45f660a33add25be711bbf9a8aed gcc/testsuite/g++.dg/opt/pr71210-2.C
++ea8361ea831bc7d6110a725ab74d2721 gcc/testsuite/g++.dg/opt/pr71387.C
++a380c45913d5ec3d5feed82fd2ba5c78 gcc/testsuite/g++.dg/opt/pr71528.C
+ 90bdbfd9313461944756a9e9f01ce788 gcc/testsuite/g++.dg/opt/pr7503-1.C
+ 1451eba24eea82cbd0c1ab87885c0f77 gcc/testsuite/g++.dg/opt/preinc1.C
+ 0841088f825be785d32663d712ecf675 gcc/testsuite/g++.dg/opt/ptrintsum1.C
+@@ -14803,6 +14809,7 @@
+ 88d3ce293bea84b74d7f26a42a8538fb gcc/testsuite/g++.dg/other/gc4.C
+ 47195a1b7ad4c24c5ccc7cbf50e26bb0 gcc/testsuite/g++.dg/other/gc5.C
+ 3ca5017faf45f39326ff4e30a1ec1ba8 gcc/testsuite/g++.dg/other/i386-1.C
++9913a24914ce11f6a0606c70ed58cb96 gcc/testsuite/g++.dg/other/i386-10.C
+ 76d10b67eca4193b848abdfb0dbf492a gcc/testsuite/g++.dg/other/i386-2.C
+ ad4545acd2416049630459a66f6c3f86 gcc/testsuite/g++.dg/other/i386-3.C
+ a4ad4c2cb3c1448496351241a77aedb7 gcc/testsuite/g++.dg/other/i386-4.C
+@@ -14897,6 +14904,7 @@
+ 3634dbc3147618af0685ced6e33189ea gcc/testsuite/g++.dg/other/pr63815.C
+ edba4dc64424b99c4e6984f1aa7e9507 gcc/testsuite/g++.dg/other/pr66130.C
+ 335c58f031e8af025ac6bd25a8f5e0ed gcc/testsuite/g++.dg/other/pr67065.C
++3c357334529bfcf67faa2a847f3c9290 gcc/testsuite/g++.dg/other/pr71728.C
+ 2b96e0cda3aaa703c284fca6a0dd72c9 gcc/testsuite/g++.dg/other/pragma-re-1.C
+ bdec0c9208af6ee3a9ab1f2c07d3ba19 gcc/testsuite/g++.dg/other/pragma-re-2.C
+ f804e6064a0c7cd94d73f58ba8f6e5e0 gcc/testsuite/g++.dg/other/profile1.C
+@@ -15422,6 +15430,7 @@
+ 5cf1aa6b471b7c8c4120c7b9642955c6 gcc/testsuite/g++.dg/parse/pr68722.C
+ af9e56882c04892fe78e6734f13353e2 gcc/testsuite/g++.dg/parse/pr69628.C
+ 1e79347577849ae03e3a20e2fc6247ff gcc/testsuite/g++.dg/parse/pr70635.C
++5eb3f5d17e121a7a8f7884b589a7a7ce gcc/testsuite/g++.dg/parse/pr71909.C
+ 5a9d33aff7826f90760a0154af35d9f0 gcc/testsuite/g++.dg/parse/pragma1.C
+ b8553036b01aadac9e932e75221336ae gcc/testsuite/g++.dg/parse/pragma2.C
+ d516a5d017b9be02cd665abb61b0fbaf gcc/testsuite/g++.dg/parse/pragma3.C
+@@ -15669,9 +15678,12 @@
+ 29300174b10233fd47c932d1ffd4c3bf gcc/testsuite/g++.dg/pr69123.C
+ 07ceb93faa4d6543359b7c47e9a5e94a gcc/testsuite/g++.dg/pr69379.C
+ e77af829a8368cadb2874c601ccda7ee gcc/testsuite/g++.dg/pr69667.C
+-514f19a372e6da2045ad3ac8a01eff0a gcc/testsuite/g++.dg/pr70098.C
++6574022bacba25e4efad4b7c4931c69a gcc/testsuite/g++.dg/pr70098.C
+ b6486240b7f881b41363b5c5aed08fef gcc/testsuite/g++.dg/pr70590-2.C
+ 78887d1698e74e4fca9c756431fc9a37 gcc/testsuite/g++.dg/pr70590.C
++0b728dae13a5f48195e47018a83c4f35 gcc/testsuite/g++.dg/pr71184.C
++dd5b895f9e8e377b3fc861eecf9bdbf7 gcc/testsuite/g++.dg/pr71389.C
++bb847cc20ee8eeae077a40b58e2964fc gcc/testsuite/g++.dg/pr71624.C
+ d038107e5b87bb2651ccfef7fa33748a gcc/testsuite/g++.dg/predict-loop-exit-1.C
+ b091c5510d946f61175720e0e6a70c8e gcc/testsuite/g++.dg/predict-loop-exit-2.C
+ 89ad4872e69c75752e361c89ce72b02b gcc/testsuite/g++.dg/predict-loop-exit-3.C
+@@ -16066,6 +16078,7 @@
+ c2f7a35b429490ab54f2fba257ca0dd9 gcc/testsuite/g++.dg/template/defarg19.C
+ 21ce3e77355010aaab1b59936da8bfbb gcc/testsuite/g++.dg/template/defarg2.C
+ 307285b77c17f229ecbeb4c647090190 gcc/testsuite/g++.dg/template/defarg20.C
++c96940bb22962f4c0c4140417e941221 gcc/testsuite/g++.dg/template/defarg21.C
+ e55baeaf118c452b9f707b8236ee86b1 gcc/testsuite/g++.dg/template/defarg3.C
+ 64d2588370b2c020d9d5828deadfc7dc gcc/testsuite/g++.dg/template/defarg4.C
+ 84d085b3ed907df1747cc523efd8d714 gcc/testsuite/g++.dg/template/defarg5.C
+@@ -16259,6 +16272,7 @@
+ fa72543a9a7163dc659966b7f85022ea gcc/testsuite/g++.dg/template/friend61.C
+ eee225d465c763fca3009704a441430f gcc/testsuite/g++.dg/template/friend61a.C
+ c83fbbe1bf313e9ff650368a049b6600 gcc/testsuite/g++.dg/template/friend61b.C
++0546ae6263680a8b8e42b5726f432e63 gcc/testsuite/g++.dg/template/friend62.C
+ 1d4f923241bfe8578940f39c34f80d7c gcc/testsuite/g++.dg/template/friend7.C
+ ceb858e95982ac0af2e9168f31aea229 gcc/testsuite/g++.dg/template/friend8.C
+ 59b5bf61b7f6210d3cf3b9b45692794a gcc/testsuite/g++.dg/template/friend9.C
+@@ -16543,6 +16557,8 @@
+ af6d997be6d23572000a1f53fb362c54 gcc/testsuite/g++.dg/template/pr69091.C
+ 74c16422bfee14becfdab59426868fb7 gcc/testsuite/g++.dg/template/pr69961a.C
+ 2bb8ec1b3640d593c78682666bf1f95a gcc/testsuite/g++.dg/template/pr69961b.C
++fd9d0d596049d0cdf35f01b62e86ae81 gcc/testsuite/g++.dg/template/pr70466-1.C
++a351a9dbecc556fb14937111d4035d00 gcc/testsuite/g++.dg/template/pr70466-2.C
+ 18029bea1be37e44787c856e7688884a gcc/testsuite/g++.dg/template/pr70610-2.C
+ a02fabd2632ab8c07600d017af625b9d gcc/testsuite/g++.dg/template/pr70610-3.C
+ f85232cc2d2ce2406ad9221174563c83 gcc/testsuite/g++.dg/template/pr70610-4.C
+@@ -17052,6 +17068,7 @@
+ 2023e08d493ba5b9b6b027ead9dbcdfb gcc/testsuite/g++.dg/tm/pr58635-2.C
+ c9e5bbfe98ec7fbaa16a15a1f925bb18 gcc/testsuite/g++.dg/tm/pr60004.C
+ 106a3fd65d1feeb38d0f2a3224a6087b gcc/testsuite/g++.dg/tm/pr67811.C
++f20200faa0befb0bfc51cc6eb591119c gcc/testsuite/g++.dg/tm/pr71909.C
+ 3081869c37283a01aeadd31d8c3a912d gcc/testsuite/g++.dg/tm/pretty-print1.C
+ 247e972c9babb265ea63db256a00ff3e gcc/testsuite/g++.dg/tm/static_cast1.C
+ ce59808ad2521265d21615e9fd232ebd gcc/testsuite/g++.dg/tm/sync1.C
+@@ -17386,6 +17403,11 @@
+ 3e80469d72e0d17bb9473080988a1256 gcc/testsuite/g++.dg/torture/pr70251.C
+ a8995237f42d84212dd09e432dd3f071 gcc/testsuite/g++.dg/torture/pr70499.C
+ 742e71bf561b5af56ed84fc963a0fe07 gcc/testsuite/g++.dg/torture/pr70526.C
++256b51401f6858dc5a0cad2e0da871b1 gcc/testsuite/g++.dg/torture/pr71002.C
++561facc41670baebfb84a4231ec62bca gcc/testsuite/g++.dg/torture/pr71405.C
++874216a8c65d270dcf488d29a8847247 gcc/testsuite/g++.dg/torture/pr71448.C
++411a467861248626a89023d9cd86be57 gcc/testsuite/g++.dg/torture/pr71452.C
++6d87997ae70f613b7ae47faba21523d9 gcc/testsuite/g++.dg/torture/pr71874.C
+ 389892c1f2e87d69449479d1b053c70c gcc/testsuite/g++.dg/torture/predcom-1.C
+ d28910105d9c9253d94d70eacd5e19d4 gcc/testsuite/g++.dg/torture/pushpop_macro.C
+ a1b47b9c3e69d79d1895ebc4fd11032b gcc/testsuite/g++.dg/torture/stackalign/check.h
+@@ -17638,6 +17660,7 @@
+ f4706f41ca654ceb8586f65654dc9bed gcc/testsuite/g++.dg/ubsan/null-4.C
+ e33cd115b2a5b1796134963715ca2601 gcc/testsuite/g++.dg/ubsan/null-5.C
+ ebc4dd8d7b9c346d612ab748d0d8bda0 gcc/testsuite/g++.dg/ubsan/null-6.C
++9a6263b0a0fc24a8d910d2b11d215637 gcc/testsuite/g++.dg/ubsan/null-7.C
+ cefd426836ca36a8554ac0ad41946a30 gcc/testsuite/g++.dg/ubsan/object-size-1.C
+ a654df71119821a4303cc9fe0501191b gcc/testsuite/g++.dg/ubsan/pr59250.C
+ 420a6623146bb014dc1310134356d81f gcc/testsuite/g++.dg/ubsan/pr59306.C
+@@ -17666,6 +17689,8 @@
+ ce9a3608f9ea7f32723d27471f56a902 gcc/testsuite/g++.dg/ubsan/pr70135.C
+ 56810c4012d688f214e18664f2974426 gcc/testsuite/g++.dg/ubsan/pr70147-1.C
+ af8fe8f8c142ba4099bf3fd97c7fb5f4 gcc/testsuite/g++.dg/ubsan/pr70147-2.C
++1248cf51218287e0763e9bafddb6e95e gcc/testsuite/g++.dg/ubsan/pr70847.C
++3ad68deac55fd26921bbcc306e06b206 gcc/testsuite/g++.dg/ubsan/pr71393.C
+ 23b03c04f7b3df05a2e3c261dbfbc91d gcc/testsuite/g++.dg/ubsan/return-1.C
+ c729687b59770dc8f9e0991370cb1879 gcc/testsuite/g++.dg/ubsan/return-2.C
+ 40257a16173db28137a5538f88bfea0e gcc/testsuite/g++.dg/ubsan/return-3.C
+@@ -17740,6 +17765,7 @@
+ 98d320060b90cb4d7efb2ca7dd9ca6a7 gcc/testsuite/g++.dg/vect/simd-clone-4.cc
+ 4147d578711be9e486c8907900862fdd gcc/testsuite/g++.dg/vect/simd-clone-4.h
+ c3079a303a422fbdcc1f72b0e2a98a47 gcc/testsuite/g++.dg/vect/simd-clone-5.cc
++b8fb5b23ece050421d669915c600780b gcc/testsuite/g++.dg/vect/simd-clone-6.cc
+ 3bc95c24ca829b61efcb7f80670d3ab5 gcc/testsuite/g++.dg/vect/simd-mask-store-bool.cc
+ 3c7b50dc56c581720a466e94943ccdae gcc/testsuite/g++.dg/vect/slp-pr50413.cc
+ ba398e1bec8514d144840b9f8de00b90 gcc/testsuite/g++.dg/vect/slp-pr50819.cc
+@@ -17814,6 +17840,7 @@
+ d3017d025f43f9093bf016847e418a34 gcc/testsuite/g++.dg/warn/Wmissing-declarations-1.C
+ 050c0fd9eb9dcd48940d99ba2041761b gcc/testsuite/g++.dg/warn/Wmissing-field-initializers-1.C
+ 13048d07bf8630f21562df0b77b67343 gcc/testsuite/g++.dg/warn/Wno-div-by-zero.C
++7c3ea8d27e4d862f83fc6998269f6f42 gcc/testsuite/g++.dg/warn/Wno-narrowing1.C
+ 26f056d6de0144f7aed85c81b3e4f583 gcc/testsuite/g++.dg/warn/Wno-return-local-addr.C
+ e3b6729ae62aef0d9d8acd63677ef06e gcc/testsuite/g++.dg/warn/Wnonnull-compare-1.C
+ 79a3c427fc105036228222b1a6ea9772 gcc/testsuite/g++.dg/warn/Wnonnull-compare-2.C
+@@ -17867,6 +17894,7 @@
+ 6ac2e35b5e4a2de47ad29a14a6dbe103 gcc/testsuite/g++.dg/warn/Wparentheses-9.C
+ 18e91a351f8fd1aae42cc8fbbe2dcbc5 gcc/testsuite/g++.dg/warn/Wplacement-new-size-1.C
+ 6b2c96f7011ece11947155ec8924a6f8 gcc/testsuite/g++.dg/warn/Wplacement-new-size-2.C
++d384bb1bb46e31c69b6a5c612b417019 gcc/testsuite/g++.dg/warn/Wplacement-new-size-3.C
+ d61eea5f0486bf652aaee2370544ea0e gcc/testsuite/g++.dg/warn/Wplacement-new-size.C
+ 10ae80ca102a17979ad4df9d03d42f13 gcc/testsuite/g++.dg/warn/Wpointer-arith-1.C
+ bc5f141d5ba64d906981c425b810d3ed gcc/testsuite/g++.dg/warn/Wredundant-decls-spec.C
+@@ -23012,6 +23040,9 @@
+ 1906f2e6e6b20628e9f16d77bc066d28 gcc/testsuite/gcc.c-torture/compile/pr70263-1.c
+ d47f5879509ae9dfb39ea1ee1063230e gcc/testsuite/gcc.c-torture/compile/pr70355.c
+ 86500b6aaf9f75325f0cad332855ed1b gcc/testsuite/gcc.c-torture/compile/pr70633.c
++6aa2a7d0fe94be24238130841efe702b gcc/testsuite/gcc.c-torture/compile/pr70916.c
++97df20a3b66d4cb718ca2f94a7c64ec5 gcc/testsuite/gcc.c-torture/compile/pr71693.c
++6893a5c3e89b00abc6ffaaadabf19bbb gcc/testsuite/gcc.c-torture/compile/pr71916.c
+ 9611ffa8936d9c80d0a9ccde8dd093b2 gcc/testsuite/gcc.c-torture/compile/pret-arg.c
+ b9e6ce52b90320c1c3803c25113844c5 gcc/testsuite/gcc.c-torture/compile/pta-1.c
+ ed716c1d1727fc2c748162e0cbc4ee47 gcc/testsuite/gcc.c-torture/compile/ptr-conv-1.c
+@@ -24656,6 +24687,10 @@
+ 58bb262f9c1fe471c7bd11fc8440aac8 gcc/testsuite/gcc.c-torture/execute/pr70566.c
+ 7356d2dac86027ec545537d18ff109d1 gcc/testsuite/gcc.c-torture/execute/pr70586.c
+ a1122f266904033a972f83a856de97b9 gcc/testsuite/gcc.c-torture/execute/pr70602.c
++0a9fc76972569359d91049d017cdf51e gcc/testsuite/gcc.c-torture/execute/pr71494.c
++94c81d0c20f6b48a221fefb5a7c9f0f7 gcc/testsuite/gcc.c-torture/execute/pr71554.c
++1f4a197e0d6f4357f1917d680858eacb gcc/testsuite/gcc.c-torture/execute/pr71626-1.c
++2b843741017aa652b5af0855cf7945c3 gcc/testsuite/gcc.c-torture/execute/pr71626-2.c
+ 3a2dbae8c6dae23b46868ca068ba47d6 gcc/testsuite/gcc.c-torture/execute/pr7284-1.c
+ 85441b3599a9d20a4ede0f10c54a4e6b gcc/testsuite/gcc.c-torture/execute/printf-1.c
+ 54f80bf321bfe46d44040493d9821a03 gcc/testsuite/gcc.c-torture/execute/printf-chk-1.c
+@@ -25250,6 +25285,7 @@
+ ab3955f55aa596a98faf0528f22b1d0c gcc/testsuite/gcc.dg/alias-9.c
+ b87d726d798335bcf014c51ea61e9a4c gcc/testsuite/gcc.dg/align-1.c
+ ecaba7c928af85c280e63fa96b9b5e1b gcc/testsuite/gcc.dg/align-2.c
++6583b4f8147fde31faab62b525508999 gcc/testsuite/gcc.dg/align-3.c
+ b3869c9bd68bb9659f230f48bf56f83c gcc/testsuite/gcc.dg/always_inline.c
+ 5ad6d0d750af2e3c8488e96cfa1aa195 gcc/testsuite/gcc.dg/always_inline2.c
+ 99fe8a4ba9676a42a20bb593c81371e0 gcc/testsuite/gcc.dg/always_inline3.c
+@@ -26232,8 +26268,8 @@
+ 1e77dbdb1a2f17c79ae5421293c320fd gcc/testsuite/gcc.dg/const-1.c
+ 6ccf395fc674b370645bdd0d50fb25b8 gcc/testsuite/gcc.dg/const-elim-1.c
+ 8aeed4136d64b28976407e1f80bce896 gcc/testsuite/gcc.dg/const-elim-2.c
+-b73512af2bf6823cc97da864bfc84920 gcc/testsuite/gcc.dg/const-float128-ped.c
+-737e99e3ec08db1f5521d0ecc2431cc8 gcc/testsuite/gcc.dg/const-float128.c
++40322523d50e8ca68ce1454542758211 gcc/testsuite/gcc.dg/const-float128-ped.c
++88bbf89357957ad93147bfe868e6a9e3 gcc/testsuite/gcc.dg/const-float128.c
+ e3f3945c878b9cf4fa5b3f0074bd6302 gcc/testsuite/gcc.dg/const-float80-ped.c
+ e781844c1655d36c9b6e04d59aad8996 gcc/testsuite/gcc.dg/const-float80.c
+ d6841b339bfbaf4ab219c4c497889936 gcc/testsuite/gcc.dg/const-uniq-1.c
+@@ -26921,6 +26957,7 @@
+ 94f8101679e6cc4b9fabcf3f776ded40 gcc/testsuite/gcc.dg/debug/dwarf2/pr51410.c
+ 01ec5869a59f91af2fdeee3396a4b76f gcc/testsuite/gcc.dg/debug/dwarf2/pr53948.c
+ eb3e8d32cc98a65b9bf903f485425719 gcc/testsuite/gcc.dg/debug/dwarf2/pr66482.c
++3aefd6c464c0631839d12e370ea3b504 gcc/testsuite/gcc.dg/debug/dwarf2/pr71855.c
+ 8c1766fffa68df425fe8305ed4ddb614 gcc/testsuite/gcc.dg/debug/dwarf2/prod-options.c
+ 84c94e8435cec0cb1a4a8e83a9c3633d gcc/testsuite/gcc.dg/debug/dwarf2/short-circuit.c
+ fd5753c0c85e2e3c862b46c2f851ad80 gcc/testsuite/gcc.dg/debug/dwarf2/sso.c
+@@ -27508,8 +27545,11 @@
+ b0c5cb8db5ab29eb4607edcfaf632c3c gcc/testsuite/gcc.dg/goacc-gomp/goacc-gomp.exp
+ e301304e13590c1ce7f775ce00ef95b0 gcc/testsuite/gcc.dg/goacc/acc_on_device-1.c
+ e16a173a45eff735a99e16e66cc01685 gcc/testsuite/gcc.dg/goacc/goacc.exp
++9e00e7a94f979942198724398d213cee gcc/testsuite/gcc.dg/goacc/nested-function-1.c
++d28df196e898f3e95d6f476710c89624 gcc/testsuite/gcc.dg/goacc/nested-function-2.c
+ acdc22584322b69f4483834bf48a45e9 gcc/testsuite/gcc.dg/goacc/nvptx-merged-loop.c
+ 73513698286ba33d0b064ff8b57e6775 gcc/testsuite/gcc.dg/goacc/nvptx-sese-1.c
++75dd052bd164a3a9070c1d0861bc0e3c gcc/testsuite/gcc.dg/goacc/pr71373.c
+ 2f3333af08b8042445e79536694a34b4 gcc/testsuite/gcc.dg/gomp/appendix-a/a.1.1.c
+ 885f61f4895f1224def50fcf707b2f2e gcc/testsuite/gcc.dg/gomp/appendix-a/a.10.1.c
+ c8cf5f6a748356f3bcea8e2dbb2e4196 gcc/testsuite/gcc.dg/gomp/appendix-a/a.12.1.c
+@@ -27907,8 +27947,11 @@
+ f8f3d098512d881d68138c6f1e3a363f gcc/testsuite/gcc.dg/graphite/pr68809.c
+ bdbd7edf45b97574c83d3755df22a28b gcc/testsuite/gcc.dg/graphite/pr68953.c
+ d0f22c16c5fac5ae8f190b3564aba97d gcc/testsuite/gcc.dg/graphite/pr68976.c
++cbc1d72a5a486c20f3b581d86ceb6480 gcc/testsuite/gcc.dg/graphite/pr69067.c
++47d652714c7a00602400f743b5e3c11c gcc/testsuite/gcc.dg/graphite/pr69068.c
+ 4e7f8240209ca1b787c57a784dd3ab73 gcc/testsuite/gcc.dg/graphite/pr69292.c
+ 469d8e302d82650a54a8f0b48adb251a gcc/testsuite/gcc.dg/graphite/pr70045.c
++187adff90265612446489b184d1ca625 gcc/testsuite/gcc.dg/graphite/pr70956.c
+ 16574d3df752f79e2361bed11b712e31 gcc/testsuite/gcc.dg/graphite/run-id-1.c
+ 69c11dc302a921c92977db519167bec1 gcc/testsuite/gcc.dg/graphite/run-id-2.c
+ 84a75a861553ce658d85018a3ced0a6b gcc/testsuite/gcc.dg/graphite/run-id-3.c
+@@ -27976,6 +28019,7 @@
+ bc96d3d7a369ee1d75a9841b80312226 gcc/testsuite/gcc.dg/guality/param-2.c
+ 4f7560385c9b3bd900cc1de342ed58bc gcc/testsuite/gcc.dg/guality/param-3.c
+ 523107373abe1115fc7567ad1914508b gcc/testsuite/gcc.dg/guality/param-4.c
++f932e4faa7d538859c699e070447bc01 gcc/testsuite/gcc.dg/guality/param-5.c
+ 19bacc1e91869a8697eb548fb674e517 gcc/testsuite/gcc.dg/guality/pr36728-1.c
+ 15b728fbd163d9aa4e4d3a41ff5d237c gcc/testsuite/gcc.dg/guality/pr36728-2.c
+ 3a0a4f52233f47c7abff4081856aa824 gcc/testsuite/gcc.dg/guality/pr36728-3.c
+@@ -28288,6 +28332,7 @@
+ 3fa23bf649fb3d873b131ed5fb5ed9fe gcc/testsuite/gcc.dg/ipa/pr68035.c
+ 6391743d2f9ed0c57ef00442b79ff9fa gcc/testsuite/gcc.dg/ipa/pr68790.c
+ 47f323ada98e8576e87b3d61e280cf39 gcc/testsuite/gcc.dg/ipa/pr70306.c
++9e20144eec96000223a2e983ffcba9fa gcc/testsuite/gcc.dg/ipa/pr70646.c
+ 923d1086789aa370483859e89c2a5e1e gcc/testsuite/gcc.dg/ipa/propalign-1.c
+ c42a02d7f371ea4de7e4bb2088296655 gcc/testsuite/gcc.dg/ipa/propalign-2.c
+ b9df72c49860f187596351812c6e05be gcc/testsuite/gcc.dg/ipa/propalign-3.c
+@@ -30227,6 +30272,13 @@
+ ac328b834a1ea6428569ff38945772b0 gcc/testsuite/gcc.dg/pr70442.c
+ 36a35251047803a79950fef784d13ae4 gcc/testsuite/gcc.dg/pr70725.c
+ 99ff30c22aa2b72409036bea8bda66da gcc/testsuite/gcc.dg/pr70747.c
++0c7a5fc07d2ac3fe95b4a3f606e9fddc gcc/testsuite/gcc.dg/pr71006.c
++b2932869d7ba5888238dbb86f20e94de gcc/testsuite/gcc.dg/pr71071.c
++dc3c7225f47bd3f37227cbbb8d77804b gcc/testsuite/gcc.dg/pr71279.c
++9e22a8b7163e8cdad2514a0bcaaf73e3 gcc/testsuite/gcc.dg/pr71518.c
++79f760cb1168bdcad7ceef62cd0034c3 gcc/testsuite/gcc.dg/pr71558.c
++2d57cd18f3b5a4ce14ac9f867103994d gcc/testsuite/gcc.dg/pr71581.c
++0b5d052704c3f9b22ab6c09c3a2c44d1 gcc/testsuite/gcc.dg/pr71685.c
+ 8b7d73da2d5d78000716492365a85d5a gcc/testsuite/gcc.dg/pr8715.c
+ 3d08410b2dd57259aa63f0e1c64b376e gcc/testsuite/gcc.dg/pr8788-1.c
+ be04382a35ebb1cfae1b2168f1693a94 gcc/testsuite/gcc.dg/pr8835-1.c
+@@ -30411,6 +30463,7 @@
+ cc4ae3ffffb03645629e69a469281efb gcc/testsuite/gcc.dg/spellcheck-fields.c
+ ad32dc4c817caee29dda724b10b45399 gcc/testsuite/gcc.dg/spellcheck-options-1.c
+ 2d679bf081885df2fd43ceb67d70169a gcc/testsuite/gcc.dg/spellcheck-options-10.c
++44c49d832fbefb746e48d86f5808c52f gcc/testsuite/gcc.dg/spellcheck-options-12.c
+ 59ceb721847c724a4d56bf8a0d6c13d6 gcc/testsuite/gcc.dg/spellcheck-options-2.c
+ a2aa8beaba2a63cd762df20a0ff259f9 gcc/testsuite/gcc.dg/spellcheck-options-3.c
+ 533ff9109ecb7635d6ee9e965bed64d5 gcc/testsuite/gcc.dg/spellcheck-options-4.c
+@@ -30797,10 +30850,10 @@
+ 4db0a33ee448d1a3cb855abe7fd5dd87 gcc/testsuite/gcc.dg/torture/cris-volatile-1.c
+ 8e9f5b7c091bd1c8d9aad12b2fe2c7e8 gcc/testsuite/gcc.dg/torture/darwin-cfstring-3.c
+ 537c85296c73ca5b8d5644f2db0f4333 gcc/testsuite/gcc.dg/torture/dg-torture.exp
+-d0e69d6fa9e82fcd758b481dd8566f35 gcc/testsuite/gcc.dg/torture/float128-cmp-invalid.c
+-5347ab8c7c39b162eae4e5405881495f gcc/testsuite/gcc.dg/torture/float128-div-underflow.c
++58373efe3ee21c51efa41c133c58b857 gcc/testsuite/gcc.dg/torture/float128-cmp-invalid.c
++f866a0ec75af63274fded6d6e704572a gcc/testsuite/gcc.dg/torture/float128-div-underflow.c
+ 4c582f75a6506b2d756ac4784481eef0 gcc/testsuite/gcc.dg/torture/float128-exact-underflow.c
+-2fa501d06d2488d2bb44859676922e40 gcc/testsuite/gcc.dg/torture/float128-extend-nan.c
++7439f4476ac9bb24498a6a5c7da023c4 gcc/testsuite/gcc.dg/torture/float128-extend-nan.c
+ 9e1eb456af728c416f591eacdc4d7fb7 gcc/testsuite/gcc.dg/torture/float128-extendxf-underflow.c
+ 1d581b89a6131cdc2bd3dc2b34fc7fa9 gcc/testsuite/gcc.dg/torture/float128-mul-underflow.c
+ a0352637f21fc07fa0443b4c4e043743 gcc/testsuite/gcc.dg/torture/float128-truncdf-underflow.c
+@@ -30809,9 +30862,9 @@
+ 4a1efbe908d1984e5c7866446e422e72 gcc/testsuite/gcc.dg/torture/fp-int-convert-2.c
+ c7193c3a55681849a60a8019763547be gcc/testsuite/gcc.dg/torture/fp-int-convert-double.c
+ 740b8077c12192879798984879fe4c76 gcc/testsuite/gcc.dg/torture/fp-int-convert-float.c
+-f13160e874231fbfd5ad487b1a65a359 gcc/testsuite/gcc.dg/torture/fp-int-convert-float128-timode-2.c
+-0e198766e1144ee6a29b4e083231ef2b gcc/testsuite/gcc.dg/torture/fp-int-convert-float128-timode-3.c
+-48cf228cef8e597a9a40466b1f579f1f gcc/testsuite/gcc.dg/torture/fp-int-convert-float128-timode.c
++6faf10cae6549a32de0e939a1032515b gcc/testsuite/gcc.dg/torture/fp-int-convert-float128-timode-2.c
++4290c9342edd63f5948e29a0e4e61fbe gcc/testsuite/gcc.dg/torture/fp-int-convert-float128-timode-3.c
++0fc40435832160baeff38f387f5ab974 gcc/testsuite/gcc.dg/torture/fp-int-convert-float128-timode.c
+ bc0467f96f8340a44838f93689215df9 gcc/testsuite/gcc.dg/torture/fp-int-convert-float128.c
+ 80a27657c85bbe07fc57a74624f9f20a gcc/testsuite/gcc.dg/torture/fp-int-convert-float80-timode.c
+ 55b7dc542b219e0ef16ee001197d2ce4 gcc/testsuite/gcc.dg/torture/fp-int-convert-float80.c
+@@ -31472,6 +31525,12 @@
+ da4037959e336e19cb95c25f91f8eb52 gcc/testsuite/gcc.dg/torture/pr70628.c
+ 4bf720800970b360938f42a250aa3e59 gcc/testsuite/gcc.dg/torture/pr70724.c
+ 058fe139380690d2ec38aa882c1f7908 gcc/testsuite/gcc.dg/torture/pr70780.c
++e8b6639bf1f3ed2ec4f89afdb36f44f9 gcc/testsuite/gcc.dg/torture/pr70935.c
++b6bb0c63d9e968f4f16f282365518a50 gcc/testsuite/gcc.dg/torture/pr70941.c
++08b15e14c6c9f4cc6291f19fc8ba963b gcc/testsuite/gcc.dg/torture/pr71423.c
++0c398d952cf20fc83aec050f85d8a44b gcc/testsuite/gcc.dg/torture/pr71452.c
++d7822d9246b54abacbdc7d6230ab041d gcc/testsuite/gcc.dg/torture/pr71522.c
++b0020481b01ba2fea155b7e666817dc3 gcc/testsuite/gcc.dg/torture/pr71606.c
+ 62b28db4200d0c4e51bde8d1e5693886 gcc/testsuite/gcc.dg/torture/pr8081.c
+ d086c3946230ba05df33a45be4862730 gcc/testsuite/gcc.dg/torture/pta-callused-1.c
+ 39620328710fd9ff170741766805e426 gcc/testsuite/gcc.dg/torture/pta-escape-1.c
+@@ -32331,6 +32390,7 @@
+ 885c1be5e32bb9fbd61002b21649165d gcc/testsuite/gcc.dg/tree-ssa/pr69845-2.c
+ 6e6845a9fd535b1e4161176393d5993c gcc/testsuite/gcc.dg/tree-ssa/pr70232.c
+ f1ac7f1c1aea72571d0586fcaa61bef4 gcc/testsuite/gcc.dg/tree-ssa/pr70372.c
++f25359056dca264e17755adacd92210b gcc/testsuite/gcc.dg/tree-ssa/pr70919.c
+ 183e9199984b76de9f1701381d4f612d gcc/testsuite/gcc.dg/tree-ssa/predcom-1.c
+ e1366016e9a4c05dbd1cdb3f152b83dc gcc/testsuite/gcc.dg/tree-ssa/predcom-2.c
+ 49817baec76470758acdd34458c9fb91 gcc/testsuite/gcc.dg/tree-ssa/predcom-3.c
+@@ -32759,6 +32819,8 @@
+ b18ed34db76e8a818f24ae5532580fdb gcc/testsuite/gcc.dg/tree-ssa/vrp08.c
+ 00af09eb12b671fc3835354fe975d76f gcc/testsuite/gcc.dg/tree-ssa/vrp09.c
+ 8c9b46ae3e96ee0bd4ea529a368c310d gcc/testsuite/gcc.dg/tree-ssa/vrp10.c
++35a86d5c3d5d6dfdbf910fd80c544328 gcc/testsuite/gcc.dg/tree-ssa/vrp100.c
++43b49a2dc407364da07b46e140893140 gcc/testsuite/gcc.dg/tree-ssa/vrp101.c
+ 02186bb95ddef36513b909863c8d3ed8 gcc/testsuite/gcc.dg/tree-ssa/vrp11.c
+ 419ced6aac18d78614ce2296a1a6b660 gcc/testsuite/gcc.dg/tree-ssa/vrp12.c
+ 5c02e78e0a19d3b4ab362211af9c057d gcc/testsuite/gcc.dg/tree-ssa/vrp13.c
+@@ -32874,6 +32936,7 @@
+ 38f4467be27d0432adea9abcaf9cc366 gcc/testsuite/gcc.dg/typespec-1.c
+ b9d67dbc50419a82b76d70029936f329 gcc/testsuite/gcc.dg/ubsan/bounds-1.c
+ 8ef707e5f4c734c1b8be85269cd93d06 gcc/testsuite/gcc.dg/ubsan/bounds-2.c
++804ebe3c0a2fc929bc12b7e5c7c4098f gcc/testsuite/gcc.dg/ubsan/bounds-3.c
+ 7740693c7bb19d8fc6ab727a6ffbb65c gcc/testsuite/gcc.dg/ubsan/c-shift-1.c
+ 577cc36a854722ee2c73da1a6a6e2322 gcc/testsuite/gcc.dg/ubsan/c-shift-2.c
+ 2dbfddf9f012a91eb07b3c83841941a1 gcc/testsuite/gcc.dg/ubsan/c99-shift-1.c
+@@ -33468,7 +33531,7 @@
+ 909245027a67eed899841d65ca788c26 gcc/testsuite/gcc.dg/vect/pr66142.c
+ 94ba2ffa702e68550138d2586c87e9d7 gcc/testsuite/gcc.dg/vect/pr66251.c
+ fe55b7b3a0180146eb06495eed9f01a0 gcc/testsuite/gcc.dg/vect/pr66253.c
+-013ee9e98fd328680fc3f320b6adc0f3 gcc/testsuite/gcc.dg/vect/pr66636.c
++31de59c90b606bb80ee8c60486379cc0 gcc/testsuite/gcc.dg/vect/pr66636.c
+ 86169de4aac395fc7dd49fd713661f87 gcc/testsuite/gcc.dg/vect/pr66677.c
+ f4505aa6c41d3aa5d36144edc00b927e gcc/testsuite/gcc.dg/vect/pr66951.c
+ b0c728b20c3631680ab365d1bc5a0fd8 gcc/testsuite/gcc.dg/vect/pr67790.c
+@@ -33489,6 +33552,9 @@
+ 78b19e684925d21a4076e909bc9096cf gcc/testsuite/gcc.dg/vect/pr70138-2.c
+ 0918022cdf657101e47743d5c80133f3 gcc/testsuite/gcc.dg/vect/pr70354-1.c
+ 72d0484eead5cc2ea42d3951a7cd63f2 gcc/testsuite/gcc.dg/vect/pr70354-2.c
++05e2c1c28c7f8e8f0887ba6298c0b0cb gcc/testsuite/gcc.dg/vect/pr71259.c
++c03f1f02e7f7d30e17a072dbbe18a16b gcc/testsuite/gcc.dg/vect/pr71264.c
++bfbd314e67532ca23e292ce54b72762f gcc/testsuite/gcc.dg/vect/pr71823.c
+ 32d06c886c85516fbdce4ca1bd516496 gcc/testsuite/gcc.dg/vect/section-anchors-pr27770.c
+ 00b8b4e778221f5bedb59cfc69f6c9d7 gcc/testsuite/gcc.dg/vect/section-anchors-vect-69.c
+ 218f2e2bcfb33c838c80a2ae8c302759 gcc/testsuite/gcc.dg/vect/slp-1.c
+@@ -33581,7 +33647,7 @@
+ b1336a4a12ea0ec587c41f16332879bc gcc/testsuite/gcc.dg/vect/slp-widen-mult-s16.c
+ 31669e2cb35c18913f0b7f913f2a0f63 gcc/testsuite/gcc.dg/vect/slp-widen-mult-u8.c
+ 613196aaada7504743f2f4d92488772b gcc/testsuite/gcc.dg/vect/trapv-vect-reduc-4.c
+-5f4c323565e9614879f28bd4f7091c96 gcc/testsuite/gcc.dg/vect/tree-vect.h
++402f466a32d7175024ee9b8ec5e02d1b gcc/testsuite/gcc.dg/vect/tree-vect.h
+ 908fa625b55d7d283163e9dfb4e3cb97 gcc/testsuite/gcc.dg/vect/unswitch-loops-pr26969.c
+ 6520c3dd9e657028a89c31328634d22a gcc/testsuite/gcc.dg/vect/vec-scal-opt.c
+ 9b5d0a9d2e1a81f9454f0082b9f240b7 gcc/testsuite/gcc.dg/vect/vec-scal-opt1.c
+@@ -34977,7 +35043,7 @@
+ a8bddbe3eece3831dd80ac4cdf09f85e gcc/testsuite/gcc.target/aarch64/nofp_1.c
+ 16f10ec9128105b137b7139eec150171 gcc/testsuite/gcc.target/aarch64/noplt_1.c
+ a08d94353bf55af1d22441a406d830ca gcc/testsuite/gcc.target/aarch64/noplt_2.c
+-766dade6022566e9d591b71777427f70 gcc/testsuite/gcc.target/aarch64/noplt_3.c
++5adbb32c5ec104efca72061e09229b8f gcc/testsuite/gcc.target/aarch64/noplt_3.c
+ 03797fef944cc43885e1c80c25f368e4 gcc/testsuite/gcc.target/aarch64/pic-constantpool1.c
+ 8084b7f8a23ba9dc5bb389d20d29ec1b gcc/testsuite/gcc.target/aarch64/pic-small.c
+ dca6942a94e55d4ebfd32c380eb279ff gcc/testsuite/gcc.target/aarch64/pic-symrefplus.c
+@@ -35013,6 +35079,7 @@
+ 0eb5fd232a04413cc6f2bd5fd4c3c47d gcc/testsuite/gcc.target/aarch64/pr70120-2.c
+ 61ea50a51a3ed94b38acd7cd026cd077 gcc/testsuite/gcc.target/aarch64/pr70120-3.c
+ eb748e6de8945b3aa35ce6b22a073829 gcc/testsuite/gcc.target/aarch64/pr70398.c
++e7efe396ef16dbc7526785247ead6d84 gcc/testsuite/gcc.target/aarch64/pr70809_1.c
+ d3e6defa85b5cd4bb506306377e59a53 gcc/testsuite/gcc.target/aarch64/pragma_cpp_predefs_1.c
+ 1f95766b4ed5bfb5f2cf1f168a607a8d gcc/testsuite/gcc.target/aarch64/predefine_large.c
+ d38e476730748c653068e7cb2d8d6ca6 gcc/testsuite/gcc.target/aarch64/predefine_small.c
+@@ -35125,6 +35192,7 @@
+ a675084fb22386c9d27ff4bd900947af gcc/testsuite/gcc.target/aarch64/simd/vgetq_lane_u32_indices_1.c
+ 83cf956b7cb17956c744f7db38fe3416 gcc/testsuite/gcc.target/aarch64/simd/vgetq_lane_u64_indices_1.c
+ 099bad0585432f164e86079dbf03595e gcc/testsuite/gcc.target/aarch64/simd/vgetq_lane_u8_indices_1.c
++163cc0d113c2aef5ebd776e9553efbf1 gcc/testsuite/gcc.target/aarch64/simd/vminmaxnm_1.c
+ d3471e819805085e851c6ef99b412fc9 gcc/testsuite/gcc.target/aarch64/simd/vmla_f64.c
+ 76bd294b136cfc9375488944eb7f3ba0 gcc/testsuite/gcc.target/aarch64/simd/vmls_f64.c
+ f4f3b7ca3433b577e0c8b5a94bd6c11a gcc/testsuite/gcc.target/aarch64/simd/vmul_f64_1.c
+@@ -35466,7 +35534,7 @@
+ f87f898044cd78f2ebf530577d3cf7bb gcc/testsuite/gcc.target/aarch64/sync-op-release.c
+ 95f377cbd6e6173deb76efafbc90634f gcc/testsuite/gcc.target/aarch64/sync-op-release.x
+ 0168137c2b608147cb69283541a282f1 gcc/testsuite/gcc.target/aarch64/table-intrinsics.c
+-d5d082ded76a499c259ef0099673369a gcc/testsuite/gcc.target/aarch64/tail_indirect_call_1.c
++e259ba8323c6ae474eebb9f1a89e0a1d gcc/testsuite/gcc.target/aarch64/tail_indirect_call_1.c
+ 84204d959d96933bbdeb4d6f2a41264c gcc/testsuite/gcc.target/aarch64/target_attr_1.c
+ fa7117ece82474e6ad64b002ff16f391 gcc/testsuite/gcc.target/aarch64/target_attr_10.c
+ 495425b7459f1a259607e93ad71f13c5 gcc/testsuite/gcc.target/aarch64/target_attr_11.c
+@@ -35940,8 +36008,8 @@
+ 4b9f02224346043bca551bf81124f90b gcc/testsuite/gcc.target/arm/headmerge-2.c
+ b7fc1639bee153568add250d53ea751f gcc/testsuite/gcc.target/arm/identical-invariants.c
+ 6b37d9e567d7851e4e037dc6ffb87d9c gcc/testsuite/gcc.target/arm/ifcvt-size-check.c
+-5a6755f195973a69d09c58dc46caa013 gcc/testsuite/gcc.target/arm/interrupt-1.c
+-fc9965e47a9641a2b14bf7461100be94 gcc/testsuite/gcc.target/arm/interrupt-2.c
++b8c039847c1a73baf76ec3ceb27b1a11 gcc/testsuite/gcc.target/arm/interrupt-1.c
++80759aaae06958909d3fcc2edf843783 gcc/testsuite/gcc.target/arm/interrupt-2.c
+ 5fb126c6d9486e40aebcb4051dcefd2a gcc/testsuite/gcc.target/arm/iordi3-opt.c
+ 942d9efedfb779e0de45df976f1585de gcc/testsuite/gcc.target/arm/iordi_notdi-1.c
+ 88f7d27029fb631e0a53d287d5f7f83c gcc/testsuite/gcc.target/arm/its.c
+@@ -38203,6 +38271,8 @@
+ 32fee62df6d98765a5508d0d96c9eb65 gcc/testsuite/gcc.target/arm/pr69904.c
+ 1099addf5e35417ab2cda454cb2ec7f0 gcc/testsuite/gcc.target/arm/pr70278.c
+ 7b0dff48f8c89cbeb037deb0439e2888 gcc/testsuite/gcc.target/arm/pr70496.c
++48ed10e4b1714bfea3579dda3447be58 gcc/testsuite/gcc.target/arm/pr70830.c
++dc5c76ff01c564582222b3a2ea1fc21c gcc/testsuite/gcc.target/arm/pr71056.c
+ 321232597c3b16471c510b972ad557b4 gcc/testsuite/gcc.target/arm/pragma_attribute.c
+ cdf14fd079c2cd544c152c39ceb8ac66 gcc/testsuite/gcc.target/arm/pragma_cpp_fma.c
+ 639f9aee9e13df807ade02e6ee96c2d3 gcc/testsuite/gcc.target/arm/reg_equal_test.c
+@@ -38490,11 +38560,13 @@
+ 2028ceccf9f97e5e84e9adf6beb7597e gcc/testsuite/gcc.target/avr/exit-abort.h
+ 2931177f4aeff49d531d5474224448f6 gcc/testsuite/gcc.target/avr/pr46779-1.c
+ 572dc228e08385a1db0fcbab66dbaa4e gcc/testsuite/gcc.target/avr/pr46779-2.c
++d92831f37e30237d1dc568f585e4c2c9 gcc/testsuite/gcc.target/avr/pr50739.c
+ fc917fcfe7cfe97b5f27265d5960f0e6 gcc/testsuite/gcc.target/avr/pr52472.c
+ 421d2b9b36fa2496dce05d129d2c352b gcc/testsuite/gcc.target/avr/pr58545.c
+ 9e82df166e8b559cb56d2c4f48cbaf30 gcc/testsuite/gcc.target/avr/pr60991.c
+ 94f026369213dad7565383028ef6afcf gcc/testsuite/gcc.target/avr/pr65210.c
+ efe0a9fdac4e9b6140f4228816b9db64 gcc/testsuite/gcc.target/avr/pr67839.c
++292bf2dc33b5cfededd107fe1c0ebc88 gcc/testsuite/gcc.target/avr/pr71103.c
+ 881cb1836ddfc3105e0aacacc481aa09 gcc/testsuite/gcc.target/avr/progmem-error-1.c
+ 2eb3f167ae58b534e25afc1b94617746 gcc/testsuite/gcc.target/avr/progmem-error-1.cpp
+ 56de611fd29076ce9da389a853476819 gcc/testsuite/gcc.target/avr/progmem-warning-1.c
+@@ -38532,6 +38604,7 @@
+ 7f56c1b750dfe8d7e4128f15aa3eaffe gcc/testsuite/gcc.target/avr/torture/pr63633-ice-mult.c
+ 44584f49cd0975073be7b86102774077 gcc/testsuite/gcc.target/avr/torture/pr64331.c
+ dcabffeb42e88a442661b9e47e43a9c1 gcc/testsuite/gcc.target/avr/torture/pr64452.c
++ab53af0eb6dbfe2791a8ac1bbaf0c11f gcc/testsuite/gcc.target/avr/torture/pr71103-2.c
+ 21a45d34960ba9567b9f2483d22c843f gcc/testsuite/gcc.target/avr/torture/progmem-1.c
+ 564c71a894aff68e98d5c4a6db2b47ae gcc/testsuite/gcc.target/avr/torture/progmem-1.cpp
+ e3e1c41865f5287c9ff7e200745758fd gcc/testsuite/gcc.target/avr/torture/sat-hr-plus-minus.c
+@@ -39055,6 +39128,7 @@
+ b6e744a5c521873cc8be2dbb5f25790d gcc/testsuite/gcc.target/i386/avx-pr57233.c
+ ab15d222e706bd85c87c037d1e9b6f51 gcc/testsuite/gcc.target/i386/avx-pr63594-1.c
+ 7e490de1d2a70d21844cdc70c1546f49 gcc/testsuite/gcc.target/i386/avx-pr63594-2.c
++52efc199588007563ddb240d620c0f01 gcc/testsuite/gcc.target/i386/avx-pr71559.c
+ 4e3d37bb04b99394790fa9e8caddf790 gcc/testsuite/gcc.target/i386/avx-recip-vec.c
+ 02ae18a66bd7b76f7a651b896f066b70 gcc/testsuite/gcc.target/i386/avx-reduc-1.c
+ 772f703b19bb27d5947d136a2f72221e gcc/testsuite/gcc.target/i386/avx-rint-sfix-2-vec.c
+@@ -40324,10 +40398,22 @@
+ c88d598d6edb7c0c743c1dc16a2cc16d gcc/testsuite/gcc.target/i386/avx512f-broadcast-gpr-2.c
+ 499c39d2a4857a6b8d1b83ff9a57f0ff gcc/testsuite/gcc.target/i386/avx512f-ceil-sfix-vec-1.c
+ 043ca358343e3cd8084b52ddd77fc44b gcc/testsuite/gcc.target/i386/avx512f-ceil-sfix-vec-2.c
++0d4151fb05d050a11cf92664e9209d3a gcc/testsuite/gcc.target/i386/avx512f-ceil-vec-1.c
++e37893c9abd7382a7def7fd7274dcd64 gcc/testsuite/gcc.target/i386/avx512f-ceil-vec-2.c
++576df336a9d07a5da958ad681902765b gcc/testsuite/gcc.target/i386/avx512f-ceilf-sfix-vec-1.c
++8a2399e65f2d83ffe127b069db603b09 gcc/testsuite/gcc.target/i386/avx512f-ceilf-sfix-vec-2.c
++5b2ffd909879a410f6b4a26c1a8e5676 gcc/testsuite/gcc.target/i386/avx512f-ceilf-vec-1.c
++a4b256bf9501d70dd2182eab7f624689 gcc/testsuite/gcc.target/i386/avx512f-ceilf-vec-2.c
+ b40bff9ed49ef04a7cc3b22ed64e6ebb gcc/testsuite/gcc.target/i386/avx512f-check.h
+ 9db780c1e1f36c905bedd1fd077c44bc gcc/testsuite/gcc.target/i386/avx512f-dummy.c
+ 0de473631153a37da362d01bb42a56bd gcc/testsuite/gcc.target/i386/avx512f-floor-sfix-vec-1.c
+ f449e800780313dbf245bac9b4df7ed5 gcc/testsuite/gcc.target/i386/avx512f-floor-sfix-vec-2.c
++147745798007b9631a908f9e78411336 gcc/testsuite/gcc.target/i386/avx512f-floor-vec-1.c
++ae10c62470cea283261617eaed4fb4bd gcc/testsuite/gcc.target/i386/avx512f-floor-vec-2.c
++f3f3241adb2a57e08f624dd5dee7bde2 gcc/testsuite/gcc.target/i386/avx512f-floorf-sfix-vec-1.c
++36f5b8ecaa1309fea47c6565009b0e43 gcc/testsuite/gcc.target/i386/avx512f-floorf-sfix-vec-2.c
++2ab0eec1590b189f1c4f7fe79a454db5 gcc/testsuite/gcc.target/i386/avx512f-floorf-vec-1.c
++0e2a8a11b7939edbb836489d6d1ae8cb gcc/testsuite/gcc.target/i386/avx512f-floorf-vec-2.c
+ 093d097bdccce35c0df38597a7980d22 gcc/testsuite/gcc.target/i386/avx512f-gather-1.c
+ c8ce7ffcdf3dead2fa41448cdfd421d8 gcc/testsuite/gcc.target/i386/avx512f-gather-2.c
+ fba9972cad8dda541a5aa6eec12675fc gcc/testsuite/gcc.target/i386/avx512f-gather-3.c
+@@ -40386,6 +40472,15 @@
+ 381f53de01f1e9893e6903d9fac40b87 gcc/testsuite/gcc.target/i386/avx512f-pr63594-2.c
+ e97c0c19cafc88b7e3701f64c4ee5e2f gcc/testsuite/gcc.target/i386/avx512f-pr70059.c
+ d3690c9abdc1f96ff5183a85ab642fc8 gcc/testsuite/gcc.target/i386/avx512f-pr70421.c
++2bec208bfec85d6675be24e134318011 gcc/testsuite/gcc.target/i386/avx512f-pr71559.c
++ada32523be27898684e961dc8a530319 gcc/testsuite/gcc.target/i386/avx512f-rint-sfix-vec-1.c
++cf72f487882aa5cbbf2a730ccced5372 gcc/testsuite/gcc.target/i386/avx512f-rint-sfix-vec-2.c
++afd1c2340191f1da5c9f296da3642106 gcc/testsuite/gcc.target/i386/avx512f-rintf-sfix-vec-1.c
++3e831baba699ee173a9b5a01e94803d7 gcc/testsuite/gcc.target/i386/avx512f-rintf-sfix-vec-2.c
++e6b938f5b671843917a112a53a8a7860 gcc/testsuite/gcc.target/i386/avx512f-round-sfix-vec-1.c
++8ec0c6ee2d9b777f1da5706d825590f4 gcc/testsuite/gcc.target/i386/avx512f-round-sfix-vec-2.c
++7b55ada214bda7b0ec5755ad95771081 gcc/testsuite/gcc.target/i386/avx512f-roundf-sfix-vec-1.c
++8b538e860606539734b2c832df5c63eb gcc/testsuite/gcc.target/i386/avx512f-roundf-sfix-vec-2.c
+ 5158ac78802e368957a44c0f68b3b5d8 gcc/testsuite/gcc.target/i386/avx512f-rounding.c
+ 8eb7f0638fb7f71388916d2f90f89f93 gcc/testsuite/gcc.target/i386/avx512f-scatter-1.c
+ a705c702fd9fc8889d25e23e48746f5b gcc/testsuite/gcc.target/i386/avx512f-scatter-2.c
+@@ -40413,6 +40508,10 @@
+ 5e82ba7d6ba2bc9eb1ce979813f8d396 gcc/testsuite/gcc.target/i386/avx512f-setzero-pd-1.c
+ 47fee7cb6c90c9ac41c16bb5604a8121 gcc/testsuite/gcc.target/i386/avx512f-setzero-ps-1.c
+ 45e69165f83009060e6547672824081d gcc/testsuite/gcc.target/i386/avx512f-setzero-si512-1.c
++9f1be97318b9c5fe371f3dc949de070d gcc/testsuite/gcc.target/i386/avx512f-trunc-vec-1.c
++b74179ff996ee056241e1c5238385936 gcc/testsuite/gcc.target/i386/avx512f-trunc-vec-2.c
++22ac9712c0faaf3a282e62daa525a8a2 gcc/testsuite/gcc.target/i386/avx512f-truncf-vec-1.c
++75f99d519bd7e5ff40d6b2db26925c32 gcc/testsuite/gcc.target/i386/avx512f-truncf-vec-2.c
+ 06c531d6ffd8e2dc9c35db5a25f946d2 gcc/testsuite/gcc.target/i386/avx512f-typecast-1.c
+ 4ebc7b200a5160aa639c1a2a5b13a59f gcc/testsuite/gcc.target/i386/avx512f-vaddpd-1.c
+ 9c96dcbb2e757b7198aeba742c29a128 gcc/testsuite/gcc.target/i386/avx512f-vaddpd-2.c
+@@ -41870,6 +41969,7 @@
+ 9fa05574c82a870139a2524c4a9ea84c gcc/testsuite/gcc.target/i386/extract-6.c
+ b9e834d41c948e584d3f1cd39c3a5959 gcc/testsuite/gcc.target/i386/extract-insert-combining.c
+ 4ea9a85bc3f40b1ebeb0581bd96620de gcc/testsuite/gcc.target/i386/f16c-check.h
++019f466ae9c955f33a105efa418493cf gcc/testsuite/gcc.target/i386/fabsneg-1.c
+ c8661d46af4e71184c4904ae6ab3be9b gcc/testsuite/gcc.target/i386/fastcall-1.c
+ dbf3cc9b53b5e2d78a16330cbb9137e5 gcc/testsuite/gcc.target/i386/fastcall-sseregparm.c
+ ba226e9b8c6e56794bbc8f0d614ee8c6 gcc/testsuite/gcc.target/i386/fentry-override.c
+@@ -42002,7 +42102,7 @@
+ 7aef940035776cbf7ecabc540f63e33e gcc/testsuite/gcc.target/i386/hle-xor-rel-1.c
+ 27f333984dddefbecb9e2c639d7c3066 gcc/testsuite/gcc.target/i386/i386.exp
+ 7272fad8a3b85477e1b6954e2c36656d gcc/testsuite/gcc.target/i386/iamcu/abi-iamcu.exp
+-a75b4ffb604aa8a4ae22652bfd0455d0 gcc/testsuite/gcc.target/i386/iamcu/args.h
++824179ec90e1e4fdb872aed133f8d523 gcc/testsuite/gcc.target/i386/iamcu/args.h
+ 75e691882a781a986cbf2b848eacc017 gcc/testsuite/gcc.target/i386/iamcu/asm-support.S
+ a77c8e89ec538edb98eb4ac96da0db61 gcc/testsuite/gcc.target/i386/iamcu/defines.h
+ ced3e7fc25757fe027f4eacc904e6881 gcc/testsuite/gcc.target/i386/iamcu/macros.h
+@@ -43246,6 +43346,7 @@
+ 939cb1764c085054007c93662975586c gcc/testsuite/gcc.target/i386/pr68497.c
+ e783cba59986d894ea86576ba3dba9de gcc/testsuite/gcc.target/i386/pr68633.c
+ 86970bbb2e352887837e71a47d7d1b1b gcc/testsuite/gcc.target/i386/pr68647.c
++ef3f1636440165ca1e8cb1ff5a7fd262 gcc/testsuite/gcc.target/i386/pr68657.c
+ ed977b2e07a2b51f6a0171f6ad454c88 gcc/testsuite/gcc.target/i386/pr68674.c
+ 37cbc35061a580832dbc0ce4a1604d83 gcc/testsuite/gcc.target/i386/pr68680.c
+ 82889ba70f826af56789c8d9456aea07 gcc/testsuite/gcc.target/i386/pr68691.c
+@@ -43319,6 +43420,14 @@
+ 4fbcd5b3350355ed9b86fc2f9efebbcf gcc/testsuite/gcc.target/i386/pr70593.c
+ c4dd0a4466890153a50da4018a6840e3 gcc/testsuite/gcc.target/i386/pr70596.c
+ 63614f4a8e03a5baed97479f04e87900 gcc/testsuite/gcc.target/i386/pr70662.c
++b98041baad19fb37bd266fc10bd5bc38 gcc/testsuite/gcc.target/i386/pr70728.c
++0adbcabe255b36ad14e5fced66fe8a7c gcc/testsuite/gcc.target/i386/pr70750-1.c
++683fe4353ec025a523da5da93c42a89a gcc/testsuite/gcc.target/i386/pr70750-2.c
++1003b2af30448864252327bd08ddb57b gcc/testsuite/gcc.target/i386/pr70858.c
++c4f6a31f14b030cd9290db1df9495760 gcc/testsuite/gcc.target/i386/pr70876.c
++960f365b62f7bf57c12061d19e6822e3 gcc/testsuite/gcc.target/i386/pr70877.c
++61d0b6b6f6714737a9330dc7fae9ed11 gcc/testsuite/gcc.target/i386/pr71529.C
++a9c6395b5501af8f7e41af6ddea5ede0 gcc/testsuite/gcc.target/i386/pr71647.c
+ 849234c7a569c1e86023244bc5561263 gcc/testsuite/gcc.target/i386/pr9771-1.c
+ 24ceb6d5f3f5cde4b9d852839bdb98ae gcc/testsuite/gcc.target/i386/prefetchw-1.c
+ f11f4731c396f099373c033ab016a64f gcc/testsuite/gcc.target/i386/prefetchwt1-1.c
+@@ -43594,6 +43703,7 @@
+ bdbcd892d3f88fe1d7a07a2122cb928d gcc/testsuite/gcc.target/i386/sse2-pr57233.c
+ ab93046758268c8e3106f1bed7d4e8a5 gcc/testsuite/gcc.target/i386/sse2-pr63594-1.c
+ ae0d76797c5135e83ce818bce0003cfa gcc/testsuite/gcc.target/i386/sse2-pr63594-2.c
++f83e050eb6a6a72950d4ead5f0340a6a gcc/testsuite/gcc.target/i386/sse2-pr71559.c
+ 306e316bf36fd1022168fa5560198f41 gcc/testsuite/gcc.target/i386/sse2-psadbw-1.c
+ 31949c673c69db630bfaf04449d2677f gcc/testsuite/gcc.target/i386/sse2-pshufd-1.c
+ 2890c692e114956ac819984c965d389e gcc/testsuite/gcc.target/i386/sse2-pshufhw-1.c
+@@ -44861,6 +44971,7 @@
+ 59520e2fbc082b0ec9e051f4e7c804f9 gcc/testsuite/gcc.target/powerpc/440-nmaclhw-1.c
+ 1740cc665d8423adf426eedd3a8276eb gcc/testsuite/gcc.target/powerpc/440-nmaclhw-2.c
+ 5931e32eea29c20bbd53794357f5ebad gcc/testsuite/gcc.target/powerpc/980827-1.c
++3836ca1b6787ffdabd915481b096bf59 gcc/testsuite/gcc.target/powerpc/abs128-1.c
+ c441836462a082b52b8df4f3644b8ee1 gcc/testsuite/gcc.target/powerpc/altivec-1.c
+ 7594d13b6afbb5788fd3ff108fa1798d gcc/testsuite/gcc.target/powerpc/altivec-10.c
+ 87921f986b2e966c18eb11c96891c323 gcc/testsuite/gcc.target/powerpc/altivec-11.c
+@@ -44962,12 +45073,18 @@
+ 76368ec7aa2b631ffe91a52dbe0c7e7a gcc/testsuite/gcc.target/powerpc/compress-float-ppc-pic.c
+ caf3aba39c0565b4369f2e0263b16af5 gcc/testsuite/gcc.target/powerpc/compress-float-ppc.c
+ 6419d1aaea22c0476688f484ac4f0f43 gcc/testsuite/gcc.target/powerpc/const-compare.c
++1f7277471f008809ee3572d95097e11a gcc/testsuite/gcc.target/powerpc/copysign128-1.c
+ 4b60a8662648a73cedee85dd08e278eb gcc/testsuite/gcc.target/powerpc/cprophard.c
+ 4c8d1f97ae959775777a07679512e4b5 gcc/testsuite/gcc.target/powerpc/cpu-builtin-1.c
+ 1fb2215d04b688ce2fdb0faccd58b012 gcc/testsuite/gcc.target/powerpc/crypto-builtin-1.c
+ 14fe4a3bc84df2b97d9440c94d7c8339 gcc/testsuite/gcc.target/powerpc/crypto-builtin-2.c
+ 4e3992362b37b544083ac6eaeaa1acca gcc/testsuite/gcc.target/powerpc/ctz-1.c
+ 9266181f224f779baa6b98a2f3b171e8 gcc/testsuite/gcc.target/powerpc/ctz-2.c
++dcd67b030ac5a36c48772f45c9311a7a gcc/testsuite/gcc.target/powerpc/ctz-3.c
++531f016ec3779129874335e4d662190c gcc/testsuite/gcc.target/powerpc/ctz-4.c
++dff00811bdc4a0d32afb132f16084b8c gcc/testsuite/gcc.target/powerpc/darn-0.c
++a3b7e0d3cc77ae3e0b0aea94e91b58e5 gcc/testsuite/gcc.target/powerpc/darn-1.c
++3a484a34727d320db4da25fdd45adeeb gcc/testsuite/gcc.target/powerpc/darn-2.c
+ 965986b227062a2b8c664c916a71ad45 gcc/testsuite/gcc.target/powerpc/darwin-abi-1.c
+ 9a0e4836781f28669ddca26eb214c2b2 gcc/testsuite/gcc.target/powerpc/darwin-abi-10.c
+ 66e5cfd1b7491e37c0ef258d09b6634d gcc/testsuite/gcc.target/powerpc/darwin-abi-11.c
+@@ -44990,8 +45107,9 @@
+ a034d7a8bf265623a75800f01113e836 gcc/testsuite/gcc.target/powerpc/darwin-split-ld-stret.c
+ 548fc585bcbf766f23bef7319f0b0a18 gcc/testsuite/gcc.target/powerpc/darwin64-abi.c
+ 48cfcb8d91718cca2ec942edea2af044 gcc/testsuite/gcc.target/powerpc/dfmode_off.c
+-37c328fb120fbf675f6e47f6e2626f1f gcc/testsuite/gcc.target/powerpc/dform-1.c
+-062afe6d6e8128fc20cdfb56900ba68d gcc/testsuite/gcc.target/powerpc/dform-2.c
++f6511eaddea2d2d6dbb6428c8e9f5822 gcc/testsuite/gcc.target/powerpc/dform-1.c
++bf3533458cbe01184881116cdb4e822c gcc/testsuite/gcc.target/powerpc/dform-2.c
++571072f2c83195496efb8b6a3d7921a1 gcc/testsuite/gcc.target/powerpc/dform-3.c
+ f2e8694ab86e1d671840cc1b4d010431 gcc/testsuite/gcc.target/powerpc/dfp-builtin-1.c
+ 70b901aef4fec169c6e0277e173417fe gcc/testsuite/gcc.target/powerpc/dfp-builtin-2.c
+ edc590c61b2a5fd6c1f8da5e10b52099 gcc/testsuite/gcc.target/powerpc/dfp-dd-2.c
+@@ -44999,6 +45117,87 @@
+ 918f43d2707c381ec6a3c8f95d06ba7a gcc/testsuite/gcc.target/powerpc/dfp-td-2.c
+ d29a538f7ef7ada44a91b35380ca809c gcc/testsuite/gcc.target/powerpc/dfp-td-3.c
+ f99e26532b9bfe0b24631290281df325 gcc/testsuite/gcc.target/powerpc/dfp-td.c
++cc553c1019d680b116be75246855e5d0 gcc/testsuite/gcc.target/powerpc/dfp/dfp.exp
++03cc7e47a4479ec2055b9af5a2055522 gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-0.c
++6959ef5cd0438cde997e2af826ef2d8d gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-1.c
++8f82047dd5d13bd7808101a6cae2f96a gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-10.c
++758f013931d8cc97a719f89662e5f559 gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-11.c
++3b8212a7bdbfd7228a56f2142a77082d gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-12.c
++65380dd3577ee9e0a9b22cad78b2565c gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-13.c
++80d4ddd21f937e7f5cc6b1f54d5d3777 gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-14.c
++f2469b3c94f1f566011419ed3f6c54c3 gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-15.c
++9a597227f69d2f2ce0f06ce5d68e7e46 gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-16.c
++98c6e4c9b297b48f787a19ea13166fee gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-17.c
++6278ed0a2ff858f774d06e4fa6833c07 gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-18.c
++b50bd5c52b5f27cf4b0eee6c78eef867 gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-19.c
++68c7553b8028a8c430aa1c40c8f624da gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-2.c
++70da3a0ca0e2c3a4e51d3fbbbcd51313 gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-20.c
++fa0668a907811b58e0a0c4f409996798 gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-21.c
++abe6816951e1b9e949e8b911a3b180cd gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-22.c
++2c31ee89174617e3ba574448053a4776 gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-23.c
++3e0335739986a16a45163048e08ed006 gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-24.c
++a22bc1b3d29bb75f9e9f4da82ccf7000 gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-25.c
++f3a402fb571a70912ac64e7756e95960 gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-26.c
++48fd4c4f5b16ff2839d5091efc51bc1c gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-27.c
++0c90090dac2694d64341be49176ef464 gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-28.c
++d6c16f057f007ccdd7d443182f2f58ed gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-29.c
++36c01ff92130550706fac5b98007820d gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-3.c
++8e75374fe860fe454da6f1a680c53093 gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-30.c
++03f7f40b1ee77245c4ed1db91842709e gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-31.c
++134a1c8226d793ac94d0652e4b65ae51 gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-32.c
++67f1fa247cbccff554d48bb98247665d gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-33.c
++4edb941d627fbc374887b9f23e0f17e3 gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-34.c
++e5cc2dfa10fd84ddaad3943264a4ad7f gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-35.c
++418c5a05711f0f9acd8020fe4b275a27 gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-36.c
++df4d094eb16f0b1be12e3e39058baccf gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-37.c
++91d74d67304699dcaa0bcc5fea885968 gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-38.c
++99ba4e76415ae84299cdbd2e35e691be gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-39.c
++955c200f2a3a98a7dc3ce9fbf4a5d301 gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-4.c
++39dac34ae8d1af68556468f7c696b8aa gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-40.c
++a1cf710e376403fc2fa6bc0a774cd55a gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-41.c
++239e077c75c03ada560d0ef45ba111ed gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-42.c
++6a91cd2b45b92620b9b44d1e1d6c8a1d gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-43.c
++4c0f2cfece2b5a5e87eaa33c36b3b3c7 gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-44.c
++ff7d194ce3581accd4fd84661a45b7e5 gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-45.c
++b6c2800bdfb9e964c574e9f6647766b7 gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-46.c
++a384e1a8d2656a2eded5ddbbbb85944d gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-47.c
++1af4396cdb9e44ea23e581e3bc867f1a gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-48.c
++3a822bc78662a47bca3c325640886000 gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-49.c
++42702dc12a998715cd502e0f58c1a084 gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-5.c
++59131225f967e9974e4056c8724eb44d gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-50.c
++ca1730fffd35b4df6944a51eb8e6ecd0 gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-51.c
++6f290c19a8e109a3d2386b1bf4ec52fb gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-52.c
++e0c0eb7cd795a9e89a8d3bb2a7dae3c1 gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-53.c
++d17666a7a3f1f4012dea704edcb358c1 gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-54.c
++bc14720a9dc1307f25839ed1e2ea1df8 gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-55.c
++5f29e6111a8c4445a3d2e82737ed852c gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-56.c
++4ecd75bfc45420b8fe41eb1a6f75d1a6 gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-57.c
++0b3e0dd4599b91e7eb77033764ef84f4 gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-58.c
++1898d182bb390c8c6491b7c435026a9e gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-59.c
++a348525fc964f3f41e12f8381fd4bcf0 gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-6.c
++8fe72a2d44a5dbae21dedb5009bd7060 gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-60.c
++1b1a3ecb85d752278437daf2eea0e6eb gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-61.c
++52a091925e77ba1144deef4224d6f9ca gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-62.c
++f26a1170d2c83041d7a069b94343a9d7 gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-63.c
++7f10d8beb44cbeb34704f04daf38dca2 gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-64.c
++1243afa79ef71c09ca472c7ad6965e54 gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-65.c
++54e131b3227f901fd2e26be9a409249d gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-66.c
++e771d4d8a905e5bf787121a83f8fb1bd gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-67.c
++231bcc25e02275bc7eba589b808e66c4 gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-68.c
++f72240bd263e9d2959d34419b48ec7a1 gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-69.c
++e5c6066babd8f328700bb917a676f848 gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-7.c
++7f5d4d6487570d1848a67d1deb2569de gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-70.c
++11baa718d3b7a09edcd806f460dbbc25 gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-71.c
++b8a10e75320b7331731319d76c48b973 gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-72.c
++af92c107465b701524293f2e133ca47b gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-73.c
++630a7ec679fff8883a406b022cf38aff gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-74.c
++c1e8ae021e1d249573f6608e39e8d86e gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-75.c
++b33ec26b8a79deea82491f02092ff7eb gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-76.c
++9f6e7688c4fef262f7ed52de311ab068 gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-77.c
++2b710812d98f7baa361e357f4e747316 gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-78.c
++2652ccf7999779ff5319bf65f0b659c1 gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-79.c
++341058672752eae6a423c51813b90e2c gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-8.c
++e8ac5024db4f3ad13af9c932702e4b7f gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-9.c
+ e1dbd1140383b4dbafeb6bc38684cf93 gcc/testsuite/gcc.target/powerpc/dimode_off.c
+ c6886ac188c6209f2a35a8c394fabfa1 gcc/testsuite/gcc.target/powerpc/direct-move-double1.c
+ bdc2a6ba20c8709781a896620fe1326b gcc/testsuite/gcc.target/powerpc/direct-move-double2.c
+@@ -45010,6 +45209,7 @@
+ 8d289ff49f69a167c01f4b6855e110ac gcc/testsuite/gcc.target/powerpc/direct-move-vint1.c
+ c08abaae6dddb0af0b1430cc189c6040 gcc/testsuite/gcc.target/powerpc/direct-move-vint2.c
+ 6aa10299b67de4618abcf699cb851ce8 gcc/testsuite/gcc.target/powerpc/direct-move.h
++be7ab318182d2d9e0f83da284efdde33 gcc/testsuite/gcc.target/powerpc/divkc3-1.c
+ 8f2229fba1c4dc16358c52a26e62a35e gcc/testsuite/gcc.target/powerpc/doloop-1.c
+ 1e28ad29e43de3bf402fb713b7540c32 gcc/testsuite/gcc.target/powerpc/e500-1.c
+ 6b480fbd59c1e52ed8af5509486a3432 gcc/testsuite/gcc.target/powerpc/e500-ord-1.c
+@@ -45025,6 +45225,8 @@
+ 44257db5dbf13763224f09982671b766 gcc/testsuite/gcc.target/powerpc/float128-1.c
+ 8431c27a8973acc6b663c3e4190c2f2e gcc/testsuite/gcc.target/powerpc/float128-2.c
+ 9e6f60ec112f9373cd63307f592ff5a7 gcc/testsuite/gcc.target/powerpc/float128-call.c
++da43f175c7dca2bbe0139db71bea74f9 gcc/testsuite/gcc.target/powerpc/float128-complex-1.c
++ba0af867a51a0f317dfaf5694d966c85 gcc/testsuite/gcc.target/powerpc/float128-complex-2.c
+ 278c3bcb22b5f3322ae25ff38796870a gcc/testsuite/gcc.target/powerpc/float128-hw.c
+ e930a70de9d4456cf3f5cae8c611ac1c gcc/testsuite/gcc.target/powerpc/float128-mix.c
+ 437cac345cf3e7c88a4c1c8b8480547f gcc/testsuite/gcc.target/powerpc/fusion.c
+@@ -45037,6 +45239,7 @@
+ 238571a7588bf04ee725a409029ddaf1 gcc/testsuite/gcc.target/powerpc/htm-ttest.c
+ bd2f03394b7690c22ce1aab465adb75f gcc/testsuite/gcc.target/powerpc/htm-xl-intrin-1.c
+ 8d634b2a7d443f1e5b4b69716e57ac00 gcc/testsuite/gcc.target/powerpc/indexed-addr.c
++1cc843325d44861ca12b01f8232baced gcc/testsuite/gcc.target/powerpc/inf128-1.c
+ de6c3cf42bacd45ce2c483d586831396 gcc/testsuite/gcc.target/powerpc/le-altivec-consts.c
+ 7893fdf7b4681a84cb4d049bea9ffc10 gcc/testsuite/gcc.target/powerpc/leaf.c
+ 1853e044fc4484c52b41a7d64cfddd8c gcc/testsuite/gcc.target/powerpc/lhs-1.c
+@@ -45052,6 +45255,8 @@
+ cfbe35822c519cf32e8f41ddb02759ed gcc/testsuite/gcc.target/powerpc/mmfpgpr.c
+ 995bc75d9399474fb48494a941a1e00a gcc/testsuite/gcc.target/powerpc/mod-1.c
+ 68dd42cf85da89132923bd22aec1f9dc gcc/testsuite/gcc.target/powerpc/mod-2.c
++3aa7fc41d135e303f0c05c03811cfb39 gcc/testsuite/gcc.target/powerpc/mulkc3-1.c
++1f98efd43a15bde30353489bd97a085d gcc/testsuite/gcc.target/powerpc/nan128-1.c
+ e22a7266629ff9fe810fc66e708b11a6 gcc/testsuite/gcc.target/powerpc/no-r11-1.c
+ 0f3e464b60c769b9067c0b49078b50e5 gcc/testsuite/gcc.target/powerpc/no-r11-2.c
+ 302a3a348ae2f60a0b1366d1c9481f97 gcc/testsuite/gcc.target/powerpc/no-r11-3.c
+@@ -45069,7 +45274,7 @@
+ 218190fe0e4f681dda260926232e56b5 gcc/testsuite/gcc.target/powerpc/p8vector-builtin-7.c
+ 39413d857162f864cd0cfa0c0a600923 gcc/testsuite/gcc.target/powerpc/p8vector-builtin-8.c
+ 3f96842d16ce43bf9d8c92dab6d38fb8 gcc/testsuite/gcc.target/powerpc/p8vector-fp.c
+-f29a688c117106072da0c3eb645375e9 gcc/testsuite/gcc.target/powerpc/p8vector-int128-1.c
++36ce3b715645c5b3d320e55d92cecb36 gcc/testsuite/gcc.target/powerpc/p8vector-int128-1.c
+ dc5273f33a688389eb35c5a79b6b04b9 gcc/testsuite/gcc.target/powerpc/p8vector-int128-2.c
+ fa4a7a4c3fc9401f5f7a3c80eca753f3 gcc/testsuite/gcc.target/powerpc/p8vector-ldst.c
+ 11c5f55b0b21129d8c523e1f11c76274 gcc/testsuite/gcc.target/powerpc/p8vector-vbpermq.c
+@@ -45080,8 +45285,17 @@
+ 8c128eee1ed213711e07bd5bbf4ea8c5 gcc/testsuite/gcc.target/powerpc/p8vector-vectorize-5.c
+ f368a72cbfc951f5d512a015f6e8c2fe gcc/testsuite/gcc.target/powerpc/p9-lxvx-stxvx-1.c
+ 46765159df83126bf98a3389decd9548 gcc/testsuite/gcc.target/powerpc/p9-lxvx-stxvx-2.c
+-ec4a1b33aeb2dc10bc385f3a5cab0690 gcc/testsuite/gcc.target/powerpc/p9-lxvx-stxvx-3.c
+-44fb83fb0d58cbe1b55027ec048d86a7 gcc/testsuite/gcc.target/powerpc/p9-permute.c
++b2136c61215bc040108f9a44241aa4b3 gcc/testsuite/gcc.target/powerpc/p9-lxvx-stxvx-3.c
++a56e3fa096d4eb9c5d04e5ef09bccdf7 gcc/testsuite/gcc.target/powerpc/p9-minmax-1.c
++a67318a36c32f549811fc609d45bcebe gcc/testsuite/gcc.target/powerpc/p9-minmax-2.c
++1778c48c8bde0f502ec1184c17d6661b gcc/testsuite/gcc.target/powerpc/p9-permute.c
++ce1b8af0ff483cd3f89e77c6158773e6 gcc/testsuite/gcc.target/powerpc/p9-splat-1.c
++ae816fd528711a489a96d36403ab4796 gcc/testsuite/gcc.target/powerpc/p9-splat-2.c
++90f06243a7fc1c6079c823376b9b6cc4 gcc/testsuite/gcc.target/powerpc/p9-splat-3.c
++76e637efba841cdc036746e8f48a0914 gcc/testsuite/gcc.target/powerpc/p9-splat-4.c
++1001e87b8d8b5b7135c100a89e4def45 gcc/testsuite/gcc.target/powerpc/p9-vneg.c
++69dc6d7d44a9c96a4258141385a846d7 gcc/testsuite/gcc.target/powerpc/p9-vparity.c
++7d6c7bf2bdc6cb2de461278049408eb4 gcc/testsuite/gcc.target/powerpc/p9-vpermr.c
+ de89784ed878c699a73dbedef03c25ef gcc/testsuite/gcc.target/powerpc/pack01.c
+ c9ce448310ccdac5da6fa5b69ec461fa gcc/testsuite/gcc.target/powerpc/pack02.c
+ fa72c1f9512bac14ea57ebf20c94c152 gcc/testsuite/gcc.target/powerpc/pack03.c
+@@ -45198,7 +45412,7 @@
+ 09542fc0756c51e091818e0d1a7a05b5 gcc/testsuite/gcc.target/powerpc/pr47197.c
+ 524c7b62ac0c9686a6bdb4804a11fce4 gcc/testsuite/gcc.target/powerpc/pr47251.c
+ 9bcd4da8d1ead179f5ca0c94808c2ec3 gcc/testsuite/gcc.target/powerpc/pr47755-2.c
+-bcabc94dfa3cff99515bf6e3ff144a3a gcc/testsuite/gcc.target/powerpc/pr47755.c
++b15f022f6f08a7dca1b72ba59441c31f gcc/testsuite/gcc.target/powerpc/pr47755.c
+ a126c8ee58b9156d861ed2d613db885a gcc/testsuite/gcc.target/powerpc/pr47862.c
+ 187f203dd54fe5ba94f23b9af10db192 gcc/testsuite/gcc.target/powerpc/pr48053-1.c
+ e3647ff87eca8354091eead60728a16f gcc/testsuite/gcc.target/powerpc/pr48053-2.c
+@@ -45254,7 +45468,7 @@
+ 1dc925cae1c688a77865627d749d015c gcc/testsuite/gcc.target/powerpc/pr67071-3.c
+ 35c73d31cfb2ab34903671c0ed5ded53 gcc/testsuite/gcc.target/powerpc/pr67789.c
+ d513afbb48bce30e890a5d3d76987740 gcc/testsuite/gcc.target/powerpc/pr67808.c
+-f9c4133177a090e3d877342b2d04766f gcc/testsuite/gcc.target/powerpc/pr68805.c
++b0dae0a08b67b28c3e8a71536d261274 gcc/testsuite/gcc.target/powerpc/pr68805.c
+ d369a7045eda68cbec3227a16d5de67b gcc/testsuite/gcc.target/powerpc/pr68872.c
+ faf2ed46677346059dd2b7fd42254985 gcc/testsuite/gcc.target/powerpc/pr69252.c
+ 49c8c108299a8b499707f5665d377a18 gcc/testsuite/gcc.target/powerpc/pr69461.c
+@@ -45264,6 +45478,17 @@
+ a31fef5f59c5f12ea342e66137c45ae7 gcc/testsuite/gcc.target/powerpc/pr70117.c
+ 222fda9019693e635c2d63ebdda27d2b gcc/testsuite/gcc.target/powerpc/pr70640.c
+ da2f788bebe8f041672950b7347513cf gcc/testsuite/gcc.target/powerpc/pr70669.c
++d3a79432800e585b3905439b686d873b gcc/testsuite/gcc.target/powerpc/pr70963.c
++31132ce703c42e34a14c7d103e655da2 gcc/testsuite/gcc.target/powerpc/pr71186.c
++18f516c22671e1293affe8823881c35c gcc/testsuite/gcc.target/powerpc/pr71493-1.c
++7d83053012a7579379ae3f803b73b2ec gcc/testsuite/gcc.target/powerpc/pr71493-2.c
++28b1e9d8edb2081a7279eaec89871fee gcc/testsuite/gcc.target/powerpc/pr71656-1.c
++d9ffd95a09400f5746357a34145f6515 gcc/testsuite/gcc.target/powerpc/pr71656-2.c
++a6ef0034e7b09484d521e41a8f3e2b46 gcc/testsuite/gcc.target/powerpc/pr71670.c
++9d1ceb34ff4072b9b15ceedc2d7a4618 gcc/testsuite/gcc.target/powerpc/pr71698.c
++140c404b55422d7f1ea527d9803d6b5f gcc/testsuite/gcc.target/powerpc/pr71720.c
++d9ccfe0048f3d64bbe5861c9aea6294f gcc/testsuite/gcc.target/powerpc/pr71763.c
++743729f568d85b4bd156413e92dea820 gcc/testsuite/gcc.target/powerpc/pr71805.c
+ 17f878b62dd2e08735d53fce64232a47 gcc/testsuite/gcc.target/powerpc/quad-atomic.c
+ 171a411d14f30e8450dc3f2ef38b1bd7 gcc/testsuite/gcc.target/powerpc/recip-1.c
+ 6b7c4920c070e84f6819377bcdb90c0d gcc/testsuite/gcc.target/powerpc/recip-2.c
+@@ -45287,6 +45512,9 @@
+ 65a53924a48d5df99017fa40a01962f4 gcc/testsuite/gcc.target/powerpc/sd-vsx.c
+ a53a4937c325ba3bc85e0bdea0b94e11 gcc/testsuite/gcc.target/powerpc/shift-dot.c
+ 416332739a98fa1f2023fe8c217782e4 gcc/testsuite/gcc.target/powerpc/shift-int.c
++4262b23e41d93c06cc511429249fcda3 gcc/testsuite/gcc.target/powerpc/signbit-1.c
++289a117f2abe4e588c45c20e3418566e gcc/testsuite/gcc.target/powerpc/signbit-2.c
++1ef9b2c104b31118ee37ca3c09991d00 gcc/testsuite/gcc.target/powerpc/signbit-3.c
+ b3e9870bc5d831fd67c299ee87dfb2f7 gcc/testsuite/gcc.target/powerpc/spe-evmerge.c
+ 89537cc7476c27c7c10b811da61def34 gcc/testsuite/gcc.target/powerpc/spe-small-data-1.c
+ 9d04892083c467f0ebf1fc75e043d6d8 gcc/testsuite/gcc.target/powerpc/spe-small-data-2.c
+@@ -45325,6 +45553,18 @@
+ d1f9b55044b5c80d668c846e0f160115 gcc/testsuite/gcc.target/powerpc/timode_off.c
+ fe21d9465e0313b29a24703b2cef2b7e gcc/testsuite/gcc.target/powerpc/upper-regs-df.c
+ 7f45b205e570d7d45266076bd4fd4f4c gcc/testsuite/gcc.target/powerpc/upper-regs-sf.c
++fe1198a185fcf0cf3c192cb7e0f554af gcc/testsuite/gcc.target/powerpc/vadsdu-0.c
++0623613fbcbc6fa96d28c319582034e3 gcc/testsuite/gcc.target/powerpc/vadsdu-1.c
++9ee678d38841407e553ad5d916841cbd gcc/testsuite/gcc.target/powerpc/vadsdu-2.c
++cd4f138fd346361e2e3103806fd8e4c8 gcc/testsuite/gcc.target/powerpc/vadsdu-3.c
++d80a979aa0ab824dbdb31e5e8db1d686 gcc/testsuite/gcc.target/powerpc/vadsdu-4.c
++3e300989c07659ab970072f3d95fde1f gcc/testsuite/gcc.target/powerpc/vadsdu-5.c
++dd9d9603bf7f30ea24dc69a515e1018f gcc/testsuite/gcc.target/powerpc/vadsdub-1.c
++d899788117c4e5a72b4b1f588fe2d14e gcc/testsuite/gcc.target/powerpc/vadsdub-2.c
++99d98db6a63856f69d9535bde676d0dc gcc/testsuite/gcc.target/powerpc/vadsduh-1.c
++b4f95876fdcc9d9ee6da80cca9fda9c6 gcc/testsuite/gcc.target/powerpc/vadsduh-2.c
++8ea44287fbf60977cedb44fec5928530 gcc/testsuite/gcc.target/powerpc/vadsduw-1.c
++f89bc692aa33f0a854308215a8c5a45c gcc/testsuite/gcc.target/powerpc/vadsduw-2.c
+ 6359ddccab89d64974aacae92509fc9e gcc/testsuite/gcc.target/powerpc/vec-cg.c
+ 4137a1d7e936bac5292a51f907266de1 gcc/testsuite/gcc.target/powerpc/vec-cmp-sel.c
+ 2d193a6a4c276dd8b48c488c547c2063 gcc/testsuite/gcc.target/powerpc/vec-cmp.c
+@@ -45332,6 +45572,10 @@
+ fa102cb45e48c286b356759209443dea gcc/testsuite/gcc.target/powerpc/vec-mult-char-2.c
+ bbd74596ca12fe9aac0347c6253db300 gcc/testsuite/gcc.target/powerpc/vec-shift.c
+ 8ee50015e788404267646adf1ac95972 gcc/testsuite/gcc.target/powerpc/vec-shr.c
++2c89883d083bc93d292eb8be25a26a55 gcc/testsuite/gcc.target/powerpc/vslv-0.c
++3032ccdc175db10c55ecb393e9757ea8 gcc/testsuite/gcc.target/powerpc/vslv-1.c
++249c2e1b9f88f56726ab8ecfe5c4e957 gcc/testsuite/gcc.target/powerpc/vsrv-0.c
++b5ff35f6c27a48ed531cd0cb2035da0b gcc/testsuite/gcc.target/powerpc/vsrv-1.c
+ 4ceb6855c2485b8644bf41d0692dce88 gcc/testsuite/gcc.target/powerpc/vsx-builtin-1.c
+ 9e3c77c5253ece30391881a511c37067 gcc/testsuite/gcc.target/powerpc/vsx-builtin-2.c
+ 2cbc6ebb458b1e9d41b7cd611b4dbd55 gcc/testsuite/gcc.target/powerpc/vsx-builtin-3.c
+@@ -45340,6 +45584,10 @@
+ 0b61a376e7164778a523a0766df4ce6e gcc/testsuite/gcc.target/powerpc/vsx-builtin-6.c
+ aec0aad4ad9d1a50c30d68081c0f2184 gcc/testsuite/gcc.target/powerpc/vsx-builtin-7.c
+ 88cd9f4d3675a8897d01117429ae8094 gcc/testsuite/gcc.target/powerpc/vsx-builtin-8.c
++60164d527bd21ab51c50c80abf146df1 gcc/testsuite/gcc.target/powerpc/vsx-elemrev-1.c
++3af84d85921a35dbef53567c5ede1159 gcc/testsuite/gcc.target/powerpc/vsx-elemrev-2.c
++5b80f1ec62fecc5421d5ce52af4b330c gcc/testsuite/gcc.target/powerpc/vsx-elemrev-3.c
++6b19bf3ff62b230d7085a802e8199e3f gcc/testsuite/gcc.target/powerpc/vsx-elemrev-4.c
+ 29415c0ab3cf79b03ca4a55fa764901b gcc/testsuite/gcc.target/powerpc/vsx-extract-1.c
+ ad77cf7854ac810c73e5ad0184232f20 gcc/testsuite/gcc.target/powerpc/vsx-extract-2.c
+ e4ac7f141f61cf4cf8934fe3ee7cf407 gcc/testsuite/gcc.target/powerpc/vsx-extract-3.c
+@@ -45466,6 +45714,7 @@
+ c06cf2adc5393d32c0b9a8d805d6afb4 gcc/testsuite/gcc.target/s390/md/setmem_long-1.c
+ a105158cf4633c30f58d84f95c33ee67 gcc/testsuite/gcc.target/s390/morestack.c
+ ee3f00537b1c391d545c37c6ea4a145c gcc/testsuite/gcc.target/s390/nearestint-1.c
++20772d696b36be5fe8027a9f6a1a5faa gcc/testsuite/gcc.target/s390/nolrl-1.c
+ 25c3bd00fd3d097e42ac8cfc215fd0c4 gcc/testsuite/gcc.target/s390/pfpo.c
+ 765307a040de72f2f4376b7068d68018 gcc/testsuite/gcc.target/s390/pr20927.c
+ 85f31fb9b4b15529205376d3f6fa385c gcc/testsuite/gcc.target/s390/pr24624.c
+@@ -45882,6 +46131,8 @@
+ 7efe7d6dfe46005ac34237aa9e3e023c gcc/testsuite/gcc.target/sparc/fpadd32s.c
+ e7a16562b49f44afb077d0a7befb1888 gcc/testsuite/gcc.target/sparc/fpadds.c
+ e291921904c28ad0957b701bb53b0dda gcc/testsuite/gcc.target/sparc/fpaddsubi.c
++ac111f461cdeae36912fd3f8404ed990 gcc/testsuite/gcc.target/sparc/fpcmp.c
++2744da28c2a65f937a5d696009a68964 gcc/testsuite/gcc.target/sparc/fpcmpu.c
+ d5c0d8820b76e85d8f0cf1c69966a388 gcc/testsuite/gcc.target/sparc/fpmerge-2.c
+ a7cc3a1dfad8c1fc65ae115cb1af1560 gcc/testsuite/gcc.target/sparc/fpmerge.c
+ c589849053db19bd27d64bfbabf5ea20 gcc/testsuite/gcc.target/sparc/fpmul-2.c
+@@ -45956,6 +46207,7 @@
+ 51fff32a202c8bd3aa39b5f219127064 gcc/testsuite/gcc.target/sparc/vis3move-1.c
+ b19cd6113dbe3ce177bc3a6f0edd515b gcc/testsuite/gcc.target/sparc/vis3move-2.c
+ c743e0cdebd780532edc2e21e3de15e4 gcc/testsuite/gcc.target/sparc/vis3move-3.c
++c6e8cea536062af6f23168b438e096e3 gcc/testsuite/gcc.target/sparc/vis4misc.c
+ 56b799e8f22e02ad94a3b78e432a129c gcc/testsuite/gcc.target/sparc/wrgsr.c
+ 8ab1e95b1174d62330ff11c4ce7c22d3 gcc/testsuite/gcc.target/sparc/xmul.c
+ 723fd6618b2db81b9d1ef55c7f12b2d5 gcc/testsuite/gcc.target/spu/Wmain.c
+@@ -46653,7 +46905,7 @@
+ d5ea8f5a9e2574f03e0f07aefb628587 gcc/testsuite/gfortran.dg/array_constructor_46.f90
+ 43de0ab156de7b0350c7425df3859e4a gcc/testsuite/gfortran.dg/array_constructor_47.f90
+ 71b1b67746cb3b141002319b6af5c534 gcc/testsuite/gfortran.dg/array_constructor_48.f90
+-962a7a6b6e5f15ede68a20cff87053b5 gcc/testsuite/gfortran.dg/array_constructor_49.f90
++b3fed1ef4a2d1acbb8f29ba81a3ade35 gcc/testsuite/gfortran.dg/array_constructor_49.f90
+ 9918ac77cf760a3800e94da773f0a74b gcc/testsuite/gfortran.dg/array_constructor_5.f90
+ 6dc05669b848d267b25c38806e59d51f gcc/testsuite/gfortran.dg/array_constructor_6.f90
+ 0965c3437a2116ac32e573441184fdee gcc/testsuite/gfortran.dg/array_constructor_7.f90
+@@ -47361,6 +47613,7 @@
+ 50b3c8143d77c8ce5bb9d993685e5e6b gcc/testsuite/gfortran.dg/class_array_2.f03
+ 5d685c52e64583cc42131880a4b0d8fc gcc/testsuite/gfortran.dg/class_array_20.f03
+ 15af94e79a85d05449886a154d162bff gcc/testsuite/gfortran.dg/class_array_21.f03
++91de14bd0e1e34515a91a4245b3da873 gcc/testsuite/gfortran.dg/class_array_22.f03
+ 3c6c7feaa5267df5f131a4ddb69162d9 gcc/testsuite/gfortran.dg/class_array_3.f03
+ cb5261f2acfcf95396bea9e699efcd14 gcc/testsuite/gfortran.dg/class_array_4.f03
+ b4dd99bc2d3d2741e6f3769df3b8d9e0 gcc/testsuite/gfortran.dg/class_array_5.f03
+@@ -47534,6 +47787,8 @@
+ b2dba23fc22128a647db42769be9f272 gcc/testsuite/gfortran.dg/coindexed_1.f90
+ f921a7c5a0e4098dd6b6edf4e317a4e1 gcc/testsuite/gfortran.dg/com_block_driver.f90
+ 2595b7b0d8e86ae62cf503bd5080ee45 gcc/testsuite/gfortran.dg/comma.f
++ca9b384b7523fa630f1d4edff3cd4267 gcc/testsuite/gfortran.dg/comma_IO_extension_1.f90
++7b4fe3be18cf5d3e2bcac0b98a2191d6 gcc/testsuite/gfortran.dg/comma_IO_extension_2.f90
+ b68510025102f4e42c5ab3a0ebf1b5aa gcc/testsuite/gfortran.dg/comma_format_extension_1.f
+ e9f174aaa655ec093b7c3dc075581e89 gcc/testsuite/gfortran.dg/comma_format_extension_2.f
+ e38edb0e607a003fddf67b7597b40626 gcc/testsuite/gfortran.dg/comma_format_extension_3.f
+@@ -47693,6 +47948,24 @@
+ 311f4c5de7848479e7c29ad08de71190 gcc/testsuite/gfortran.dg/debug/trivial.f
+ 431530310efb9ec01e397a4a411f8e67 gcc/testsuite/gfortran.dg/debug_1.f90
+ f12fc8f8c675ad90dacda21c47b123cf gcc/testsuite/gfortran.dg/debug_2.f
++299b547bcb6b486a2e1f3e6ff0e387b8 gcc/testsuite/gfortran.dg/dec_structure_1.f90
++facc0d311d19c38571f70f8db13044bc gcc/testsuite/gfortran.dg/dec_structure_10.f90
++bebb7b5cba927374343e4d102d6bdef2 gcc/testsuite/gfortran.dg/dec_structure_11.f90
++c065ec9eab467c19e2503ea2b5ec35f6 gcc/testsuite/gfortran.dg/dec_structure_2.f90
++17d1e3238da3930c57838b7f1d610c40 gcc/testsuite/gfortran.dg/dec_structure_3.f90
++17bdec7f0e2ee1d7fce0b23ebd82610a gcc/testsuite/gfortran.dg/dec_structure_4.f90
++e60b5448cb28834a5043d778f28b0029 gcc/testsuite/gfortran.dg/dec_structure_5.f90
++5276660c4588b2f9922aacd54e303a2d gcc/testsuite/gfortran.dg/dec_structure_6.f90
++b7df816a5764cf98d0af9a21fc087015 gcc/testsuite/gfortran.dg/dec_structure_7.f90
++a3842131746a182a4d0d806a0ead8cf9 gcc/testsuite/gfortran.dg/dec_structure_8.f90
++ba7bd70d8f9beaa28febfa1d800b3cf7 gcc/testsuite/gfortran.dg/dec_structure_9.f90
++13560c998f2fbbcc2fd45b4777d0e4c9 gcc/testsuite/gfortran.dg/dec_union_1.f90
++069da68835dead9331318c2f9a653aec gcc/testsuite/gfortran.dg/dec_union_2.f90
++83928614f196067ade7992b31468aef9 gcc/testsuite/gfortran.dg/dec_union_3.f90
++0557177e9e8702f52b8f249aa7941985 gcc/testsuite/gfortran.dg/dec_union_4.f90
++3f6b8d2969f783d7204a320cf8b95cd2 gcc/testsuite/gfortran.dg/dec_union_5.f90
++ac7e4f8e406a6c26533909c71fa6b3fd gcc/testsuite/gfortran.dg/dec_union_6.f90
++3bf903f4b6b040909bf42cbcf85d3330 gcc/testsuite/gfortran.dg/dec_union_7.f90
+ 24aa7ef3c5125fd57a6bf5b0d5a11a5f gcc/testsuite/gfortran.dg/default_format_1.f90
+ 42dc43ca59716a600a5d47ef02504fc7 gcc/testsuite/gfortran.dg/default_format_1.inc
+ 6639ce11899c92de50597c547e431fe7 gcc/testsuite/gfortran.dg/default_format_2.f90
+@@ -47715,6 +47988,7 @@
+ c26c871bf08605ce024253a49da3b53a gcc/testsuite/gfortran.dg/deferred_character_14.f90
+ 1c4f05212f5447da65bd477a1f755ce9 gcc/testsuite/gfortran.dg/deferred_character_15.f90
+ bcdb84ffa3c50231ecd967d3114134ae gcc/testsuite/gfortran.dg/deferred_character_16.f90
++c2d3fe3d7d640f7941cc2bc632a62dae gcc/testsuite/gfortran.dg/deferred_character_17.f90
+ 0065ab4e114bfcdbbb2b3374d1ffdc63 gcc/testsuite/gfortran.dg/deferred_character_2.f90
+ 496fec17b89042f5546165ec11d36f09 gcc/testsuite/gfortran.dg/deferred_character_3.f90
+ 1d0633419cdd140f8ca51872f6219b2d gcc/testsuite/gfortran.dg/deferred_character_4.f90
+@@ -47789,6 +48063,7 @@
+ dca63cf93efe22616e44d9f46b5b1933 gcc/testsuite/gfortran.dg/dependency_43.f90
+ 52a475961b0e9c97d571fa626e1754b5 gcc/testsuite/gfortran.dg/dependency_44.f90
+ 9908775fdc0125fcca5e0250d562cdb1 gcc/testsuite/gfortran.dg/dependency_45.f90
++18bd6a173b22bb353c669d8ab0cbe6df gcc/testsuite/gfortran.dg/dependency_46.f90
+ 590a99c4ec44cc37aa92b225e93d6e87 gcc/testsuite/gfortran.dg/dependency_5.f90
+ 03218919538313b26e09fa1b8f0efda0 gcc/testsuite/gfortran.dg/dependency_6.f90
+ 699f1378f5c1fcdc54eb21fdb4a59be1 gcc/testsuite/gfortran.dg/dependency_7.f90
+@@ -48477,17 +48752,19 @@
+ 6efd4df3178f228cb542d2003c66b882 gcc/testsuite/gfortran.dg/goacc/array-reduction.f90
+ c92cb05a4e19077108b80407be41b8f4 gcc/testsuite/gfortran.dg/goacc/assumed.f95
+ 8cdce510706db86c42684ec44b8eb828 gcc/testsuite/gfortran.dg/goacc/asyncwait-1.f95
+-7bd472524bf42138d88fa89386d66b65 gcc/testsuite/gfortran.dg/goacc/asyncwait-2.f95
+-e6a2926ae0de810c7fe830bb89c73ecf gcc/testsuite/gfortran.dg/goacc/asyncwait-3.f95
+-fdc3c66ef32cd5b7ad3182aa063ae0b2 gcc/testsuite/gfortran.dg/goacc/asyncwait-4.f95
++e5c0af740e47a34c175a9ceb878b8228 gcc/testsuite/gfortran.dg/goacc/asyncwait-2.f95
++a9a3cfdb74f2e089482e586df93f98f6 gcc/testsuite/gfortran.dg/goacc/asyncwait-3.f95
++0084be36b4e094fd83e8998262213cba gcc/testsuite/gfortran.dg/goacc/asyncwait-4.f95
+ b5ce38fdd599e1809965f838521def2e gcc/testsuite/gfortran.dg/goacc/branch.f95
+-34313aee22abd0152799e922857be58d gcc/testsuite/gfortran.dg/goacc/cache-1.f95
+-90ecc7d89f74c8968e175f4f1d53be80 gcc/testsuite/gfortran.dg/goacc/coarray.f95
++109a3ecc87b1bc758772cc9eeee4d842 gcc/testsuite/gfortran.dg/goacc/cache-1.f95
++0770d02d65abc7014c30751880ebe628 gcc/testsuite/gfortran.dg/goacc/cache-2.f95
++83d4a89dbb466047d65da89db7eebee2 gcc/testsuite/gfortran.dg/goacc/coarray.f95
+ 802487ba26d5909068b6a8fd851b3b28 gcc/testsuite/gfortran.dg/goacc/coarray_2.f90
+-55f389e7d2475dfd568dc4cfc36ee031 gcc/testsuite/gfortran.dg/goacc/combined-directives.f90
++a7d31e00fe9a2d414bb73e11030c72bc gcc/testsuite/gfortran.dg/goacc/combined-directives.f90
+ d1e02d6d5cf7ba5e1a5efb88f2c97c94 gcc/testsuite/gfortran.dg/goacc/combined_loop.f90
+ 9d0226e6bd1816759f20d69d9cfb27cc gcc/testsuite/gfortran.dg/goacc/continuation-free-form.f95
+-95640396b34a8b7bad7efe08268dc32c gcc/testsuite/gfortran.dg/goacc/cray.f95
++1d2b9f57ee07b286f80f6b187af2ff1b gcc/testsuite/gfortran.dg/goacc/cray-2.f95
++decf3300196fa1217139ef97f2e0edda gcc/testsuite/gfortran.dg/goacc/cray.f95
+ 4bb22bcb9fe8f7604be602bc77be659f gcc/testsuite/gfortran.dg/goacc/critical.f95
+ 022517e8228f065e890dddca8b9c62eb gcc/testsuite/gfortran.dg/goacc/data-clauses.f95
+ cf1b8cb94fd316d9739bca6a5a62b7c8 gcc/testsuite/gfortran.dg/goacc/data-tree.f95
+@@ -48522,26 +48799,30 @@
+ b3ec1dda65c543c847dd7dddd2c4225d gcc/testsuite/gfortran.dg/goacc/kernels-tree.f95
+ 69f03def6f88f62ff022aa924b3ef5ec gcc/testsuite/gfortran.dg/goacc/list.f95
+ e6dbc70731a1d1ca5862632bc04ef617 gcc/testsuite/gfortran.dg/goacc/literal.f95
+-2b88ae51fe174e583daaf03c09fcec02 gcc/testsuite/gfortran.dg/goacc/loop-1.f95
++b26795c8c89b35d75e8f259a55524874 gcc/testsuite/gfortran.dg/goacc/loop-1-2.f95
++687f26e7d2845bfca2374df935de0ad8 gcc/testsuite/gfortran.dg/goacc/loop-1.f95
+ f89d863f93581b48d43a32a8190ba33e gcc/testsuite/gfortran.dg/goacc/loop-2.f95
+-c9153e6a6dac5781507ac515cab62dd5 gcc/testsuite/gfortran.dg/goacc/loop-3.f95
++7a6e1274863fdd10d60c8e28013470ad gcc/testsuite/gfortran.dg/goacc/loop-3-2.f95
++4ab6f70640fa56a4b2322cbd843dc31e gcc/testsuite/gfortran.dg/goacc/loop-3.f95
+ 7650c1b33dcca66bb9a4288605d35e20 gcc/testsuite/gfortran.dg/goacc/loop-4.f95
+ 9cd553c36e742f7b04d15d0cb0a6a48e gcc/testsuite/gfortran.dg/goacc/loop-5.f95
+ 1d6f955c573654211baccdf5274140f4 gcc/testsuite/gfortran.dg/goacc/loop-6.f95
+ 6cf3587f7d4ad23454dd236855ca4765 gcc/testsuite/gfortran.dg/goacc/loop-7.f95
+ 6a1610362e13864115701f5d730ee4d1 gcc/testsuite/gfortran.dg/goacc/loop-tree-1.f90
+ 677cbf9fd090598ed630bcfe28346d68 gcc/testsuite/gfortran.dg/goacc/multi-clause.f90
++d8029a1c26556a69cbb64f6e00104fc1 gcc/testsuite/gfortran.dg/goacc/nested-function-1.f90
+ 0eceec0214676eaf97b87027864084f8 gcc/testsuite/gfortran.dg/goacc/omp-fixed.f
+ 7ac95438e9a28b224841f382a0cd1c73 gcc/testsuite/gfortran.dg/goacc/omp.f95
+ 858af9153dd1e561ac2db5bbc63970fc gcc/testsuite/gfortran.dg/goacc/parallel-kernels-clauses.f95
+ 1ba4b22dac74c58581a0548cc088e27d gcc/testsuite/gfortran.dg/goacc/parallel-kernels-regions.f95
+ f111c33f57aecc85e59e669c980e4436 gcc/testsuite/gfortran.dg/goacc/parallel-tree.f95
+ 4f9ac2d37e02e4f60dbb47924519e3ad gcc/testsuite/gfortran.dg/goacc/parameter.f95
++b4f5bf838607d6206aae8d768d23c64e gcc/testsuite/gfortran.dg/goacc/pr71704.f90
+ 93028fbaf2e1d8a3907db1cacb627cf7 gcc/testsuite/gfortran.dg/goacc/private-1.f95
+ 24e251dd88a9ea6377e535f5ee5f31ed gcc/testsuite/gfortran.dg/goacc/private-2.f95
+ a70416eb409bcd3ad178b3d0127d84e8 gcc/testsuite/gfortran.dg/goacc/private-3.f95
+ 62b5f5b00b9662a8b75727b0922b367d gcc/testsuite/gfortran.dg/goacc/pure-elemental-procedures.f95
+-d12cf9a036092d8d5b7280b4a40b9ca0 gcc/testsuite/gfortran.dg/goacc/reduction-2.f95
++9b703807d8c979fc38c25732d2b58ed7 gcc/testsuite/gfortran.dg/goacc/reduction-2.f95
+ d3ab76f25073383b9b4da99d0ae1d5da gcc/testsuite/gfortran.dg/goacc/reduction-3.f95
+ 05592ff32b84187f44ceb5b9e28798d2 gcc/testsuite/gfortran.dg/goacc/reduction-promotions.f90
+ 46fd853a6275991852de09ff935972f6 gcc/testsuite/gfortran.dg/goacc/reduction.f95
+@@ -48555,7 +48836,6 @@
+ 1de77dbd04bee79fc48688363255fcd9 gcc/testsuite/gfortran.dg/goacc/several-directives.f95
+ f06b08508075bc5860b3aef6a69260fe gcc/testsuite/gfortran.dg/goacc/sie.f95
+ cb4390c1c6c7c2a0935783bfe228925e gcc/testsuite/gfortran.dg/goacc/subarrays.f95
+-541c6f516c94b64ec10c75b4beec8152 gcc/testsuite/gfortran.dg/goacc/subroutines.f90
+ 2fcae0aca98e7612762a0d64de5d1b4d gcc/testsuite/gfortran.dg/goacc/uninit-copy-clause.f95
+ 1b773656b8a7d541df7a20f4cb0b21c5 gcc/testsuite/gfortran.dg/goacc/uninit-dim-clause.f95
+ dd2a54a711f3f1fc2d508534164228f9 gcc/testsuite/gfortran.dg/goacc/uninit-firstprivate-clause.f95
+@@ -48649,6 +48929,8 @@
+ 31f5c4996a25be6d38e18faf28b150b4 gcc/testsuite/gfortran.dg/gomp/openmp-simd-1.f90
+ 2b03c97061d19eddde270a6c9dd3fc38 gcc/testsuite/gfortran.dg/gomp/openmp-simd-2.f90
+ 7b53af38ad214d98f0d0550bbb80b654 gcc/testsuite/gfortran.dg/gomp/openmp-simd-3.f90
++ab6d18741860d8f9094676890b96e068 gcc/testsuite/gfortran.dg/gomp/order-1.f90
++618c952f5bbb7326c70d6e7a786f679d gcc/testsuite/gfortran.dg/gomp/order-2.f90
+ 9a6817790a272cd8153d4303d324c00f gcc/testsuite/gfortran.dg/gomp/pr26224.f
+ d2c74a71f2bea0005d853821e6f0142c gcc/testsuite/gfortran.dg/gomp/pr27573.f90
+ 7905e149c2a2dbed5b9dd43384d712f4 gcc/testsuite/gfortran.dg/gomp/pr29759.f90
+@@ -48688,6 +48970,11 @@
+ 624512980f4f3b39deb857cfdd5fdeba gcc/testsuite/gfortran.dg/gomp/pr62131.f90
+ 5d7b04ab3b84314d89ea68a7f054ea17 gcc/testsuite/gfortran.dg/gomp/pr66633.f90
+ 008d934abb38a4acedd9f90092aa4b6d gcc/testsuite/gfortran.dg/gomp/pr69128.f90
++94a8931b1a8c928dadf01cdde210bbba gcc/testsuite/gfortran.dg/gomp/pr70855.f90
++a21e59357a45d319e791dda388391242 gcc/testsuite/gfortran.dg/gomp/pr71687.f90
++1724cefc87db9a0a62b6387ee74cffc2 gcc/testsuite/gfortran.dg/gomp/pr71704.f90
++7d3f1abdbdd106580173760b443a9b40 gcc/testsuite/gfortran.dg/gomp/pr71705.f90
++d07d71ded0663c9dc2e67b06e6231cfc gcc/testsuite/gfortran.dg/gomp/pr71758.f90
+ b4be3f9de7631846875a711ae9b67293 gcc/testsuite/gfortran.dg/gomp/proc_ptr_1.f90
+ 87885556568e657ef4c936c53e1c7305 gcc/testsuite/gfortran.dg/gomp/proc_ptr_2.f90
+ 59e444df8ec8f5ea9859b5aef4d75865 gcc/testsuite/gfortran.dg/gomp/reduction1.f90
+@@ -48770,7 +49057,7 @@
+ 5754b3cf46378cb45f6e5a1d41b0cd4a gcc/testsuite/gfortran.dg/graphite/pr37852.f90
+ d056a2044b7a3f7f763fe76fad38958d gcc/testsuite/gfortran.dg/graphite/pr37857.f90
+ 39980079ddf92937d334ad4fa7d63b74 gcc/testsuite/gfortran.dg/graphite/pr37980.f90
+-9fd92c1b4b047e3ecad9e87cacd557e5 gcc/testsuite/gfortran.dg/graphite/pr38083.f90
++5d9ba2a3b15bd5a5d3fec321b23e780b gcc/testsuite/gfortran.dg/graphite/pr38083.f90
+ 2f361e4dc036f2a777b5340709d7cbad gcc/testsuite/gfortran.dg/graphite/pr38459.f90
+ 68989e2f56ab16cebeffc96df65b3c7d gcc/testsuite/gfortran.dg/graphite/pr38953.f90
+ c5c4a63aba69d822a86d91f0242eb7c9 gcc/testsuite/gfortran.dg/graphite/pr39516.f
+@@ -48811,7 +49098,7 @@
+ c6ccb0077483440bf572afc0c07cf295 gcc/testsuite/gfortran.dg/graphite/vect-pr40979.f90
+ f9932e22f4bc6baa989154035dbac7c1 gcc/testsuite/gfortran.dg/guality/arg1.f90
+ 49b421794f66b18bf7f66026f68f035f gcc/testsuite/gfortran.dg/guality/guality.exp
+-34aa3a6f198ba5d265275076a07dbf9a gcc/testsuite/gfortran.dg/guality/pr41558.f90
++d4523e218e3a6d976774e7e026bca339 gcc/testsuite/gfortran.dg/guality/pr41558.f90
+ 85b827d8051a3d9581ba2a6e6709d5c9 gcc/testsuite/gfortran.dg/hollerith.f90
+ 855af7807ad9d75aef7ff85c2859a0c2 gcc/testsuite/gfortran.dg/hollerith2.f90
+ ac7abff09db32e7d44719f0d0472dc64 gcc/testsuite/gfortran.dg/hollerith3.f90
+@@ -49025,7 +49312,7 @@
+ fa2faf183145bf87d1497a8e18cf67c2 gcc/testsuite/gfortran.dg/integer_exponentiation_3.F90
+ 901fdf8ccfce7240b5e2cfa3f7fcb07c gcc/testsuite/gfortran.dg/integer_exponentiation_4.f90
+ ebd2c7181d1d1a74fb8d92fa4d5dcadf gcc/testsuite/gfortran.dg/integer_exponentiation_5.F90
+-fcfb49c9fc1a86ba81cd5f03602cd781 gcc/testsuite/gfortran.dg/integer_exponentiation_6.F90
++5436c9710c4dbacc08026642a5d88b2d gcc/testsuite/gfortran.dg/integer_exponentiation_6.F90
+ 9a94a4b4c3991300273d3eff16279572 gcc/testsuite/gfortran.dg/intent_optimize_1.f90
+ 6ad3133cfe62e722e018d386dbfd3404 gcc/testsuite/gfortran.dg/intent_out_1.f90
+ 56f012500f1600964f96a00b144bd1bb gcc/testsuite/gfortran.dg/intent_out_2.f90
+@@ -50114,7 +50401,14 @@
+ 4dfe5b03dbae8d8845caac4e7f7c0a89 gcc/testsuite/gfortran.dg/pr69155.f90
+ f0a6995f73ec38a5c8e24e5d968a365b gcc/testsuite/gfortran.dg/pr69554-1.F90
+ fe55b4afdea6006daace9aa79199e551 gcc/testsuite/gfortran.dg/pr69554-2.F90
++68938073de3c2383615f40d0ec615519 gcc/testsuite/gfortran.dg/pr69603.f90
+ c718be52c08cbfe5941dc1bb7a50bcb5 gcc/testsuite/gfortran.dg/pr69987.f90
++23dc11b0707086a8168e76c17d13d620 gcc/testsuite/gfortran.dg/pr70673.f90
++0e424f05f2fdeb786b877ace2617112d gcc/testsuite/gfortran.dg/pr70931.f90
++a16162b0759105febc1efc1311184688 gcc/testsuite/gfortran.dg/pr71047.f08
++75b8abd1f0f9d2e236605ecc6792b9fb gcc/testsuite/gfortran.dg/pr71204.f90
++dffe49f90e191f0e0d1a1c6f8d53f854 gcc/testsuite/gfortran.dg/pr71688.f90
++ea322d8eb84f224e47f5c54a96e8cd2d gcc/testsuite/gfortran.dg/pr71764.f90
+ 6ff99f4b0021f30bee039a61db7cba9d gcc/testsuite/gfortran.dg/predcom-1.f
+ 20a411a7e5a57891297c4c6a96d92009 gcc/testsuite/gfortran.dg/predcom-2.f
+ 80cf60710448ac2378aecda5fc4a57b6 gcc/testsuite/gfortran.dg/present_1.f90
+@@ -50711,8 +51005,9 @@
+ 3318d144c2d4abef44dd2d14c35a6adc gcc/testsuite/gfortran.dg/submodule_11.f08
+ 9542945224c8744c6179ede6b10e8b0d gcc/testsuite/gfortran.dg/submodule_12.f08
+ f52d9c0fcdf271bd2e5abda2cc3b4855 gcc/testsuite/gfortran.dg/submodule_13.f08
+-afd5cd591a97b8e5a6e049931330c963 gcc/testsuite/gfortran.dg/submodule_14.f08
+-475ea51fbff182674030048c7b52aaec gcc/testsuite/gfortran.dg/submodule_15.f08
++04974d3f93910435057c4f73f05e14cd gcc/testsuite/gfortran.dg/submodule_14.f08
++adcecf1db1bbd9194a601cae633dbba7 gcc/testsuite/gfortran.dg/submodule_15.f08
++76252beb42c84ee49919cc34174e21af gcc/testsuite/gfortran.dg/submodule_16.f08
+ 97424405e3e17827757a639a19573fa4 gcc/testsuite/gfortran.dg/submodule_2.f08
+ ac42e5598feef42b948692956c7ed537 gcc/testsuite/gfortran.dg/submodule_3.f08
+ 68f9f70d888318a31160ba732171726f gcc/testsuite/gfortran.dg/submodule_4.f08
+@@ -50931,6 +51226,7 @@
+ 0e692a977ecc4ab86f2eddee444794b4 gcc/testsuite/gfortran.dg/uncommon_block_data_1.f90
+ 6f108a647e3b73bca74907355e7a2d85 gcc/testsuite/gfortran.dg/unconstrained_commons.f
+ 2fb717fe29fa528056cd388b7064ce96 gcc/testsuite/gfortran.dg/underflow.f90
++39050472f0bc284f515f1898b0c79a2e gcc/testsuite/gfortran.dg/unexpected_eof.f
+ 7b6179afe920e46575539bf900b34222 gcc/testsuite/gfortran.dg/unexpected_interface.f90
+ deb2555ff248a9775b72c008e6de9795 gcc/testsuite/gfortran.dg/unf_io_convert_1.f90
+ 52c34a568acefcf68e800ca5c3b7f7e8 gcc/testsuite/gfortran.dg/unf_io_convert_2.f90
+@@ -51812,6 +52108,7 @@
+ e2983168c9a3f63dee423c9ab7489d56 gcc/testsuite/gnat.dg/c_words.adb
+ 818af14f525730860678bca32d713541 gcc/testsuite/gnat.dg/c_words.ads
+ d52f72e41d04b3c98fb25494f2645bea gcc/testsuite/gnat.dg/capture_value.adb
++9db4166fc85c98e9ec451ab5419d883a gcc/testsuite/gnat.dg/case_character.adb
+ 4770f7aff2ceceb688301adf7cfb0c13 gcc/testsuite/gnat.dg/case_null.adb
+ 8847695c0d583376223247da04d2d2e5 gcc/testsuite/gnat.dg/case_null.ads
+ 1bf3fc0381b629fc3f416a475d1302fb gcc/testsuite/gnat.dg/case_optimization1.adb
+@@ -51878,6 +52175,7 @@
+ 00416c1ffc3228fc0f9bd2f529abeaeb gcc/testsuite/gnat.dg/debug4.adb
+ 972c01247ac04a4b8e00f62a95d4f0fc gcc/testsuite/gnat.dg/debug4_pkg.adb
+ 6ea95671601e0326e72591fbfc5de13a gcc/testsuite/gnat.dg/debug4_pkg.ads
++c1bc8b0ecc894424728b5b4911bf1cc6 gcc/testsuite/gnat.dg/debug5.adb
+ 11735efa0b9cef4f67d8e3f4899d5dcb gcc/testsuite/gnat.dg/decl_ctx_def.ads
+ 1e3eab2cf62e279c000f95051138781d gcc/testsuite/gnat.dg/decl_ctx_use.adb
+ d647ddf65b566e41973afeb047912147 gcc/testsuite/gnat.dg/decl_ctx_use.ads
+@@ -52427,6 +52725,8 @@
+ a6c7953bc37af2c4687583d602b5357c gcc/testsuite/gnat.dg/opt51.adb
+ 3036c312a42a98f72343dcfb25c615a2 gcc/testsuite/gnat.dg/opt51_pkg.ads
+ d715f4258a659b9f52add768ec0176d3 gcc/testsuite/gnat.dg/opt52.adb
++61534b77f2217dab18d66d63b8866b3a gcc/testsuite/gnat.dg/opt56.adb
++589d51425474ad576aae93a10d95f178 gcc/testsuite/gnat.dg/opt56.ads
+ e5e7ff61479fbeb7973786d07f72ba84 gcc/testsuite/gnat.dg/opt6.adb
+ 87097de987361854f4c5179a6de42c2c gcc/testsuite/gnat.dg/opt6.ads
+ a441d166cc0d4b34342468308b350060 gcc/testsuite/gnat.dg/opt7.adb
+@@ -52529,6 +52829,8 @@
+ a69c0bfa5361221d9a3ccb55aba36f65 gcc/testsuite/gnat.dg/remote_type.ads
+ 5a11b23912d6e1695fe7b02ca1ab1e79 gcc/testsuite/gnat.dg/renaming1.adb
+ bd812535e6617c5f4dde6719c8748277 gcc/testsuite/gnat.dg/renaming1.ads
++95d7703afe25fd090863c05ffcded594 gcc/testsuite/gnat.dg/renaming10.adb
++404005db149a5434ece08f5fccea5a18 gcc/testsuite/gnat.dg/renaming10.ads
+ 3afb13f37cfc3455f0f0be64d053892f gcc/testsuite/gnat.dg/renaming2.adb
+ 1a954da0b1e7e11673319b058eb82146 gcc/testsuite/gnat.dg/renaming3.adb
+ 9c415422ce59266c9af89e8d3fd1df74 gcc/testsuite/gnat.dg/renaming4.ads
+@@ -54379,7 +54681,7 @@
+ bc3c7df09495f62a7ff924aeda27871f gcc/testsuite/lib/scantree.exp
+ fd4fe0b217182ec61ad209b8b9560725 gcc/testsuite/lib/target-libpath.exp
+ f475e8e2d4f9bd50e1c4f5ee88955e99 gcc/testsuite/lib/target-supports-dg.exp
+-2ca0216d437918962131c6e27c219116 gcc/testsuite/lib/target-supports.exp
++81a83339c4e05edfaa689434dae89de5 gcc/testsuite/lib/target-supports.exp
+ cfcacc2a887c0ba90640d2646cdb13df gcc/testsuite/lib/target-utils.exp
+ d0478737f0c5786d095c1ca581b0dafa gcc/testsuite/lib/timeout-dg.exp
+ ab858bda48392f10cfc775daebf0bbd8 gcc/testsuite/lib/timeout.exp
+@@ -55328,9 +55630,11 @@
+ 10d4ea2c47febed0bbc5688f380b3439 gcc/testsuite/objc/execute/static-2.m
+ a57e521085412bbde60e78229ace4fd5 gcc/testsuite/objc/execute/trivial.m
+ 2d60a6650416d3bcd6a3f5f1fb61dece gcc/testsuite/objc/execute/va_method.m
++03f60b73f1fbd1151f587782de731364 gcc/testsuite/opt55.adb
++2f8548e74c5a464d97ac0283d9d45017 gcc/testsuite/opt55.ads
+ 8e810400df215d5a3c3a5918414f2567 gcc/timevar.c
+-dd062f4defa1af2bf819c4c11f39b79a gcc/timevar.def
+-e105ea612b809c4eb10d1f55004990f0 gcc/timevar.h
++270ecff76752a63ed71a9cd892884668 gcc/timevar.def
++5d6d78630ce2cf12488bfb9fba34b7da gcc/timevar.h
+ 1db6f2e372b1af92e0671da08d9bae7b gcc/tlink.c
+ 67e5012a5b3f405f6257abc6a945e73e gcc/toplev.c
+ 4b9e8fd609c1573d9fd5d43bde33866c gcc/toplev.h
+@@ -55346,7 +55650,7 @@
+ f713f4da05f4d4a13d250939a5eb4703 gcc/tree-cfgcleanup.c
+ 00f42379eee5485bfc493cb60e0d7d5b gcc/tree-cfgcleanup.h
+ aca1f99bd5df778be73f5678d6f93360 gcc/tree-chkp-opt.c
+-7f29bc54f04d7bdb5d970c8ced9ce727 gcc/tree-chkp.c
++7e6ad67e923cf3b95ff981d14d0c4a1d gcc/tree-chkp.c
+ 2ff57aba516c82bd2d6d9444d695ca7c gcc/tree-chkp.h
+ a5085f5177f0f41d2b8a37af4391a3c7 gcc/tree-chrec.c
+ 43ea0ae76ce17d30b45a0433304ef5b7 gcc/tree-chrec.h
+@@ -55366,17 +55670,17 @@
+ 735714950a7040219bdede8abc940737 gcc/tree-hash-traits.h
+ 4646d637e5cb964a4e6ad3a2589d1cda gcc/tree-hasher.h
+ 4bbc44b137c67f0e938bded3978e7037 gcc/tree-if-conv.c
+-30043a2564222962bda8aab68b1f7255 gcc/tree-inline.c
++c4c7b3c7029ba618985649e12ee59731 gcc/tree-inline.c
+ 38646e6febfe5a1052ade3533870efa3 gcc/tree-inline.h
+ 0f77f4c320b8b8381c286d3e856c6093 gcc/tree-into-ssa.c
+ fd4c3d5580777d50b0274967152c64a0 gcc/tree-into-ssa.h
+ 222c5d841b6028c827eae9f43d0f4d20 gcc/tree-iterator.c
+ 395c4cd006e9cc4fac2ccacbb10dc907 gcc/tree-iterator.h
+ 01811cd206083ef2a619b39628839651 gcc/tree-loop-distribution.c
+-47d8ad95b524f5ccaab1a2df951d9ddb gcc/tree-nested.c
++3e9bbd47ca0a40ea54d1fd57a83164c8 gcc/tree-nested.c
+ 89c3120b4f9580284e45b7c3b4a302d4 gcc/tree-nested.h
+ f5b4890f3ea137bd50a75635cdf58410 gcc/tree-nrv.c
+-f1b1405192c96ea15ae6e64f005f0761 gcc/tree-object-size.c
++f68eba59616ea0d71903e45ebf4f301b gcc/tree-object-size.c
+ 09aeb8e8a96f12d60fd3221cd8bbd33c gcc/tree-object-size.h
+ bfdff86bbeca1fa7f1812fcf614346ef gcc/tree-outof-ssa.c
+ d54568e25cf2ea37efc4fdbdb7cc946a gcc/tree-outof-ssa.h
+@@ -55391,13 +55695,13 @@
+ 99a21e7e99ce428caf4aff51ca2328a3 gcc/tree-profile.c
+ c4a672c5b34898471e4c09cd7d897c6f gcc/tree-scalar-evolution.c
+ ddd74c800272e36b5e04e6b839d5aaf9 gcc/tree-scalar-evolution.h
+-b1365506126df71ada53674e6e684695 gcc/tree-sra.c
++fc0f9a64091d8fb69026693b3385fafe gcc/tree-sra.c
+ 5cbd1c07136c29a87b15ca8006f24649 gcc/tree-ssa-address.c
+ 1fb91694b7ea342f3f4755974d570401 gcc/tree-ssa-address.h
+ 630bd55e80d8b02f04bf9979745e5eaa gcc/tree-ssa-alias.c
+ b2112211d28a5a985396b2b827acfd25 gcc/tree-ssa-alias.h
+ 9a7c8e81ccb787bb00b0ee8ef2a71586 gcc/tree-ssa-ccp.c
+-f14c1971c50057b0efda7772baa2d122 gcc/tree-ssa-coalesce.c
++4e0e13ee3807e5c0daad9489f9fd55d2 gcc/tree-ssa-coalesce.c
+ 0a798eb3055ef1b38167cee71723befe gcc/tree-ssa-coalesce.h
+ d655d555dd2ea00da5e0e3cfe76f03a6 gcc/tree-ssa-copy.c
+ 7430a47cea2356d7083f6b39087b46cc gcc/tree-ssa-dce.c
+@@ -55418,27 +55722,27 @@
+ 037e46f901b04e1897e0f5338070fceb gcc/tree-ssa-loop-niter.c
+ e39c11a700556495027cf2594eda607e gcc/tree-ssa-loop-niter.h
+ 7206349f9866f4040378a141a4a3fc10 gcc/tree-ssa-loop-prefetch.c
+-84aa2feb3f8ea51e2cc8fe865216939a gcc/tree-ssa-loop-unswitch.c
++cedc12f866ad14c0ce0ff80357554e21 gcc/tree-ssa-loop-unswitch.c
+ 7b56fac467e6a65d335907e274999ddb gcc/tree-ssa-loop.c
+ 4c430ffbb3398e58ddeb42580926a06a gcc/tree-ssa-loop.h
+ 83739b381655c7ccd1da3706e62f763a gcc/tree-ssa-math-opts.c
+ 09e6cc3a775fe10a83c1b13a20ff8ad5 gcc/tree-ssa-operands.c
+ ae2259e78bf92cdab02fb8c53b1f6140 gcc/tree-ssa-operands.h
+ 169a3b8b19b7f59128b8fe9f320c7fcd gcc/tree-ssa-phionlycprop.c
+-49410965fa7b486577975e8debd36e2f gcc/tree-ssa-phiopt.c
++b85be844891ced7fd987529031c3d383 gcc/tree-ssa-phiopt.c
+ 27c779dd8cb8a44e82d9efddf8d5e8e1 gcc/tree-ssa-phiprop.c
+ b203f1a7e87223f4283cef39502baa59 gcc/tree-ssa-pre.c
+ 6eca612875babdeead518212272356c7 gcc/tree-ssa-propagate.c
+ 2c2fdda0693f653ff6694bec50f9c6be gcc/tree-ssa-propagate.h
+ 33d8e1cb9a77d4f2092ec76958543645 gcc/tree-ssa-reassoc.c
+-c657927d72df8ff9c34292cc1f741095 gcc/tree-ssa-sccvn.c
++db75889847d8554f03c878a71e52ee38 gcc/tree-ssa-sccvn.c
+ bf9606517975c072a298e6e9648d84fe gcc/tree-ssa-sccvn.h
+ 27f3203e67b17d43acb249774afcce00 gcc/tree-ssa-scopedtables.c
+ faf7ec5d35f4c8016f9e652447e47297 gcc/tree-ssa-scopedtables.h
+ b5d1efde969440d8b72d27d076a0ded2 gcc/tree-ssa-sink.c
+-46a7699a73f5e5286886d89d2bd5de52 gcc/tree-ssa-strlen.c
+-33dafcfeaf6c84a5506cc3816c86faf8 gcc/tree-ssa-structalias.c
+-1d75d06dc18c08ea9eae1d79c319be9b gcc/tree-ssa-tail-merge.c
++5ca1b76e4fefc9dd0b6407eef1209e54 gcc/tree-ssa-strlen.c
++d738280db76fb802d569cd6be9d607d8 gcc/tree-ssa-structalias.c
++1a154f97147787cf927ca27f492d0000 gcc/tree-ssa-tail-merge.c
+ a31830f7606f1d982bb91bfda1036ca7 gcc/tree-ssa-ter.c
+ 72d07b4d9955684fab7636c602c4b360 gcc/tree-ssa-ter.h
+ f01de11598fc3072fc0b64a42e7d2825 gcc/tree-ssa-threadbackward.c
+@@ -55448,8 +55752,8 @@
+ cdc7062662420b220cbdf71ad079b3da gcc/tree-ssa-threadupdate.c
+ 268d9ea686863a09a4d82c900aa4c453 gcc/tree-ssa-threadupdate.h
+ 2aceb281be597588bf8b234371f7f9b0 gcc/tree-ssa-uncprop.c
+-8ea45b89bc709fa068dda47244128737 gcc/tree-ssa-uninit.c
+-ddc52810a19a908dfb484ac2adcd0a8f gcc/tree-ssa.c
++d5a1e950b0f1aec43c3cdc2e60194636 gcc/tree-ssa-uninit.c
++8144927d9c28207da8408d4fe6f74dd9 gcc/tree-ssa.c
+ d10beb2794c644e7d51b66973cf5f119 gcc/tree-ssa.h
+ 462f5e30bf38034f61977d169ac9b1d7 gcc/tree-ssanames.c
+ db5115461f6035db3ac2359d88de6bb6 gcc/tree-ssanames.h
+@@ -55461,26 +55765,26 @@
+ d582f891f95af854317037e4020c5f90 gcc/tree-streamer.h
+ 11bd30d126bfef5e25674bf369287718 gcc/tree-switch-conversion.c
+ 88fc834970e1ba32e98998d7ce7ecf09 gcc/tree-tailcall.c
+-ff2c431cb2ebc6c957f22bf35b8a688f gcc/tree-vect-data-refs.c
++3df1efa82963e06359c8d728ff0de39f gcc/tree-vect-data-refs.c
+ a78063c6f19eea041e35fe5515a935f2 gcc/tree-vect-generic.c
+ 318b8e4c49ce9ec44a055d34b947f5c9 gcc/tree-vect-loop-manip.c
+-ca460ecf31dfad6c90712eb57309221b gcc/tree-vect-loop.c
+-59b33d1d3db9231379ab4bc62f42cdad gcc/tree-vect-patterns.c
+-fa66db0d8c17a25f34719a755a575ea6 gcc/tree-vect-slp.c
+-05c56dc171e2656047de4e06c36f2cf0 gcc/tree-vect-stmts.c
++295d03e5d7392b0acca8257dea216f96 gcc/tree-vect-loop.c
++799481f961907f33717a68493fea6818 gcc/tree-vect-patterns.c
++c2b28b1f389315c73c5ffce684eb42a1 gcc/tree-vect-slp.c
++6b5219bb5e6297fb4ca0981626118339 gcc/tree-vect-stmts.c
+ 7729076c55712e0bfb562f337107c400 gcc/tree-vectorizer.c
+ 99cdf0e00b25ff01da509c7f6bd7f8fd gcc/tree-vectorizer.h
+-357a693e48ab9a122428746f6bbda9c9 gcc/tree-vrp.c
+-41531148c5417dcde8dba9bf26c66867 gcc/tree.c
++519f725a2fcd44fc90e9a7b380b3f9ba gcc/tree-vrp.c
++f90241266bdebc4600cc5d1f2d672654 gcc/tree.c
+ 756c1546f4b1318f8d59106e5a786041 gcc/tree.def
+-d3ec69521a1c446bbd5dc30b78fbea7c gcc/tree.h
++8f21fb5a83ef2833a239d86c64c6fe49 gcc/tree.h
+ 59d18b65bc8897bea70f8d136681423f gcc/treestruct.def
+ 7a21c960d344023b96194e4bc4625c10 gcc/tsan.c
+ 59b8e58a7954f6d352d923f0bbdd24ba gcc/tsan.h
+ 4fcf15c72e56a3360214b87bd3df82de gcc/tsystem.h
+ abc8eba4119c9cb0bc421df5afb01334 gcc/typeclass.h
+ 572fb9b575cab50b68cebce0e6aaab5b gcc/typed-splay-tree.h
+-e32ea98c8ae093ac3b194bfcdff55030 gcc/ubsan.c
++c7235fe9fe050b768fe698d0edf40e4a gcc/ubsan.c
+ 81e340a3b45094070fa00910435108f6 gcc/ubsan.h
+ 7435de97b351df3a173bb3259cdfa730 gcc/valtrack.c
+ fd43fe3f222442739550a35e7bad2e4f gcc/valtrack.h
+@@ -55610,7 +55914,7 @@
+ 68395a53adb86132c753b865a97f49e5 libada/configure
+ dc03104644ef27c11606ab0f4f675f06 libada/configure.ac
+ 46d3fe6da7a771cc2d5420c4137a6861 libatomic/.gitignore
+-a748d5a529fba14ffb71ba76af37f394 libatomic/ChangeLog
++c6d6b7a83aac18a7ec19f90d870b4223 libatomic/ChangeLog
+ f7e487a2a8e032a211ad21a5681e4b55 libatomic/Makefile.am
+ 685ebec1fe8aa94deb1729b48bb2fc6c libatomic/Makefile.in
+ f7853b06953072a9987a45a5b00782d6 libatomic/acinclude.m4
+@@ -55630,12 +55934,14 @@
+ 3a5510d41511e835335114b73128a52e libatomic/config/posix/host-config.h
+ 2ef059ec5908eac5b9f19da9e90e4717 libatomic/config/posix/lock.c
+ d04f86e742ddfedb71fb4a3d0ceede39 libatomic/config/powerpc/host-config.h
++9bf3d2dd5ae558a4d9ab5b393b86c96b libatomic/config/rtems/host-config.h
++472ff64130ea77e3d5e080beacca1fa8 libatomic/config/rtems/lock.c
+ fc9523d1ea4e96a55adfb15c3031cf12 libatomic/config/x86/fenv.c
+ e87431bfab4d41697b1e7bfa18624f2f libatomic/config/x86/host-config.h
+ 5343c7f0d7449e34a4123a65183e280d libatomic/config/x86/init.c
+ 6c35813a8871f271868fb796ae4b6e4a libatomic/configure
+ db061ec219987557cec2ae3ea3c97870 libatomic/configure.ac
+-05354b654eadd0af2e2aa91621996955 libatomic/configure.tgt
++0b2f1d581b06d5e45b083e9759ffeef0 libatomic/configure.tgt
+ bea3c296a69d67a89a6da22714ca34d4 libatomic/exch_n.c
+ b899afba4d403aec004c33141df2324d libatomic/fadd_n.c
+ ee6f02fad9bd551a906477f16740578f libatomic/fand_n.c
+@@ -55692,7 +55998,7 @@
+ 8a7308fda7ed1543cb9e3be0f8e47bce libatomic/testsuite/libatomic.c/atomic-store-5.c
+ 40618200985a15bcba64f871863da498 libatomic/testsuite/libatomic.c/c.exp
+ 97b0c9cdfcb733664bdf4efe0f5dc449 libatomic/testsuite/libatomic.c/generic-2.c
+-5af0cf98353185e14ab202d5134d1a07 libbacktrace/ChangeLog
++6e3d18e0325321481dd8fc6b0c938244 libbacktrace/ChangeLog
+ eb3a88b53140eb234a99a4b3a55e56bf libbacktrace/ChangeLog.jit
+ adcff7cabf0971aed26d7fe5e3630a23 libbacktrace/Makefile.am
+ a4bbeef6b43604c1ca251b56c1bc4888 libbacktrace/Makefile.in
+@@ -55708,7 +56014,7 @@
+ ba93ae2239d2af1adfed22f2fa91164b libbacktrace/configure
+ f2bbca83f94ce0b40a14c2014386aa1e libbacktrace/configure.ac
+ 150cbd2ed23f310bcc41f347e524098e libbacktrace/dwarf.c
+-cc7a845678c203d3820e434fd187feaa libbacktrace/elf.c
++210330106bbc3adbabf0934be8ff1b60 libbacktrace/elf.c
+ ccbfca5254d57415f02229b05852fe4c libbacktrace/fileline.c
+ 51926f4b28baf759f214371541616bd8 libbacktrace/filetype.awk
+ 4a1619d74095c0d90ed2047cfe801a8f libbacktrace/internal.h
+@@ -55747,9 +56053,9 @@
+ 7b5e3c71c404e08cbe1d3ca92449c0eb libcc1/plugin.cc
+ 595b9a542a8f80367ebbeecbc51b1ac7 libcc1/rpc.hh
+ 14f215429d450a743fce24b101552f3e libcc1/status.hh
+-a90aa9053a5c89426bbbe4367988cf16 libcilkrts/ChangeLog
+-4fa054d244a7b7a99d1173bc6c24ff2c libcilkrts/Makefile.am
+-f837283c8a4f9034983ce5d009c42546 libcilkrts/Makefile.in
++45b9413325d303caf626b976ded66a4e libcilkrts/ChangeLog
++df0ff198f37089171b490f87912f9602 libcilkrts/Makefile.am
++71d9f8e3f82862af1e8d523b0ae6a587 libcilkrts/Makefile.in
+ 4a307b1474cad63768b2ae0c183b6259 libcilkrts/README
+ 6126c8d03f6c3cc1a2f5e502f3196cd7 libcilkrts/aclocal.m4
+ 991e7c85d4800532c24900dc8e2f9e11 libcilkrts/configure
+@@ -55883,50 +56189,29 @@
+ 8b169f1ea64fbdcd4eb3b28cc2a20e5d libcpp/makeucnid.c
+ 13e85e048fd80372c5ee39c177ccda58 libcpp/mkdeps.c
+ 2037cc2be924ca9b3d6dcf813bb1f5a5 libcpp/pch.c
+-7f8703b9dde7cc96a7b38b846eb0edda libcpp/po/ChangeLog
+-16add93743f11e9d1d0205a04e4bda1b libcpp/po/be.gmo
+-1559c0a42bd004e676cda54ca272f453 libcpp/po/be.po
+-93772efdb39bca70542c9eb4cfd69115 libcpp/po/ca.gmo
+-abc67e73d2df075360bb47d03f966a60 libcpp/po/ca.po
++e19317ae35b73c8ec3b221f66011547d libcpp/po/ChangeLog
++2ef89459bd607154106cddd9d5643379 libcpp/po/be.po
++a1a6f36f6fb1c4f5a648dcd391370e6c libcpp/po/ca.po
+ 2eaff30752e253bbc6a6f3147f29ae27 libcpp/po/cpplib.pot
+-f4665bf2cfc8ea52a9c5dcd603b4c87d libcpp/po/da.gmo
+-291ea628726a545a31faf6e603d06a2e libcpp/po/da.po
+-183186721a93f35ebe5cb5efef452541 libcpp/po/de.gmo
+-129478a9526671f9f1aeb11c29ee4417 libcpp/po/de.po
+-50dcba779ef25b226362151a23815e88 libcpp/po/el.gmo
+-904c98c8ea71a366440f9b040ba6fde8 libcpp/po/el.po
+-8ecdc42ad242ed543e6024cc56a48ef5 libcpp/po/eo.gmo
+-a7b5efb5f3491c3e787d25790c599713 libcpp/po/eo.po
+-603c006aec9cb9504359e7f20c6dab7f libcpp/po/es.gmo
+-d1b55d77237726db4bd7a3b1d30a0c6f libcpp/po/es.po
+-0f532ddd0b5a92abe2c8620bdcf23d32 libcpp/po/fi.gmo
+-fe350d53bed05a2b47fc8fff10fcaaaf libcpp/po/fi.po
+-55e47fb744d48b8e20159311c0a4c0cb libcpp/po/fr.gmo
+-58c29873a41dfefa30d2aff45818ae54 libcpp/po/fr.po
+-39ddd555e334249c8130e512452c8fc3 libcpp/po/id.gmo
+-48482d6240ce173ee2d785d5a2eaa743 libcpp/po/id.po
+-37ed1f49679dbc578a78dc66a7ea3998 libcpp/po/ja.gmo
+-36d7c68b0bd77115142ff130d0b0bfae libcpp/po/ja.po
+-fd30c6f79433b2872abe0a2217fbd291 libcpp/po/nl.gmo
+-3f6ebd19290c98eea7cef9914f9654d8 libcpp/po/nl.po
+-94a998c3581a719af78c5cdf216fad18 libcpp/po/pt_BR.gmo
+-0aaf233a0d7f79627ee398ea192bdd74 libcpp/po/pt_BR.po
+-79b63b3694b5060a3b38fa8a8573db1f libcpp/po/ru.gmo
+-17e810f41cd8152d067ee843834605b9 libcpp/po/ru.po
+-0d50dac9aff5591b5c493123801f5915 libcpp/po/sr.gmo
+-456bf096ac10652d86537242aeb463c3 libcpp/po/sr.po
+-3270d407f458f07423f181ee4a40fb53 libcpp/po/sv.gmo
+-6f366f83d29717cdb9e64cbf89997abf libcpp/po/sv.po
+-a3a472f46bd1cd7bf3c58618f21cc54e libcpp/po/tr.gmo
+-1972ca01f7590354477a7256df8a6db7 libcpp/po/tr.po
+-95e35a0dd2e18bc3ef2c510f396b0fcd libcpp/po/uk.gmo
+-f4e29e663311363944e207217605faa1 libcpp/po/uk.po
+-eb9d4c6abf39c08631813497c1e88143 libcpp/po/vi.gmo
+-ed63d3d462ea423d0e69dc4bfece599d libcpp/po/vi.po
+-ecdc35f641666bac52fcf050bcf706f3 libcpp/po/zh_CN.gmo
+-1e612707435e6b2f431d0ea58b86b964 libcpp/po/zh_CN.po
+-9c28154d3d01abba175e54808d337cf1 libcpp/po/zh_TW.gmo
+-e936ed69aa5357776e3ff4842baaa7d9 libcpp/po/zh_TW.po
++278cf1b2cce22dea3763b28344886a2a libcpp/po/da.po
++e89016e7c45ec01c20197636ede2cbd0 libcpp/po/de.po
++11c21873f5e6ec33ebfb8fd2edc15ae5 libcpp/po/el.po
++d8ed72c7d26634e8c95da70edb7bc372 libcpp/po/eo.po
++a424670f1e7c781212fcc8b6fc84fde6 libcpp/po/es.po
++0b9472443ff28c36c40f04f1a3088fab libcpp/po/fi.po
++1355bfb80461bd6990de22e13e1f3544 libcpp/po/fr.po
++dbefe42ad79c2a361c8d2874a638509b libcpp/po/id.po
++e8d46de87f8be79612a738a3364a9953 libcpp/po/ja.po
++74c354860e824a03efc4a4d0a0f7f5af libcpp/po/nl.po
++ad9e0f793ad848abb020dd1582d7c506 libcpp/po/pt_BR.po
++9718e0dd8553312042790da1bd8ed557 libcpp/po/ru.po
++2aa02b3cdd59ca4f029ff1e84e5baf58 libcpp/po/sr.po
++474e69915194f83eb88ad85ae241016c libcpp/po/sv.po
++1d16e54e582bc5236bed93a33fb6baa5 libcpp/po/tr.po
++c0676321d8fd8f22839d400145a59e55 libcpp/po/uk.po
++097c8a713da9fbb048eca497169f9e93 libcpp/po/vi.po
++52fade796713669a418cd39a18e2c750 libcpp/po/zh_CN.po
++10138794552573c15bfc3be6c6e35235 libcpp/po/zh_TW.po
+ f4fb93166f911a7496d4dd7cd1e57f8c libcpp/symtab.c
+ 1b0ca94d69c0fcdb8b4a544998579e84 libcpp/system.h
+ 5faa90d66b891533b7d68fa1dcc88bf8 libcpp/traditional.c
+@@ -55996,7 +56281,7 @@
+ 1b8d5bd512629f5b4d1895fe4dd2c645 libdecnumber/dpd/decimal64.c
+ 33e09faa8cbe6117509446874a776fc6 libdecnumber/dpd/decimal64.h
+ 0f6db29710e7075c2fd62bc4478b3b8d libdecnumber/dpd/decimal64Symbols.h
+-a3e0d6f60a337a91aecc3dc56e0acda6 libffi/ChangeLog
++bf52041046c368175a62277d781b7dc7 libffi/ChangeLog
+ ba66fc19311348d373ec271be939a659 libffi/ChangeLog.libffi
+ fbbc216bc25d759a72ea3e6d734af56b libffi/ChangeLog.libgcj
+ d946d2b97454ad50a1dbfbf48923c5be libffi/ChangeLog.v1
+@@ -56009,7 +56294,6 @@
+ 60bcb183fb531852628fcecb1ea6ed66 libffi/configure
+ c9655a9cea2ec7adcdd5ca72cb247b90 libffi/configure.ac
+ 84d2d9f2ebfac28a1697db5dc956a25b libffi/configure.host
+-b966104ceafa5618f9898a1a3bb1ca13 libffi/doc/libffi.info
+ cfec4a5a1bb5d36550e15ac051c14148 libffi/doc/libffi.texi
+ 2969ffc23f66d73392207633f25ab252 libffi/doc/version.texi
+ 22b7acb3b27a7bc2c6d5e436e1944367 libffi/fficonfig.h.in
+@@ -56158,7 +56442,7 @@
+ 2e5e042bd1709c208dd670c61bbc5ef1 libffi/testsuite/Makefile.am
+ e52378e7fee52f7a3af3b8e8267c4c15 libffi/testsuite/Makefile.in
+ dce80ba7e038ca18591aabc6d3d2582c libffi/testsuite/config/default.exp
+-0cfcd6f2d3b7c42d7e918c631681ad09 libffi/testsuite/lib/libffi.exp
++cff6a796e12fcc98d74bd98cac4cdf67 libffi/testsuite/lib/libffi.exp
+ 88f888c66cee8d916e1ac91000ecc87a libffi/testsuite/lib/target-libpath.exp
+ 68db067550882b3b091a82df87310fff libffi/testsuite/lib/wrapper.exp
+ e2b2182b50885f833527f9ccc86eeaa4 libffi/testsuite/libffi.call/call.exp
+@@ -56354,9 +56638,9 @@
+ 291be426192f460f6a07dfe1c96ab094 libffi/testsuite/libffi.special/special.exp
+ 93fc3ea311b79f64004992807ce75d1e libffi/testsuite/libffi.special/unwindtest.cc
+ 185d0795017fbbe253a13db8e34085f9 libffi/testsuite/libffi.special/unwindtest_ffi_call.cc
+-1863571149697e4b63ce3f4a6271960c libgcc/ChangeLog
++fbddbb651e2206a97d9d80ba4ba1e9fc libgcc/ChangeLog
+ d35f709a03da6e07d660c91956551a36 libgcc/Makefile.in
+-a6e140bfee349c6b1e07f463c967a52a libgcc/config.host
++bee9ede19588ab9e5fc65f2f422488b2 libgcc/config.host
+ 3b9d11b9f405d47c079d725f2f16271e libgcc/config.in
+ c1dd89f96f28e8843a51c0c7b560c6c7 libgcc/config/aarch64/crtfastmath.c
+ 9dca9ad5de19b368a1b3ec83a660a34f libgcc/config/aarch64/crti.S
+@@ -57280,6 +57564,8 @@
+ 32d9de959d3c6e0ae0519a32b9019cf1 libgcc/config/rl78/t-rl78
+ 48a7e3ef8d25dc3fe190d63c81df0ccc libgcc/config/rl78/trampoline.S
+ 760912f22e59adbfe0317ee3df1b4849 libgcc/config/rl78/vregs.h
++c8d40dfa3c5da5264575681c125cf8e5 libgcc/config/rs6000/_divkc3.c
++6b20fcda7294bd54b5687f751561cae1 libgcc/config/rs6000/_mulkc3.c
+ c16e3f7c33fc7e6d7b9fc3848e9fef80 libgcc/config/rs6000/aix-unwind.h
+ 737841f917469789a5f925e6f08da1de libgcc/config/rs6000/aixinitfini.c
+ d8742cbcf2910ae155f782fd708e4650 libgcc/config/rs6000/atexit.c
+@@ -57343,7 +57629,7 @@
+ be7356b9f07a2aec27b9513356b579bb libgcc/config/rs6000/morestack.S
+ f509faf6a043b7f628b9a5b7b64497c7 libgcc/config/rs6000/on_exit.c
+ aa98229d1fb7829c9c2736a6f235b935 libgcc/config/rs6000/ppc64-fp.c
+-0e804e76a84bf2fe403fa63a69cbe8f2 libgcc/config/rs6000/quad-float128.h
++5decdd89de7b5048dcc33ea7e516457b libgcc/config/rs6000/quad-float128.h
+ aba354b12ccddf23281f544a4b3c446a libgcc/config/rs6000/sfp-exceptions.c
+ 8ec74aa9b81fc396f992f9900794bfc0 libgcc/config/rs6000/sfp-machine.h
+ 692f688b65e81676c6fe126268165355 libgcc/config/rs6000/sol-ci.S
+@@ -57354,7 +57640,7 @@
+ d7cdc73d7a8e658f872ea07474837bc2 libgcc/config/rs6000/t-darwin64
+ f809b3f51cd4c6b7b1b2a01f98f5917a libgcc/config/rs6000/t-e500v1-fp
+ 9553248d1ebf726cfc8ab5c14e739322 libgcc/config/rs6000/t-e500v2-fp
+-f7b847fe7c81592dd38f899900b92306 libgcc/config/rs6000/t-float128
++b9b0914220774c0a3a5958018b9adf0d libgcc/config/rs6000/t-float128
+ 6b46d6077e82665fed06030e9dbf0d0c libgcc/config/rs6000/t-float128-hw
+ 491851bed60093e210455661abd50ba3 libgcc/config/rs6000/t-freebsd
+ 4976aac1da0b181cf133fe8ef7243000 libgcc/config/rs6000/t-freebsd64
+@@ -60580,7 +60866,7 @@
+ 1526040f769ea611af781d4ed150f258 libgo/testsuite/gotest
+ ead4e721beb57b319fcd7da8ddf10705 libgo/testsuite/lib/libgo.exp
+ 6df485581d2f02246f41b5ca46f5bb5d libgo/testsuite/libgo.testmain/testmain.exp
+-9befdbc414a14f64f3bf9d882a6cc3d3 libgomp/ChangeLog
++e2942a09bb570e700d8ab4230a14bce1 libgomp/ChangeLog
+ 0d55aa862aee66efdc5f8d62c94ff8fb libgomp/ChangeLog.graphite
+ 255738c9562136c311d799ad06684be1 libgomp/Makefile.am
+ a97552ea29bea4babb0d125f47fbc5f9 libgomp/Makefile.in
+@@ -60693,7 +60979,6 @@
+ 2a682110865cc758a3c1df97dd3992a3 libgomp/libgomp-plugin.c
+ dd8799786633c7a3094553dfc8a9ca8b libgomp/libgomp-plugin.h
+ 99fefc96d4bc2d4b96c65131330e2c70 libgomp/libgomp.h
+-4bec48b377f524140d3caa7eea71c995 libgomp/libgomp.info
+ 9a1ab09c02391af1c95e6d63cb8eb499 libgomp/libgomp.map
+ 8b2aa50aecad82171348a6918309afd6 libgomp/libgomp.spec.in
+ 6a91bc2eda39d9eddffc49cbcb5e07f2 libgomp/libgomp.texi
+@@ -60910,6 +61195,8 @@
+ f7b3ed0affdfcdc8be33426e55f56c65 libgomp/testsuite/libgomp.c++/target-19.C
+ a7edc8ba5a137d69a617a4d3675b5b01 libgomp/testsuite/libgomp.c++/target-2-aux.cc
+ adba67f432b50b18b63fd983c7c0402a libgomp/testsuite/libgomp.c++/target-2.C
++37e4e40177aed08ff1f53d7b901a11ce libgomp/testsuite/libgomp.c++/target-20.C
++0348df8a93fdb7c3f0a0f7923eb9555c libgomp/testsuite/libgomp.c++/target-21.C
+ f5f370945da4ed9519d04fd309672472 libgomp/testsuite/libgomp.c++/target-3.C
+ da31150d5d916f6dc9bde797015a2f2f libgomp/testsuite/libgomp.c++/target-4.C
+ 1ef24f8ab6abe7b7355060391f0ec986 libgomp/testsuite/libgomp.c++/target-5.C
+@@ -61207,6 +61494,8 @@
+ 37da387849a1a7da3f75e528c47ee2cb libgomp/testsuite/libgomp.c/pr68960.c
+ 9995ebc7d239ebe751419090068c6f33 libgomp/testsuite/libgomp.c/pr69110.c
+ fae0065b967df85f2d4ef6b0d6a27837 libgomp/testsuite/libgomp.c/pr69805.c
++44e637116f58b1ad19c190f3b5a123fa libgomp/testsuite/libgomp.c/pr70680-1.c
++2c3d1f7b987fcb66ad2f7ba2adc2dc73 libgomp/testsuite/libgomp.c/pr70680-2.c
+ 2a0a447db3ae892c0c62b0136b00360e libgomp/testsuite/libgomp.c/priority.c
+ ea7c9e74bda402b1663a903b26400fab libgomp/testsuite/libgomp.c/private-1.c
+ a594cebdf052900dd0c8792068e14d85 libgomp/testsuite/libgomp.c/reduction-1.c
+@@ -61350,6 +61639,7 @@
+ 6116086a89b906c26bd9afe26e57a07a libgomp/testsuite/libgomp.fortran/appendix-a/a10.1.f90
+ ba05d0e1b584ec6c750d14a486ac83b2 libgomp/testsuite/libgomp.fortran/associate1.f90
+ 41cd3ed9183e6bc7b20ef8836663fbdd libgomp/testsuite/libgomp.fortran/associate2.f90
++aa03f95280189c0147b6c2ec288164ba libgomp/testsuite/libgomp.fortran/associate3.f90
+ cb0b79f7bddc47118981784eb7ba6f75 libgomp/testsuite/libgomp.fortran/cancel-do-1.f90
+ 2a5fe3d97ff9f23e08df5e015a45e3bc libgomp/testsuite/libgomp.fortran/cancel-do-2.f90
+ a110324b7cb72dc5755c1ad39c5230fd libgomp/testsuite/libgomp.fortran/cancel-parallel-1.f90
+@@ -61575,6 +61865,7 @@
+ f3d2ea4630d1fcb25d84b6ba89ae47f2 libgomp/testsuite/libgomp.hsa.c/builtins-1.c
+ 6e3e2fc227f8fad61ddcb85fcddd983d libgomp/testsuite/libgomp.hsa.c/c.exp
+ 27fb32a6a737ec1b4f131bda0a196191 libgomp/testsuite/libgomp.hsa.c/complex-1.c
++7c0ddbedd6b281bc9300f36374a8e5df libgomp/testsuite/libgomp.hsa.c/complex-align-2.c
+ 9ca2d40b0829f30ffd252bf29d77c6f6 libgomp/testsuite/libgomp.hsa.c/formal-actual-args-1.c
+ 566a787a23dbfd923ff41ba6a4a30736 libgomp/testsuite/libgomp.hsa.c/function-call-1.c
+ a4130e550c56fec85239c9db68e18fdb libgomp/testsuite/libgomp.hsa.c/get-level-1.c
+@@ -61587,9 +61878,10 @@
+ dfc590b024995313958247342296f179 libgomp/testsuite/libgomp.hsa.c/rotate-1.c
+ bfac6d74739b95deba27861d2be18215 libgomp/testsuite/libgomp.hsa.c/switch-1.c
+ e410b9a2ecc042fbefbbbcff667b3510 libgomp/testsuite/libgomp.hsa.c/switch-branch-1.c
++ca9f24c1fc8b56e57a5e25787159b637 libgomp/testsuite/libgomp.hsa.c/switch-sbr-2.c
+ e4d2b044d4aee116d4062f8d22fe1113 libgomp/testsuite/libgomp.oacc-c++/c++.exp
+ b27cecd237d0e2ce459988833e90f28a libgomp/testsuite/libgomp.oacc-c++/declare-1.C
+-50a71d368a1d2347284a608ab6a629aa libgomp/testsuite/libgomp.oacc-c++/template-reduction.C
++4b124b6e487c75fcb15e9f0e8d1f85b5 libgomp/testsuite/libgomp.oacc-c++/template-reduction.C
+ 451978dda3b58f6a597aa1b515da90e7 libgomp/testsuite/libgomp.oacc-c-c++-common/abort-1.c
+ 2187ea0d1f3ce15e1d66e17ed2fecfc6 libgomp/testsuite/libgomp.oacc-c-c++-common/abort-2.c
+ 659c1e7c321078b832a4fe638bb81184 libgomp/testsuite/libgomp.oacc-c-c++-common/abort-3.c
+@@ -61603,7 +61895,7 @@
+ 7701cc2c5657c7e8793bdc8a296226d0 libgomp/testsuite/libgomp.oacc-c-c++-common/atomic_capture-2.c
+ 97f62618e6e37c14b2b9ed17c7579fd0 libgomp/testsuite/libgomp.oacc-c-c++-common/atomic_rw-1.c
+ 276fea47eb47f5b846d12e7f4013aaa1 libgomp/testsuite/libgomp.oacc-c-c++-common/atomic_update-1.c
+-9ecb1a6355fa4295e382d463432d8e21 libgomp/testsuite/libgomp.oacc-c-c++-common/cache-1.c
++b38b68cea6a76f0b24d0695e8101f2cf libgomp/testsuite/libgomp.oacc-c-c++-common/cache-1.c
+ 1f516ecd3b6c4ad48b36e5fe908cae6a libgomp/testsuite/libgomp.oacc-c-c++-common/clauses-1.c
+ e69ad21264603585ada7277411b59fab libgomp/testsuite/libgomp.oacc-c-c++-common/clauses-2.c
+ a4310590c76fb5671abb7e599593076d libgomp/testsuite/libgomp.oacc-c-c++-common/collapse-1.c
+@@ -61611,6 +61903,7 @@
+ 89f08493dc1d069d2b20c950dc3daeb3 libgomp/testsuite/libgomp.oacc-c-c++-common/collapse-3.c
+ ca0f03a313f6823442da3d981e03bc9f libgomp/testsuite/libgomp.oacc-c-c++-common/collapse-4.c
+ 19f2f5601f95ec58b09b95258b0818b1 libgomp/testsuite/libgomp.oacc-c-c++-common/combined-directives-1.c
++958046e6274805975b0db25945fb2609 libgomp/testsuite/libgomp.oacc-c-c++-common/combined-reduction.c
+ e05c73847f8ec27c6cb39c45216fcf0f libgomp/testsuite/libgomp.oacc-c-c++-common/context-1.c
+ 082ce69140a390063d0f7f40d1eb2046 libgomp/testsuite/libgomp.oacc-c-c++-common/context-2.c
+ 223e42eece140c60f9e6b5befdcca4e1 libgomp/testsuite/libgomp.oacc-c-c++-common/context-3.c
+@@ -61820,6 +62113,8 @@
+ e65c44041c15898765a99f6782a191d2 libgomp/testsuite/libgomp.oacc-c-c++-common/vector-type-1.c
+ ab9847c46ebba2b7d32c8dd686d0dd0c libgomp/testsuite/libgomp.oacc-c-c++-common/vprop.c
+ 6a3ebccf985a3d14104d3ff79347af01 libgomp/testsuite/libgomp.oacc-c/c.exp
++cbdcc7dbb1bbfcb008b972db87d6a771 libgomp/testsuite/libgomp.oacc-c/nested-function-1.c
++009dee52db49f02bd518c318808bd4ab libgomp/testsuite/libgomp.oacc-c/nested-function-2.c
+ 00763c45e9c4a49ef7249e327925090e libgomp/testsuite/libgomp.oacc-fortran/abort-1.f90
+ 92672ea2291844ee4dc0b00666eb7766 libgomp/testsuite/libgomp.oacc-fortran/abort-2.f90
+ c280f253738f9ec4dac767225d094975 libgomp/testsuite/libgomp.oacc-fortran/acc_on_device-1-1.f90
+@@ -61831,6 +62126,7 @@
+ 7c923f2a5e595d3e5bc0ae52b8c3b1d2 libgomp/testsuite/libgomp.oacc-fortran/atomic_capture-1.f90
+ 1239e7569c34d9842432ab6666cd411c libgomp/testsuite/libgomp.oacc-fortran/atomic_rw-1.f90
+ 41253d0cb8d36acbbcd34b0461a3bb46 libgomp/testsuite/libgomp.oacc-fortran/atomic_update-1.f90
++c459a54e791263602dae13c9b38a66ad libgomp/testsuite/libgomp.oacc-fortran/cache-1.f95
+ 2ccddd43e49018b56fe9e1a45e9f9901 libgomp/testsuite/libgomp.oacc-fortran/clauses-1.f90
+ 0d6c26df6be6cef756b12696e14e07b5 libgomp/testsuite/libgomp.oacc-fortran/collapse-1.f90
+ 5a8991a0764ce9b04257546e4fa5f658 libgomp/testsuite/libgomp.oacc-fortran/collapse-2.f90
+@@ -61841,6 +62137,7 @@
+ 13468844967101467070cb7ac463c16b libgomp/testsuite/libgomp.oacc-fortran/collapse-7.f90
+ 6b3128948ec46f6c5a25eb114b5fc9c4 libgomp/testsuite/libgomp.oacc-fortran/collapse-8.f90
+ 8c396e2144fc18a3de1818ae8108bda5 libgomp/testsuite/libgomp.oacc-fortran/combined-directives-1.f90
++3733716c9184c05cf46fd635d0943a6d libgomp/testsuite/libgomp.oacc-fortran/combined-reduction.f90
+ 6306783e85f144ba81b9aac0fc341a71 libgomp/testsuite/libgomp.oacc-fortran/data-1.f90
+ e8adb123c09781787869ea368c1fa278 libgomp/testsuite/libgomp.oacc-fortran/data-2.f90
+ ce578dabaea526c76233d523eab686f7 libgomp/testsuite/libgomp.oacc-fortran/data-3.f90
+@@ -61882,6 +62179,9 @@
+ efcda465915ae848c58a3ea43c284842 libgomp/testsuite/libgomp.oacc-fortran/lib-7.f90
+ e055a49425dde48525db5350406511b2 libgomp/testsuite/libgomp.oacc-fortran/lib-8.f90
+ 8166a0c9b27377f05eb06d5dd0735cee libgomp/testsuite/libgomp.oacc-fortran/map-1.f90
++9dcc6a7c4180d3d892e5cdd3df4f088b libgomp/testsuite/libgomp.oacc-fortran/nested-function-1.f90
++bd7a72425ffbe9f89587d5a5138fe462 libgomp/testsuite/libgomp.oacc-fortran/nested-function-2.f90
++a1fa3ef264aa86add5dc08b5e9bd4b89 libgomp/testsuite/libgomp.oacc-fortran/nested-function-3.f90
+ a09b08acb0185066a021ba50ed1dacc8 libgomp/testsuite/libgomp.oacc-fortran/non-scalar-data.f90
+ 7702e59e2172a9499f765f4c9327f0bb libgomp/testsuite/libgomp.oacc-fortran/openacc_version-1.f
+ 77ec7fb0079c057c097fef3a8693467e libgomp/testsuite/libgomp.oacc-fortran/openacc_version-2.f90
+@@ -61912,7 +62212,7 @@
+ 6d7b9ef24d9986c5e4cb3f32834b1653 libgomp/work.c
+ 99c2e5e712b990ee07be10f53e41f3fb libiberty/.gitignore
+ a916467b91076e631dd8edb7424769c7 libiberty/COPYING.LIB
+-e4968519e78a8d9b3a6eb68364f43232 libiberty/ChangeLog
++dca230bedb414d8383bd5c94687b76e5 libiberty/ChangeLog
+ 347c31392973de6a4872d540c1718dc1 libiberty/ChangeLog.jit
+ f925c3515902a26a68a6019f355abc56 libiberty/Makefile.in
+ c68dbf7834af4281ebd84caa3fd54680 libiberty/README
+@@ -61944,7 +62244,7 @@
+ 5824bd0f9be9f4fa74bb3bdc7fd9431c libiberty/configure.com
+ 32149e9d61d873be9c2950bee2ae7137 libiberty/copying-lib.texi
+ fe053283d3559af3ec5cac45f8ead009 libiberty/copysign.c
+-c6b40d8511eeaeb0b11a26fee6683f34 libiberty/cp-demangle.c
++a246775fbbbac2ddc6a2adc29a33a106 libiberty/cp-demangle.c
+ 652cd1eb0406f7c91f9297b189af4715 libiberty/cp-demangle.h
+ 5868438b5b6c384018d526ccee754b8f libiberty/cp-demint.c
+ 93007574a947e87f0a09933f28203e4a libiberty/cplus-dem.c
+@@ -62047,7 +62347,7 @@
+ 9e1bb6fe95ebb6415672ddf1da29ec65 libiberty/strverscmp.c
+ 6c6e2b1b21232455a5e54af57d46f959 libiberty/testsuite/Makefile.in
+ 69dd92f0372ec3a77e992bb9318dbdac libiberty/testsuite/d-demangle-expected
+-c22ce95c546f35923318dbdd235fb561 libiberty/testsuite/demangle-expected
++be18dcce0dfaec61638eb3172a13fe50 libiberty/testsuite/demangle-expected
+ 10ce55269f247e57d2901ee11e88d8bd libiberty/testsuite/demangler-fuzzer.c
+ 8b476ce26e8583eea8df7d77fe287a5a libiberty/testsuite/test-demangle.c
+ d629c8f2adde10d53657e437416cf27f libiberty/testsuite/test-expandargv.c
+@@ -62132,7 +62432,6 @@
+ ca06f6a22290f04aac1fc335ece29711 libitm/dispatch.h
+ c4d7034d2f52d605b4b8f4644d0b669e libitm/eh_cpp.cc
+ f545350500de7fa7f56cff5f11802e73 libitm/libitm.h
+-3619f31e0d1c048d49bf8b940ad76a78 libitm/libitm.info
+ 0c43820b921ecdbe9d98f068100e716a libitm/libitm.map
+ ea467d7117853d139bb288ab75261139 libitm/libitm.spec.in
+ 1c481e6f4cca694530ceaa0fdf2623a5 libitm/libitm.texi
+@@ -62178,7 +62477,7 @@
+ 62d4ccb869b56e1e27163303bf2a85f0 libitm/useraction.cc
+ 3028050fc7e9c2aa747445850c00fe86 libitm/util.cc
+ 94d55d512a9ba36caa9b7df079bae19f libjava/COPYING
+-77b69809abcc46abd5e609709c803b57 libjava/ChangeLog
++3155232b54d6470236f6ff13fd9b4714 libjava/ChangeLog
+ 03e1f38b916604fdf1470238201325f3 libjava/ChangeLog-1998
+ 691acb61fbd6a2235826ff55db5578be libjava/ChangeLog-1999
+ b58c6701706771a02bf00a77666941ef libjava/ChangeLog-2000
+@@ -62259,21 +62558,8 @@
+ b343eec566430e85d1f95c21438aa4ee libjava/classpath/doc/api/Makefile.am
+ 1d310e1c7d51b6af013da87024dc9620 libjava/classpath/doc/api/Makefile.in
+ 5ddd829b35fc94b0cdb119084089edb8 libjava/classpath/doc/cp-hacking.texinfo
+-862e32ddcce3928c53d25ceb1608b8f1 libjava/classpath/doc/cp-tools.info
+ 0349e5c38c548584225423ef4bafd20b libjava/classpath/doc/cp-tools.texinfo
+ 3155d9bd9a7bf4aff2ff0dfe4a2cb878 libjava/classpath/doc/cp-vmintegration.texinfo
+-9766e6c08e86644094f635b7c9f26311 libjava/classpath/doc/gappletviewer.1
+-a13d380ac9cfbfab4d349255c7e2e583 libjava/classpath/doc/gjar.1
+-620518f40be66424ca3f3554ff11d9a2 libjava/classpath/doc/gjarsigner.1
+-99a3b53ff1caa9d501559d63c3f1a8ab libjava/classpath/doc/gjavah.1
+-8946f2588c6fc6b9ec95f3aa67dc0ebf libjava/classpath/doc/gjdoc.1
+-e23154e1fde98eb1e2a036311e26079e libjava/classpath/doc/gkeytool.1
+-e2138b41681a6410660c264ac6110b01 libjava/classpath/doc/gnative2ascii.1
+-5f3880893ede4b0bda9592d85edbfe77 libjava/classpath/doc/gorbd.1
+-2730c7c5094b36af6f622d423ac4415f libjava/classpath/doc/grmid.1
+-e12a5f4399bcd70334461eafe135ad3c libjava/classpath/doc/grmiregistry.1
+-9e8815d844b257ea8d78b6c8120512b2 libjava/classpath/doc/gserialver.1
+-f2565826380e1f2dffe56404bb279a41 libjava/classpath/doc/gtnameserv.1
+ f7edd2bbe78e9a7e7aa706fbfa6f467e libjava/classpath/doc/texi2pod.pl
+ 01b23c87dcf82048a5958c8224653305 libjava/classpath/doc/texinfo.tex
+ b1e0c0c30547d57d7a09b04d47c70b06 libjava/classpath/examples/.cvsignore
+@@ -85323,7 +85609,7 @@
+ 4eaec6ec74d70ecea0976f23533030a8 libjava/testsuite/Makefile.am
+ fb42187d8e0bcb05191ae145e2ad631c libjava/testsuite/Makefile.in
+ dce80ba7e038ca18591aabc6d3d2582c libjava/testsuite/config/default.exp
+-046515428f7068fa92b4af50db67e94f libjava/testsuite/lib/libjava.exp
++12cddc134208161f95fe25d2b6ce9eed libjava/testsuite/lib/libjava.exp
+ 5bc5f3c2b92712d89b8fa8d99293ad20 libjava/testsuite/libjava.cni/PR9577.h
+ 783e9ef77859cbe3613da93348196aa4 libjava/testsuite/libjava.cni/PR9577.jar
+ 1cb376d608ce588877129087d302ad27 libjava/testsuite/libjava.cni/PR9577.java
+@@ -86189,7 +86475,7 @@
+ 434ac04eb066f5075299583492846410 libjava/verify.cc
+ 355440a0c2fb5e16259d7ae381b37ed5 libjava/win32-threads.cc
+ 434d5e5e91727dec004f0d1d1fab47ec libjava/win32.cc
+-f3fe0508b7217ee2f00578980c8b8c54 libmpx/ChangeLog
++1c2946e52a9e26c93e4b6fcd49671624 libmpx/ChangeLog
+ 38b5a5961bf81cf96b7905974a000dc2 libmpx/Makefile.am
+ 52ceef9cd663650f4d1d9c8e91656d14 libmpx/Makefile.in
+ 9883ed42b491d8aea83fdde90561cf2a libmpx/acinclude.m4
+@@ -86211,7 +86497,7 @@
+ e67fb1bdc86e2be5473ab0192835f369 libmpx/mpxwrap/Makefile.in
+ e7c62aca341ea472234d7cb0bc4af328 libmpx/mpxwrap/libmpxwrappers.map
+ 514fed0b52cdd26987101b36d86a7cf8 libmpx/mpxwrap/libtool-version
+-e2c59f29f5e40b045f5ffb7b1b983c89 libmpx/mpxwrap/mpx_wrappers.c
++c32d22d10f53f727607e2159bb49c6c2 libmpx/mpxwrap/mpx_wrappers.c
+ c281087ccf06b1126d489b8de6de6263 libobjc/ChangeLog
+ b9ae0bf274b89fa44e8eee13ad306f00 libobjc/Makefile.in
+ 261388284fa6d545a9a911c95536c866 libobjc/NXConstStr.m
+@@ -86379,7 +86665,6 @@
+ bf09ede5c6d78e3d132bde0f933590d8 libquadmath/config.h.in
+ e2528fdd401f4aa4949acf6b7472c6e5 libquadmath/configure
+ 29e66c9d2ef7b7621276c63bee20d622 libquadmath/configure.ac
+-598ff623da7a336b4221c56150947711 libquadmath/libquadmath.info
+ c4e13f3169f2de58d737acfdba76647b libquadmath/libquadmath.texi
+ 77280bb7ee423875e03d9c0d34527df6 libquadmath/libtool-version
+ f44065462735b4699d44588271a5f09a libquadmath/math/acoshq.c
+@@ -86503,7 +86788,7 @@
+ a81cc82679e80c86cfbd5575867450d0 libquadmath/strtod/strtod_l.c
+ da808e110fc09ebd41ebd405790a70df libquadmath/strtod/strtoflt128.c
+ d15a18f7c46ba2add6148edc5b7563c0 libquadmath/strtod/tens_in_limb.c
+-0448d915a72917daa48bf8ca1e9263a8 libsanitizer/ChangeLog
++7fe19e70f12e02776cbac41f1a7ee6d8 libsanitizer/ChangeLog
+ be9b1514f2ae0907d5459acd6331993d libsanitizer/HOWTO_MERGE
+ 0249c37748936faf5b1efd5789587909 libsanitizer/LICENSE.TXT
+ e9eb4a77cb6d1457005493aeef54478e libsanitizer/MERGE
+@@ -86534,7 +86819,7 @@
+ de5adde40dad853f62e7f6f02fb39c63 libsanitizer/asan/asan_linux.cc
+ 68b329da9893e34099c7d8ad5cb9c940 libsanitizer/asan/asan_lock.h
+ 6e3e514ee98224b3d35eedd20f31dc69 libsanitizer/asan/asan_mac.cc
+-6fb2bb576d0db871840b266caacf5b4c libsanitizer/asan/asan_malloc_linux.cc
++7f4eda2466f1bea4ffea043b3ad74fb1 libsanitizer/asan/asan_malloc_linux.cc
+ fe8e70d61f125f2574ee3f7cabb27f2b libsanitizer/asan/asan_malloc_mac.cc
+ a0ee9f2d00416a8d00d5ac0a4f3758d7 libsanitizer/asan/asan_malloc_win.cc
+ 0e28518acb95e6eafea10c5aaa44562a libsanitizer/asan/asan_mapping.h
+@@ -86822,7 +87107,7 @@
+ e9ab923d2562bf5f5be6883dfb9f0184 libssp/strncpy-chk.c
+ 5e0d8b8a766c31b12354baec1b7a159c libssp/vsnprintf-chk.c
+ f56ab1f8922a16f7e9e4f5270ae1e34e libssp/vsprintf-chk.c
+-f1d092ccae45492fea4540383deb77bc libstdc++-v3/ChangeLog
++71074b77ce0c343a8adaf3aff273b763 libstdc++-v3/ChangeLog
+ 7aa6c40440a44fcf5ec94c066160c2f8 libstdc++-v3/ChangeLog-1998
+ 7aff86600b6a1ed3fa87305075a92db0 libstdc++-v3/ChangeLog-1999
+ a6f28e8fc9bb07696a9e068b439a3a87 libstdc++-v3/ChangeLog-2000
+@@ -87499,7 +87784,7 @@
+ 4a4591228c96b08e8cfafd659ca4e914 libstdc++-v3/include/bits/boost_concept_check.h
+ 6c698861fbe30dd645b02cc9332c3cc9 libstdc++-v3/include/bits/c++0x_warning.h
+ 156583d00adec3e9c84f8cd3ab85473d libstdc++-v3/include/bits/c++14_warning.h
+-8ab4f9b79a29c20a2247731d46677e7d libstdc++-v3/include/bits/c++config
++3391eba3a0b35521e3a211d2f69ddc63 libstdc++-v3/include/bits/c++config
+ 56792010974749b8b8d1f8f4a87bdff7 libstdc++-v3/include/bits/char_traits.h
+ d4c48cb0855253bba8b25e24a6717ac1 libstdc++-v3/include/bits/codecvt.h
+ 8c6f43ad3e5d5237110200d354580da1 libstdc++-v3/include/bits/concept_check.h
+@@ -87559,8 +87844,8 @@
+ 81a9105e594bdd4f31466efb0ea2591c libstdc++-v3/include/bits/specfun.h
+ a046bed66696adfb2a6c4a593d6a1e3d libstdc++-v3/include/bits/sstream.tcc
+ dca1017544bda4f3e231a60f4bfb96aa libstdc++-v3/include/bits/std_mutex.h
+-ccd3933342ad7b6b8f8eb265794edd01 libstdc++-v3/include/bits/stl_algo.h
+-68a5fbc2687db7264a5ec538cab5ef20 libstdc++-v3/include/bits/stl_algobase.h
++11add78efd9f165a0d9767f4ef18f5e4 libstdc++-v3/include/bits/stl_algo.h
++23ea4a3aeea06844a671d0edb8f31227 libstdc++-v3/include/bits/stl_algobase.h
+ 243fe3e2f3c79e871cf74b93be35026e libstdc++-v3/include/bits/stl_bvector.h
+ 5ca41a37aa22865a2e5acf8a62c8f437 libstdc++-v3/include/bits/stl_construct.h
+ 8fd1c24a11e47aa7313171f7d4fe3b0f libstdc++-v3/include/bits/stl_deque.h
+@@ -87723,11 +88008,11 @@
+ 23e7049f7e8b7983c52206aab9113937 libstdc++-v3/include/decimal/decimal
+ 71e2a65287f65ee51824acf28e1d9f7a libstdc++-v3/include/decimal/decimal.h
+ 5ad6f3f20409d7de29835de97387918e libstdc++-v3/include/experimental/algorithm
+-e65a44cf13272360ff0478fcc8ee5a57 libstdc++-v3/include/experimental/any
++c64f903aa7f538c08886fe5dc1582f0a libstdc++-v3/include/experimental/any
+ 89b45a19b6cf153e676d40cf2f37aaf7 libstdc++-v3/include/experimental/array
+ 29b77f84375c4242993cfe208f650912 libstdc++-v3/include/experimental/bits/erase_if.h
+-f9f6312c24ee02dc5cd916d50da8fb83 libstdc++-v3/include/experimental/bits/fs_dir.h
+-4c72ea9fbedf180024c0cf4dd5fe4e1b libstdc++-v3/include/experimental/bits/fs_fwd.h
++122d1256bd80e98d1c61240bbfaf59f1 libstdc++-v3/include/experimental/bits/fs_dir.h
++e1c40a546f26acefc0463b336869af95 libstdc++-v3/include/experimental/bits/fs_fwd.h
+ 158630c37ddb30cc20d99ff56ac65063 libstdc++-v3/include/experimental/bits/fs_ops.h
+ eed4217b2f9fe20ca72578b391c7a2d2 libstdc++-v3/include/experimental/bits/fs_path.h
+ 34de3fdf15beca4475dd988e0184df6f libstdc++-v3/include/experimental/bits/shared_ptr.h
+@@ -87736,14 +88021,14 @@
+ 6826964fdd0c501df4e92c523e2862f1 libstdc++-v3/include/experimental/deque
+ f88ee31c92f92057c2fd3ac31e24d93e libstdc++-v3/include/experimental/filesystem
+ 2bff8bbef91fcc1b5d11d98bf5905df8 libstdc++-v3/include/experimental/forward_list
+-4264211c5282d287ebadc45d97d4de45 libstdc++-v3/include/experimental/functional
++e59810aa4afce25362a948f28b60b9de libstdc++-v3/include/experimental/functional
+ 6c5f935e4fff3629ee30c039f4c55bb6 libstdc++-v3/include/experimental/iterator
+ cfe5bab2e8a6e1cfbfba279ecd095b9b libstdc++-v3/include/experimental/list
+ 5ea3575f34c060bd14c6163b5c02910d libstdc++-v3/include/experimental/map
+ 9f2ff72def8b2ccefde5f79da53d689c libstdc++-v3/include/experimental/memory
+ 0ea55299535b43a37b77451c2a04adb4 libstdc++-v3/include/experimental/memory_resource
+ b0a72f080296c31dcf5665d20d230540 libstdc++-v3/include/experimental/numeric
+-e625ff0e60fda3fc4623907cbba234be libstdc++-v3/include/experimental/optional
++b0e91dbbf7e68aa5f99049900d816b46 libstdc++-v3/include/experimental/optional
+ 7283a9f678ec265aa97152d6dca56bea libstdc++-v3/include/experimental/propagate_const
+ dbf6b0596c17e1fe3bb7c3646ab1fbfa libstdc++-v3/include/experimental/random
+ 1e0349a2dbba50ce5eaf18062017033e libstdc++-v3/include/experimental/ratio
+@@ -88047,12 +88332,12 @@
+ 08ed130b911c8861f17b625300af7808 libstdc++-v3/include/parallel/algobase.h
+ c3b97fba09aac2b83819d8dcd1517672 libstdc++-v3/include/parallel/algorithm
+ 0e840c628f0736ab041408bcada33951 libstdc++-v3/include/parallel/algorithmfwd.h
+-59c030b3f0ec2df5766b985d1bd49305 libstdc++-v3/include/parallel/balanced_quicksort.h
++255353a08bb95bf6328d3e2b85d90de0 libstdc++-v3/include/parallel/balanced_quicksort.h
+ 581bdc62656985390da46c99509e6d12 libstdc++-v3/include/parallel/base.h
+ 088195ce733ee584f5b8a0b095d0cda8 libstdc++-v3/include/parallel/basic_iterator.h
+ 233e2ab9c418055cb6565f1be8665f71 libstdc++-v3/include/parallel/checkers.h
+ fff9a8759ef5329e1b198ecd68df5d87 libstdc++-v3/include/parallel/compatibility.h
+-8550b5411dea9e7a7d09dc2e2286c025 libstdc++-v3/include/parallel/compiletime_settings.h
++a429f2c927389fab5d0c8b3c06a21616 libstdc++-v3/include/parallel/compiletime_settings.h
+ 31cb4710e1cbb06626f80fad6dba2f86 libstdc++-v3/include/parallel/equally_split.h
+ d790719d808ca3e1f934654ba35f4c23 libstdc++-v3/include/parallel/features.h
+ 8a450ac00797e5880593bd1798d33c89 libstdc++-v3/include/parallel/find.h
+@@ -88162,7 +88447,7 @@
+ 4b6625c7cbce87a5b4a6e79c315b0f1d libstdc++-v3/include/std/string
+ 56ecd8ef9e669ad9046f93b40c6adeb0 libstdc++-v3/include/std/system_error
+ 3c38cff34b5471d6ef6b8f5ebd334363 libstdc++-v3/include/std/thread
+-a20360f1d00c525b1c3a82a850399bbb libstdc++-v3/include/std/tuple
++69c9fe68e28b9c6a300b100398e4eff3 libstdc++-v3/include/std/tuple
+ 8dfc4dc705dbfdceed5a96a1d17dcb31 libstdc++-v3/include/std/type_traits
+ 66c41d38d5277a5c6662a5c974f65fc4 libstdc++-v3/include/std/typeindex
+ b23b42f90aab11eae50546959be31645 libstdc++-v3/include/std/unordered_map
+@@ -88339,7 +88624,7 @@
+ 30665c8b6d46064d472972b057ac96cb libstdc++-v3/src/c++11/Makefile.am
+ a71513788b148a7ade2ec04c6070aa8e libstdc++-v3/src/c++11/Makefile.in
+ 4fdcbea8f299a029c4f5ea8d59f630c6 libstdc++-v3/src/c++11/chrono.cc
+-e577d458447700de0808ac76b14c07ec libstdc++-v3/src/c++11/codecvt.cc
++28ba9ca2926c19035cb646b2329710f4 libstdc++-v3/src/c++11/codecvt.cc
+ 8bfae905b9eab9ab26ee92eb3978ab4a libstdc++-v3/src/c++11/compatibility-atomic-c++0x.cc
+ 5d0b8ad9f6d2ee8e8040a8b666bf9e40 libstdc++-v3/src/c++11/compatibility-c++0x.cc
+ 4c716fd1981b6de7c33c9ee168aaa28d libstdc++-v3/src/c++11/compatibility-chrono.cc
+@@ -88350,7 +88635,7 @@
+ 98214d46bbe793351796b07e0a42a42d libstdc++-v3/src/c++11/cow-locale_init.cc
+ 8b1fca2685592e27c6e2512aab409c53 libstdc++-v3/src/c++11/cow-shim_facets.cc
+ a1e95554d798e75aaf108cf99555acbe libstdc++-v3/src/c++11/cow-sstream-inst.cc
+-d24f762e5c1518d3d881dec110cd3015 libstdc++-v3/src/c++11/cow-stdexcept.cc
++11f38398949bd792c8cf299bb71de812 libstdc++-v3/src/c++11/cow-stdexcept.cc
+ f24a3851a742dd9c9e641146183b51a8 libstdc++-v3/src/c++11/cow-string-inst.cc
+ 2fc29df6c120b834cdf25d9a94bb04be libstdc++-v3/src/c++11/cow-wstring-inst.cc
+ a85f17026568d8b29a5918c5fdb0de37 libstdc++-v3/src/c++11/ctype.cc
+@@ -88437,7 +88722,7 @@
+ a55f615eaeda6a459dd7afb072d7b189 libstdc++-v3/src/filesystem/cow-ops.cc
+ 69cc034ef75e4e41c856abb14ff6a9c6 libstdc++-v3/src/filesystem/cow-path.cc
+ d65d2e058df05915cedab245e7b83ebb libstdc++-v3/src/filesystem/dir.cc
+-4bd5a2c20b1ea1acbeadb448465d6e91 libstdc++-v3/src/filesystem/ops.cc
++ae63ac87d47a4928b951406c3e823ce4 libstdc++-v3/src/filesystem/ops.cc
+ 565e7324068b67ac6d423123a8796c82 libstdc++-v3/src/filesystem/path.cc
+ 588e1f8e679966c86b3269c806c1baaa libstdc++-v3/src/shared/hashtable-aux.cc
+ fd840c906f4a0cf5df5cd7bc96c757e5 libstdc++-v3/testsuite/17_intro/freestanding.cc
+@@ -89315,6 +89600,7 @@
+ f2c34e193c19314affc8a00a6a445a92 libstdc++-v3/testsuite/20_util/tuple/cons/constexpr-3.cc
+ a9cd6398ea857a03537f88c7e23f4b60 libstdc++-v3/testsuite/20_util/tuple/cons/constructor.cc
+ 0aabd51cea226df6c82b765ef09c9441 libstdc++-v3/testsuite/20_util/tuple/cons/converting.cc
++26bb13fcf5c5e3ab980dfe85b16b7496 libstdc++-v3/testsuite/20_util/tuple/cons/element_accepts_anything_byval.cc
+ 7e5c8d7e9d12164bb1347a124ace6a37 libstdc++-v3/testsuite/20_util/tuple/cons/explicit_construct.cc
+ 080671dc61cd5a1adb690c82272a7aa5 libstdc++-v3/testsuite/20_util/tuple/cons/nested_tuple_construct.cc
+ 441b45a224b065aa135d3ec04bd9a4b2 libstdc++-v3/testsuite/20_util/tuple/cons/noexcept_move_construct.cc
+@@ -89660,8 +89946,9 @@
+ c97f26a8973c209ae0f7d360ad9f2fcc libstdc++-v3/testsuite/22_locale/codecvt/char32_t.cc
+ c5071e3bdcb84c6edc7d311f74de1d4a libstdc++-v3/testsuite/22_locale/codecvt/codecvt_utf16/66417.cc
+ a9d0a70ac98a0b17d2d1cc8c848a8efc libstdc++-v3/testsuite/22_locale/codecvt/codecvt_utf16/requirements/1.cc
++d1ed67ee033e3f14a4e84f4874b7f324 libstdc++-v3/testsuite/22_locale/codecvt/codecvt_utf8/69703.cc
+ ff59d91f6f27e3904a6f0c4e0fc63592 libstdc++-v3/testsuite/22_locale/codecvt/codecvt_utf8/requirements/1.cc
+-69fc313af596ee07d279da2f57847abc libstdc++-v3/testsuite/22_locale/codecvt/codecvt_utf8_utf16/66855.cc
++a6f9396f0c42a4c6d1d6de7ae30882e3 libstdc++-v3/testsuite/22_locale/codecvt/codecvt_utf8_utf16/66855.cc
+ 50aec117b3903134dc297553a6e7d171 libstdc++-v3/testsuite/22_locale/codecvt/codecvt_utf8_utf16/requirements/1.cc
+ fb446a5424dced8689e50d049d902d15 libstdc++-v3/testsuite/22_locale/codecvt/encoding/char/1.cc
+ fb4c80aa2f3965e8a807cf632dd40511 libstdc++-v3/testsuite/22_locale/codecvt/encoding/char/wrapped_env.cc
+@@ -91461,6 +91748,7 @@
+ 7a12e960fa6c1e202b05b2045bf30243 libstdc++-v3/testsuite/25_algorithms/binary_search/1.cc
+ fa283b2c4d3165d0550387d9bea029e9 libstdc++-v3/testsuite/25_algorithms/binary_search/2.cc
+ 39f41d4b1f8549c8788b2a85a1c1a063 libstdc++-v3/testsuite/25_algorithms/binary_search/check_type.cc
++dbcdd5ed11c3e7f7c6993f08d03a384a libstdc++-v3/testsuite/25_algorithms/binary_search/partitioned.cc
+ b9a614d8754b69aacd56a041d87d4f4c libstdc++-v3/testsuite/25_algorithms/binary_search/requirements/explicit_instantiation/2.cc
+ 00923b3f1fe62755ccaea3e61a14e149 libstdc++-v3/testsuite/25_algorithms/binary_search/requirements/explicit_instantiation/pod.cc
+ ee54ed262f118b0a86e1ba3198a8bbbb libstdc++-v3/testsuite/25_algorithms/copy/1.cc
+@@ -91517,6 +91805,7 @@
+ 471256a571753ee1e1eee18449dc96b8 libstdc++-v3/testsuite/25_algorithms/equal_range/1.cc
+ 911a0936f661b747ba8f0a5329a6dadd libstdc++-v3/testsuite/25_algorithms/equal_range/2.cc
+ 111dc42bd57e81f298f0d17a0f4e7c91 libstdc++-v3/testsuite/25_algorithms/equal_range/check_type.cc
++e5252e8afeb3f5de27ed99de48b74b8b libstdc++-v3/testsuite/25_algorithms/equal_range/partitioned.cc
+ fe50e7ee7caeb1e75440d7f7b268af24 libstdc++-v3/testsuite/25_algorithms/equal_range/requirements/explicit_instantiation/2.cc
+ 5e6967d287d4c6526375184ee5831157 libstdc++-v3/testsuite/25_algorithms/equal_range/requirements/explicit_instantiation/pod.cc
+ 1ff6701c1f7885f5cf7ae178fa6e3a30 libstdc++-v3/testsuite/25_algorithms/fill/1.cc
+@@ -91620,6 +91909,7 @@
+ 3fce4489cef94bc78fa0b2cfe622659f libstdc++-v3/testsuite/25_algorithms/iter_swap/requirements/explicit_instantiation/2.cc
+ 563704df11793a2cb3925520a0584712 libstdc++-v3/testsuite/25_algorithms/iter_swap/requirements/explicit_instantiation/pod.cc
+ 4c615f82254ba19627efd93190dc8741 libstdc++-v3/testsuite/25_algorithms/lexicographical_compare/1.cc
++981466c0627cc5b1a3a290dde5c624ea libstdc++-v3/testsuite/25_algorithms/lexicographical_compare/71545.cc
+ 6b2d034347a8395f85b112da5151e1eb libstdc++-v3/testsuite/25_algorithms/lexicographical_compare/check_type.cc
+ ebb6313449d28677e1a105baa61eb93f libstdc++-v3/testsuite/25_algorithms/lexicographical_compare/debug/irreflexive_neg.cc
+ 3468195c2351971106ecfec5637ae780 libstdc++-v3/testsuite/25_algorithms/lexicographical_compare/requirements/explicit_instantiation/2.cc
+@@ -91630,6 +91920,7 @@
+ f3bcfbb7cff9aba454e55e19bcf2baf8 libstdc++-v3/testsuite/25_algorithms/lower_bound/check_type.cc
+ 20a0ac6a9a8d6fefcde91c6b9e41e0c6 libstdc++-v3/testsuite/25_algorithms/lower_bound/debug/irreflexive.cc
+ 63320e25fd7aa7498b9e83cc5cd18506 libstdc++-v3/testsuite/25_algorithms/lower_bound/no_operator_ne.cc
++7539641d39861d52133a38d930f614e5 libstdc++-v3/testsuite/25_algorithms/lower_bound/partitioned.cc
+ b081808f9153f80a70b6a6a0bcb10b0a libstdc++-v3/testsuite/25_algorithms/lower_bound/requirements/explicit_instantiation/2.cc
+ 324cb134faf27bc3b70cead47184663a libstdc++-v3/testsuite/25_algorithms/lower_bound/requirements/explicit_instantiation/pod.cc
+ 4152775a73ca52f1f39a0843d3711e9c libstdc++-v3/testsuite/25_algorithms/make_heap/complexity.cc
+@@ -91897,6 +92188,7 @@
+ fcff315b520a5c220c95b06bf0afc3d7 libstdc++-v3/testsuite/25_algorithms/upper_bound/2.cc
+ 5799c9c188ff54c06a37c2b1684c3829 libstdc++-v3/testsuite/25_algorithms/upper_bound/33613.cc
+ 2367e61d5039679b915978b0831e9557 libstdc++-v3/testsuite/25_algorithms/upper_bound/check_type.cc
++a2a39374248d3f8330f33262bf983424 libstdc++-v3/testsuite/25_algorithms/upper_bound/partitioned.cc
+ 1bde07efc71b4272f874aa9b60b1c41a libstdc++-v3/testsuite/25_algorithms/upper_bound/requirements/explicit_instantiation/2.cc
+ 831507ab22c2dd811af9549c9b05042a libstdc++-v3/testsuite/25_algorithms/upper_bound/requirements/explicit_instantiation/pod.cc
+ 2ccc854d45ba39bdccef1dd6b95a2767 libstdc++-v3/testsuite/26_numerics/accumulate/1.cc
+@@ -93837,8 +94129,8 @@
+ 4d143ca68b2fc8e2f44162f96937b954 libstdc++-v3/testsuite/experimental/any/cons/2.cc
+ bcb1af3db3b58578f36d9fc7692922cf libstdc++-v3/testsuite/experimental/any/cons/aligned.cc
+ 48399811d2d329c756e82d87ef698e93 libstdc++-v3/testsuite/experimental/any/cons/nontrivial.cc
+-88fff9f76f2cb12f04ec3c220bd1bdf6 libstdc++-v3/testsuite/experimental/any/misc/any_cast.cc
+-b4f7ba6bd9238f17d0e8c4fd7018dbeb libstdc++-v3/testsuite/experimental/any/misc/any_cast_neg.cc
++f202bdedc914a2ba5e8700ca4b541d88 libstdc++-v3/testsuite/experimental/any/misc/any_cast.cc
++d6699928a0c4ff31a16b82901e0135d9 libstdc++-v3/testsuite/experimental/any/misc/any_cast_neg.cc
+ ede8bc6c2abc8e8e88dd015c19f35bc9 libstdc++-v3/testsuite/experimental/any/misc/any_cast_no_rtti.cc
+ 4c83567229f17dfc9aeee2ceada69bc7 libstdc++-v3/testsuite/experimental/any/misc/swap.cc
+ 89d8fbc9a4c2072fb0d49f46675f92e7 libstdc++-v3/testsuite/experimental/any/modifiers/1.cc
+@@ -93850,15 +94142,18 @@
+ a6bed3df705f73fb6770e7e17600b531 libstdc++-v3/testsuite/experimental/deque/erasure.cc
+ 1c10a535f04c73dcb2dcf34a55e5f892 libstdc++-v3/testsuite/experimental/feat-cxx14.cc
+ f1868e7d6427fc60964c1a38200d329f libstdc++-v3/testsuite/experimental/feat-lib-fund.cc
+-90f90e5d1004c083226bf7207a8b18f1 libstdc++-v3/testsuite/experimental/filesystem/iterators/directory_iterator.cc
+-a7fea621d015988d3fa1fc76e86eedd9 libstdc++-v3/testsuite/experimental/filesystem/iterators/recursive_directory_iterator.cc
++e9dc54abe60b8b705c14ac3d74636838 libstdc++-v3/testsuite/experimental/filesystem/iterators/directory_iterator.cc
++af9d47d33b74004315b691b6346b9d86 libstdc++-v3/testsuite/experimental/filesystem/iterators/recursive_directory_iterator.cc
+ 6659047a437b84cfb9f2391f87429043 libstdc++-v3/testsuite/experimental/filesystem/operations/absolute.cc
+-e9ab5236864aff79b6568b648c388648 libstdc++-v3/testsuite/experimental/filesystem/operations/canonical.cc
+-3ba41914e00797409515d4219a56de5a libstdc++-v3/testsuite/experimental/filesystem/operations/copy.cc
+-17841b5e8220264cf46deb635f6e3d3b libstdc++-v3/testsuite/experimental/filesystem/operations/create_directories.cc
++cb96d4f460d63079de67211a5fa98add libstdc++-v3/testsuite/experimental/filesystem/operations/canonical.cc
++0cf2c31ebc01188c0a36787d294b6c6b libstdc++-v3/testsuite/experimental/filesystem/operations/copy.cc
++43478894c9ffeeff98b3c58779cdd278 libstdc++-v3/testsuite/experimental/filesystem/operations/copy_file.cc
++5b67c7238f734df125c006ea8e224a86 libstdc++-v3/testsuite/experimental/filesystem/operations/create_directories.cc
++25adc7117e80c1cd1e18b1cde11f4c1e libstdc++-v3/testsuite/experimental/filesystem/operations/create_directory.cc
+ c5446130c200098a30ef1dc1a283b2b9 libstdc++-v3/testsuite/experimental/filesystem/operations/current_path.cc
+ 7340da71f52f79524efcb005b8a0dfbf libstdc++-v3/testsuite/experimental/filesystem/operations/exists.cc
+ 543f1f3a74e4731a28b2350f36b57987 libstdc++-v3/testsuite/experimental/filesystem/operations/file_size.cc
++a5fe820ebc0fc04c2078c67418d5e236 libstdc++-v3/testsuite/experimental/filesystem/operations/permissions.cc
+ 6c082c2b9134f256176dbd1ced18ec29 libstdc++-v3/testsuite/experimental/filesystem/operations/status.cc
+ 1d8c4e2df6535130a0759320e07efee6 libstdc++-v3/testsuite/experimental/filesystem/operations/temp_directory_path.cc
+ 6572ad4bfd145d4c0c079938a286897c libstdc++-v3/testsuite/experimental/filesystem/path/append/path.cc
+@@ -93889,6 +94184,7 @@
+ 5df8e09e624d87e17a044d9858058c9e libstdc++-v3/testsuite/experimental/filesystem/path/modifiers/replace_extension.cc
+ e2817cfd26742b69b8b7b73f942ccde9 libstdc++-v3/testsuite/experimental/filesystem/path/modifiers/replace_filename.cc
+ d4e9d71c8fd2b42db51b8797aebca13f libstdc++-v3/testsuite/experimental/filesystem/path/modifiers/swap.cc
++2321736afe6f050de2a69492d9bd096c libstdc++-v3/testsuite/experimental/filesystem/path/native/string.cc
+ 45a57bfce67b5460ea4ad3626a5133b5 libstdc++-v3/testsuite/experimental/filesystem/path/nonmember/hash_value.cc
+ 3e4cb85aec4dd2457d9b4efcbb7e8c0a libstdc++-v3/testsuite/experimental/filesystem/path/query/empty.cc
+ 71662b7f8ba3c6eb3dd94d008fe8ce02 libstdc++-v3/testsuite/experimental/filesystem/path/query/has_extension.cc
+@@ -93902,7 +94198,7 @@
+ b427c42986c003d6253ad475d252580b libstdc++-v3/testsuite/experimental/filesystem/path/query/is_relative.cc
+ f670b614d1cc3d7d0ad24712e408b00d libstdc++-v3/testsuite/experimental/forward_list/erasure.cc
+ bbbce96b885b0a3e2fff3467f74603b3 libstdc++-v3/testsuite/experimental/functional/not_fn.cc
+-8b60f23ac93b783a0235699abcca08e4 libstdc++-v3/testsuite/experimental/functional/searchers.cc
++854913f12196247a55853dd04d8eee4d libstdc++-v3/testsuite/experimental/functional/searchers.cc
+ 043c6e8e4f78804111ba475b4b36f43a libstdc++-v3/testsuite/experimental/functional/value.cc
+ b8a37dc3290caea1a96660d87ea5a9a3 libstdc++-v3/testsuite/experimental/iterator/make_ostream_joiner.cc
+ 1c550ab3838807146948e05c220dd3c2 libstdc++-v3/testsuite/experimental/iterator/ostream_joiner.cc
+@@ -93947,7 +94243,8 @@
+ 5cafc7a64c3fd8161ec5647978b89f4a libstdc++-v3/testsuite/experimental/optional/cons/copy.cc
+ ad6988975eb0537cef61d8ca1a71f663 libstdc++-v3/testsuite/experimental/optional/cons/default.cc
+ f4226d3e8ed1ba519c69491709698d38 libstdc++-v3/testsuite/experimental/optional/cons/move.cc
+-66f5ea892439f3d2ff2ef9f386ac41cd libstdc++-v3/testsuite/experimental/optional/cons/value.cc
++cd8840b7866b44b7ceed99d196c79446 libstdc++-v3/testsuite/experimental/optional/cons/value.cc
++bfdb103f8e1eff6b08a67e1e20910b8a libstdc++-v3/testsuite/experimental/optional/cons/value_neg.cc
+ 8ff6b45a9b1050aed7e2229378bea517 libstdc++-v3/testsuite/experimental/optional/constexpr/cons/default.cc
+ 64cafc604813d41180b02bbdb5175243 libstdc++-v3/testsuite/experimental/optional/constexpr/cons/value.cc
+ 87ed87ffad80d6207261ad9e9ccd90ec libstdc++-v3/testsuite/experimental/optional/constexpr/in_place.cc
+@@ -95306,12 +95603,12 @@
+ 23fd997da513a65fe1471c19a226fc52 libstdc++-v3/testsuite/util/testsuite_containers.h
+ 04a32a019d1586ab2217d06583f33404 libstdc++-v3/testsuite/util/testsuite_counter_type.h
+ 0dc60b6ac596bc87a4e7a40aa06f58e9 libstdc++-v3/testsuite/util/testsuite_error.h
+-e09bbb8df91a8ee7256775a6d4d4d163 libstdc++-v3/testsuite/util/testsuite_fs.h
++8e55222cc23d00baba3a214230f59761 libstdc++-v3/testsuite/util/testsuite_fs.h
+ ff826c1dd2ee6a0fe894da2321232547 libstdc++-v3/testsuite/util/testsuite_greedy_ops.h
+ c2aa93a55fce4b410f3963907115507e libstdc++-v3/testsuite/util/testsuite_hooks.cc
+ a837c7d31a1866b0a6125d854aeeb3ba libstdc++-v3/testsuite/util/testsuite_hooks.h
+ 03ef0d72a4d44308b72f20d48a98490f libstdc++-v3/testsuite/util/testsuite_io.h
+-426181cd245715e20a7e2d0a664f1875 libstdc++-v3/testsuite/util/testsuite_iterators.h
++014a5d7501d7109088bf371b70c55f19 libstdc++-v3/testsuite/util/testsuite_iterators.h
+ 915de1d2f670ce7f4b76542e99a70c50 libstdc++-v3/testsuite/util/testsuite_new_operators.h
+ d8cb74dfe347cc7d377fbd19b3efb585 libstdc++-v3/testsuite/util/testsuite_performance.h
+ 78117be975dcbe3823aa930cfbce08c0 libstdc++-v3/testsuite/util/testsuite_random.h
+@@ -95323,9 +95620,9 @@
+ 204ec69a032d5a889dacc11cf18fa4ed libstdc++-v3/testsuite/util/thread/all.h
+ b950d655469c477755252b1e18009596 libtool-ldflags
+ 7a2b83d2d625a4022b9213ceb75f5897 libtool.m4
+-d2a523d344604dd6a3e8e1f7bfb1c2b4 libvtv/ChangeLog
+-8cf2d09520df1da87dce0b192c1af79a libvtv/Makefile.am
+-31c82474804ec75aab274ed98b4e6b51 libvtv/Makefile.in
++780474b8d3fa8c8117ccfd8281527085 libvtv/ChangeLog
++580d40bdd6efd6663aa0d78101a2ef1a libvtv/Makefile.am
++c9973f89d6d559403509edf0c5aa127f libvtv/Makefile.in
+ 4ce86f8604e6c86211a4cb2025ffc53e libvtv/acinclude.m4
+ 1fadd2a7f8c12da8f434cd33e68d271e libvtv/aclocal.m4
+ 754a4cbfde648aca416470cd6c95e4d8 libvtv/configure
+@@ -95419,11 +95716,11 @@
+ bc2f6032c98896249eadb56177c7d357 ltsugar.m4
+ c30cd33c496505f13d9fbdb6970c7c33 ltversion.m4
+ 293853a13b7e218e3a4342cf85fbbf25 lt~obsolete.m4
+-b53da0da0c103a537dcf0ca69e0f0ef3 maintainer-scripts/ChangeLog
++b2ed68474b6ccc5f6ea1349c114e9064 maintainer-scripts/ChangeLog
+ 33c7bc2d2c55956dfac85a05d8a80eff maintainer-scripts/README
+ d0d4b92a5ba9606c481075c7bf65469a maintainer-scripts/crontab
+ 91544f3a251dde1c76b2b9a58aee73a9 maintainer-scripts/gcc_release
+-d87b258ea691681aca69f5c94d2f7cca maintainer-scripts/generate_libstdcxx_web_docs
++4b1217d62242596f1d1b439c25dce68f maintainer-scripts/generate_libstdcxx_web_docs
+ 33d97164a8610c7abf67eff7d28f47ff maintainer-scripts/maintainer-addresses
+ fd2c02d88bca262690f0cbbfaeab16e1 maintainer-scripts/update_version_svn
+ c8dfca01bf19508e40afff1dcd255211 maintainer-scripts/update_web_docs_libstdcxx_svn
+Only in gcc-6.1.0: NEWS
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/fixincludes/ChangeLog gcc-6-20160721/fixincludes/ChangeLog
+--- gcc-6.1.0/fixincludes/ChangeLog 2016-04-27 08:20:21.000000000 +0000
++++ gcc-6-20160721/fixincludes/ChangeLog 2016-06-15 14:32:35.000000000 +0000
+@@ -1,3 +1,18 @@
++2016-06-15 David Edelsohn <dje.gcc@gmail.com>
++
++ Backport from mainline
++ 2016-06-13 David Edelsohn <dje.gcc@gmail.com>
++
++ * inclhack.def (aix_stdlib_malloc): New fix.
++ (aix_stdlib_realloc): New fix.
++ (aix_stdlib_calloc): New fix.
++ (aix_stdlib_valloc): New fix.
++ * fixincl.x: Regenerate.
++ * tests/base/stdlib.h [AIX_STDLIB_MALLOC]: New test.
++ [AIX_STDLIB_REALLOC]: New test.
++ [AIX_STDLIB_CALLOC]: New test.
++ [AIX_STDLIB_VALLOC]: New test.
++
+ 2016-04-27 Release Manager
+
+ * GCC 6.1.0 released.
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/fixincludes/fixincl.x gcc-6-20160721/fixincludes/fixincl.x
+--- gcc-6.1.0/fixincludes/fixincl.x 2016-02-01 00:54:22.000000000 +0000
++++ gcc-6-20160721/fixincludes/fixincl.x 2016-06-15 14:32:35.000000000 +0000
+@@ -2,11 +2,11 @@
+ *
+ * DO NOT EDIT THIS FILE (fixincl.x)
+ *
+- * It has been AutoGen-ed Sunday January 31, 2016 at 07:52:05 PM EST
++ * It has been AutoGen-ed June 10, 2016 at 12:56:52 PM by AutoGen 5.18.3
+ * From the definitions inclhack.def
+ * and the template file fixincl
+ */
+-/* DO NOT SVN-MERGE THIS FILE, EITHER Sun 31 Jan 2016 19:52:05 EST
++/* DO NOT SVN-MERGE THIS FILE, EITHER Fri Jun 10 12:56:52 UTC 2016
+ *
+ * You must regenerate it. Use the ./genfixes script.
+ *
+@@ -15,7 +15,7 @@
+ * certain ANSI-incompatible system header files which are fixed to work
+ * correctly with ANSI C and placed in a directory that GNU C will search.
+ *
+- * This file contains 231 fixup descriptions.
++ * This file contains 235 fixup descriptions.
+ *
+ * See README for more information.
+ *
+@@ -1547,6 +1547,154 @@
+
+ /* * * * * * * * * * * * * * * * * * * * * * * * * *
+ *
++ * Description of Aix_Stdlib_Malloc fix
++ */
++tSCC zAix_Stdlib_MallocName[] =
++ "aix_stdlib_malloc";
++
++/*
++ * File name selection pattern
++ */
++tSCC zAix_Stdlib_MallocList[] =
++ "stdlib.h\0";
++/*
++ * Machine/OS name selection pattern
++ */
++tSCC* apzAix_Stdlib_MallocMachs[] = {
++ "*-*-aix*",
++ (const char*)NULL };
++
++/*
++ * content selection pattern - do fix if pattern found
++ */
++tSCC zAix_Stdlib_MallocSelect0[] =
++ "#define[ \t]+malloc[ \t]+__linux_malloc";
++
++#define AIX_STDLIB_MALLOC_TEST_CT 1
++static tTestDesc aAix_Stdlib_MallocTests[] = {
++ { TT_EGREP, zAix_Stdlib_MallocSelect0, (regex_t*)NULL }, };
++
++/*
++ * Fix Command Arguments for Aix_Stdlib_Malloc
++ */
++static const char* apzAix_Stdlib_MallocPatch[] = {
++ "format",
++ "extern void *malloc(size_t) __asm__(\"__linux_malloc\");",
++ (char*)NULL };
++
++/* * * * * * * * * * * * * * * * * * * * * * * * * *
++ *
++ * Description of Aix_Stdlib_Realloc fix
++ */
++tSCC zAix_Stdlib_ReallocName[] =
++ "aix_stdlib_realloc";
++
++/*
++ * File name selection pattern
++ */
++tSCC zAix_Stdlib_ReallocList[] =
++ "stdlib.h\0";
++/*
++ * Machine/OS name selection pattern
++ */
++tSCC* apzAix_Stdlib_ReallocMachs[] = {
++ "*-*-aix*",
++ (const char*)NULL };
++
++/*
++ * content selection pattern - do fix if pattern found
++ */
++tSCC zAix_Stdlib_ReallocSelect0[] =
++ "#define[ \t]+realloc[ \t]+__linux_realloc";
++
++#define AIX_STDLIB_REALLOC_TEST_CT 1
++static tTestDesc aAix_Stdlib_ReallocTests[] = {
++ { TT_EGREP, zAix_Stdlib_ReallocSelect0, (regex_t*)NULL }, };
++
++/*
++ * Fix Command Arguments for Aix_Stdlib_Realloc
++ */
++static const char* apzAix_Stdlib_ReallocPatch[] = {
++ "format",
++ "extern void *realloc(void *, size_t) __asm__(\"__linux_realloc\");",
++ (char*)NULL };
++
++/* * * * * * * * * * * * * * * * * * * * * * * * * *
++ *
++ * Description of Aix_Stdlib_Calloc fix
++ */
++tSCC zAix_Stdlib_CallocName[] =
++ "aix_stdlib_calloc";
++
++/*
++ * File name selection pattern
++ */
++tSCC zAix_Stdlib_CallocList[] =
++ "stdlib.h\0";
++/*
++ * Machine/OS name selection pattern
++ */
++tSCC* apzAix_Stdlib_CallocMachs[] = {
++ "*-*-aix*",
++ (const char*)NULL };
++
++/*
++ * content selection pattern - do fix if pattern found
++ */
++tSCC zAix_Stdlib_CallocSelect0[] =
++ "#define[ \t]+calloc[ \t]+__linux_calloc";
++
++#define AIX_STDLIB_CALLOC_TEST_CT 1
++static tTestDesc aAix_Stdlib_CallocTests[] = {
++ { TT_EGREP, zAix_Stdlib_CallocSelect0, (regex_t*)NULL }, };
++
++/*
++ * Fix Command Arguments for Aix_Stdlib_Calloc
++ */
++static const char* apzAix_Stdlib_CallocPatch[] = {
++ "format",
++ "extern void *calloc(size_t, size_t) __asm__(\"__linux_calloc\");",
++ (char*)NULL };
++
++/* * * * * * * * * * * * * * * * * * * * * * * * * *
++ *
++ * Description of Aix_Stdlib_Valloc fix
++ */
++tSCC zAix_Stdlib_VallocName[] =
++ "aix_stdlib_valloc";
++
++/*
++ * File name selection pattern
++ */
++tSCC zAix_Stdlib_VallocList[] =
++ "stdlib.h\0";
++/*
++ * Machine/OS name selection pattern
++ */
++tSCC* apzAix_Stdlib_VallocMachs[] = {
++ "*-*-aix*",
++ (const char*)NULL };
++
++/*
++ * content selection pattern - do fix if pattern found
++ */
++tSCC zAix_Stdlib_VallocSelect0[] =
++ "#define[ \t]+valloc[ \t]+__linux_valloc";
++
++#define AIX_STDLIB_VALLOC_TEST_CT 1
++static tTestDesc aAix_Stdlib_VallocTests[] = {
++ { TT_EGREP, zAix_Stdlib_VallocSelect0, (regex_t*)NULL }, };
++
++/*
++ * Fix Command Arguments for Aix_Stdlib_Valloc
++ */
++static const char* apzAix_Stdlib_VallocPatch[] = {
++ "format",
++ "extern void *valloc(size_t) __asm__(\"__linux_valloc\");",
++ (char*)NULL };
++
++/* * * * * * * * * * * * * * * * * * * * * * * * * *
++ *
+ * Description of Aix_Strtof_Const fix
+ */
+ tSCC zAix_Strtof_ConstName[] =
+@@ -9485,9 +9633,9 @@
+ *
+ * List of all fixes
+ */
+-#define REGEX_COUNT 268
++#define REGEX_COUNT 272
+ #define MACH_LIST_SIZE_LIMIT 187
+-#define FIX_COUNT 231
++#define FIX_COUNT 235
+
+ /*
+ * Enumerate the fixes
+@@ -9525,6 +9673,10 @@
+ AIX_STDINT_4_FIXIDX,
+ AIX_STDINT_5_FIXIDX,
+ AIX_STDIO_INLINE_FIXIDX,
++ AIX_STDLIB_MALLOC_FIXIDX,
++ AIX_STDLIB_REALLOC_FIXIDX,
++ AIX_STDLIB_CALLOC_FIXIDX,
++ AIX_STDLIB_VALLOC_FIXIDX,
+ AIX_STRTOF_CONST_FIXIDX,
+ AIX_SYSMACHINE_FIXIDX,
+ AIX_SYSWAIT_2_FIXIDX,
+@@ -9887,6 +10039,26 @@
+ AIX_STDIO_INLINE_TEST_CT, FD_MACH_ONLY | FD_SUBROUTINE,
+ aAix_Stdio_InlineTests, apzAix_Stdio_InlinePatch, 0 },
+
++ { zAix_Stdlib_MallocName, zAix_Stdlib_MallocList,
++ apzAix_Stdlib_MallocMachs,
++ AIX_STDLIB_MALLOC_TEST_CT, FD_MACH_ONLY | FD_SUBROUTINE,
++ aAix_Stdlib_MallocTests, apzAix_Stdlib_MallocPatch, 0 },
++
++ { zAix_Stdlib_ReallocName, zAix_Stdlib_ReallocList,
++ apzAix_Stdlib_ReallocMachs,
++ AIX_STDLIB_REALLOC_TEST_CT, FD_MACH_ONLY | FD_SUBROUTINE,
++ aAix_Stdlib_ReallocTests, apzAix_Stdlib_ReallocPatch, 0 },
++
++ { zAix_Stdlib_CallocName, zAix_Stdlib_CallocList,
++ apzAix_Stdlib_CallocMachs,
++ AIX_STDLIB_CALLOC_TEST_CT, FD_MACH_ONLY | FD_SUBROUTINE,
++ aAix_Stdlib_CallocTests, apzAix_Stdlib_CallocPatch, 0 },
++
++ { zAix_Stdlib_VallocName, zAix_Stdlib_VallocList,
++ apzAix_Stdlib_VallocMachs,
++ AIX_STDLIB_VALLOC_TEST_CT, FD_MACH_ONLY | FD_SUBROUTINE,
++ aAix_Stdlib_VallocTests, apzAix_Stdlib_VallocPatch, 0 },
++
+ { zAix_Strtof_ConstName, zAix_Strtof_ConstList,
+ apzAix_Strtof_ConstMachs,
+ AIX_STRTOF_CONST_TEST_CT, FD_MACH_ONLY | FD_SUBROUTINE,
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/fixincludes/inclhack.def gcc-6-20160721/fixincludes/inclhack.def
+--- gcc-6.1.0/fixincludes/inclhack.def 2016-02-01 00:54:22.000000000 +0000
++++ gcc-6-20160721/fixincludes/inclhack.def 2016-06-15 14:32:35.000000000 +0000
+@@ -911,6 +911,48 @@
+ test_text = "#ifdef __cplusplus\n}\n\n#ifdef ferror";
+ };
+
++/*
++ * stdlib.h on AIX uses #define on malloc and friends.
++ */
++fix = {
++ hackname = aix_stdlib_malloc;
++ mach = "*-*-aix*";
++ files = stdlib.h;
++ select = "#define[ \t]+malloc[ \t]+__linux_malloc";
++ c_fix = format;
++ c_fix_arg = "extern void *malloc(size_t) __asm__(\"__linux_malloc\");";
++ test_text = "#define malloc __linux_malloc";
++};
++
++fix = {
++ hackname = aix_stdlib_realloc;
++ mach = "*-*-aix*";
++ files = stdlib.h;
++ select = "#define[ \t]+realloc[ \t]+__linux_realloc";
++ c_fix = format;
++ c_fix_arg = "extern void *realloc(void *, size_t) __asm__(\"__linux_realloc\");";
++ test_text = "#define realloc __linux_realloc";
++};
++
++fix = {
++ hackname = aix_stdlib_calloc;
++ mach = "*-*-aix*";
++ files = stdlib.h;
++ select = "#define[ \t]+calloc[ \t]+__linux_calloc";
++ c_fix = format;
++ c_fix_arg = "extern void *calloc(size_t, size_t) __asm__(\"__linux_calloc\");";
++ test_text = "#define calloc __linux_calloc";
++};
++
++fix = {
++ hackname = aix_stdlib_valloc;
++ mach = "*-*-aix*";
++ files = stdlib.h;
++ select = "#define[ \t]+valloc[ \t]+__linux_valloc";
++ c_fix = format;
++ c_fix_arg = "extern void *valloc(size_t) __asm__(\"__linux_valloc\");";
++ test_text = "#define valloc __linux_valloc";
++};
+
+ /*
+ * stdlib.h on AIX 4.3 declares strtof() with a non-const first argument.
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/fixincludes/tests/base/stdlib.h gcc-6-20160721/fixincludes/tests/base/stdlib.h
+--- gcc-6.1.0/fixincludes/tests/base/stdlib.h 2015-02-17 14:45:48.000000000 +0000
++++ gcc-6-20160721/fixincludes/tests/base/stdlib.h 2016-06-15 14:32:35.000000000 +0000
+@@ -9,6 +9,26 @@
+
+
+
++#if defined( AIX_STDLIB_MALLOC_CHECK )
++extern void *malloc(size_t) __asm__("__linux_malloc");
++#endif /* AIX_STDLIB_MALLOC_CHECK */
++
++
++#if defined( AIX_STDLIB_REALLOC_CHECK )
++extern void *realloc(void *, size_t) __asm__("__linux_realloc");
++#endif /* AIX_STDLIB_REALLOC_CHECK */
++
++
++#if defined( AIX_STDLIB_CALLOC_CHECK )
++extern void *calloc(size_t, size_t) __asm__("__linux_calloc");
++#endif /* AIX_STDLIB_CALLOC_CHECK */
++
++
++#if defined( AIX_STDLIB_VALLOC_CHECK )
++extern void *valloc(size_t) __asm__("__linux_valloc");
++#endif /* AIX_STDLIB_VALLOC_CHECK */
++
++
+ #if defined( AIX_STRTOF_CONST_CHECK )
+ extern float strtof(const char *, char **);
+ #endif /* AIX_STRTOF_CONST_CHECK */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/BASE-VER gcc-6-20160721/gcc/BASE-VER
+--- gcc-6.1.0/gcc/BASE-VER 2016-04-27 08:20:21.000000000 +0000
++++ gcc-6-20160721/gcc/BASE-VER 2016-04-27 10:38:16.000000000 +0000
+@@ -1 +1 @@
+-6.1.0
++6.1.1
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/ChangeLog gcc-6-20160721/gcc/ChangeLog
+--- gcc-6.1.0/gcc/ChangeLog 2016-04-27 08:20:21.000000000 +0000
++++ gcc-6-20160721/gcc/ChangeLog 2016-07-21 16:18:46.000000000 +0000
+@@ -1,3 +1,2020 @@
++2016-07-21 Jakub Jelinek <jakub@redhat.com>
++
++ PR sanitizer/71953
++ * asan.c (asan_dynamic_init_call): Call asan_init_shadow_ptr_types
++ before builtin_decl_implicit.
++
++ * tree-object-size.c (unknown): Use HOST_WIDE_INT_M1U instead of -1.
++
++2016-07-21 Andrew Sutton <andrew.n.sutton@gmail.com>
++
++ Improving concepts performance and diagnostics.
++ * timevar.def (TV_CONSTRAINT_SAT, TV_CONSTRAINT_SUB): New time vars
++ for constraint satisfaction and subsumption.
++ * timevar.h (auto_timevar): New constructor that matches the push/pop
++ pattern of usage in pt.c.
++
++2016-07-20 John David Anglin <danglin@gcc.gnu.org>
++
++ Backport from mainline
++ 2016-07-16 John David Anglin <danglin@gcc.gnu.org>
++
++ * config/pa/pa.c (hppa_profile_hook): Allocate stack space for
++ register parameters. Remove code to initialize argument pointer
++ on TARGET_64BIT. Optimize call to _mcount when it can be reached
++ using a pc-relative branch. Cleanup conditional code.
++ * config/pa/pa.md (call_mcount): New expander.
++ (call_mcount_nonpic): New insn.
++ (call_mcount_pic): New insn and split.
++ (call_mcount_pic_post_reload): New insn.
++ (call_mcount_64bit): New insn and split.
++ (call_mcount_64bit_post_reload): New insn.
++
++2016-07-20 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
++
++ Backport from mainline
++ 2016-07-20 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
++
++ * config/s390/s390.c (s390_encode_section_info): Remove mode size
++ check.
++
++2016-07-20 Martin Jambor <mjambor@suse.cz>
++
++ PR fortran/71688
++ * trans-decl.c (gfc_generate_function_code): Use get_create rather
++ than create to get a call graph node.
++
++2016-07-19 Jakub Jelinek <jakub@redhat.com>
++
++ PR rtl-optimization/71916
++ * cfgrtl.c (contains_no_active_insn_p): Return false also for
++ bb which have a single succ fake edge.
++
++2016-07-19 Aldy Hernandez <aldyh@redhat.com>
++
++ PR debug/71855
++ * dwarf2out.c (gen_subprogram_die): Only call
++ gen_unspecified_parameters_die while dumping early dwarf.
++
++2016-07-19 Jakub Jelinek <jakub@redhat.com>
++
++ PR middle-end/71874
++ * gimple-fold.c (fold_builtin_memory_op): Use
++ get_addr_base_and_unit_offset instead of get_ref_base_and_extent.
++
++2016-07-18 Michael Meissner <meissner@linux.vnet.ibm.com>
++
++ Back port from mainline
++ 2016-07-18 Michael Meissner <meissner@linux.vnet.ibm.com>
++
++ PR target/71493
++ * config/rs6000/rs6000.c (rs6000_function_value): Fix
++ unintentional System V.4 structure return breakage for structures
++ with a single floating point element.
++
++2016-07-18 Martin Liska <mliska@suse.cz>
++
++ Backported from mainline
++ 2016-07-12 Martin Liska <mliska@suse.cz>
++
++ PR rtl-optimization/71634
++ * ira-build.c (mark_loops_for_removal): Properly iterate
++ loops.
++
++2016-07-18 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
++
++ Backport from mainline
++ 2016-07-18 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
++
++ * config/s390/s390.c (s390_encode_section_info): Always set
++ notaligned marker if mode size is 0 or no MEM_ALIGN info could be
++ found.
++
++2016-07-15 Alan Modra <amodra@gmail.com>
++
++ Apply from mainline
++ 2016-07-11 Alan Modra <amodra@gmail.com>
++ * config/rs6000/rs6000.md (UNSPEC_DOLOOP): New unspec.
++ (ctr<mode>): Add unspec.
++ (ctr<mode>_internal*): Likewise.
++
++2016-07-14 Alan Modra <amodra@gmail.com>
++
++ PR target/71733
++ * config/rs6000/rs6000.c (rs6000_option_override_internal): Deal
++ with p9_vector override before power9-dform override.
++
++2016-07-13 Ilya Enkovich <ilya.enkovich@intel.com>
++
++ Backport from mainline r238086.
++ 2016-07-07 Ilya Enkovich <ilya.enkovich@intel.com>
++
++ PR ipa/71624
++ * ipa-inline-analysis.c (compute_inline_parameters): Set
++ local.can_change_signature to false for intrumentation
++ thunk callees.
++
++2016-07-12 Michael Meissner <meissner@linux.vnet.ibm.com>
++ Bill Schmidt <wschmidt@linux.vnet.ibm.com>
++
++ Backport from mainline
++ 2016-07-05 Michael Meissner <meissner@linux.vnet.ibm.com>
++ Bill Schmidt <wschmidt@linux.vnet.ibm.com>
++
++ * config/rs6000/rs6000-protos.h (rs6000_split_signbit): New
++ prototype.
++ * config/rs6000/rs6000.c (rs6000_split_signbit): New function.
++ * config/rs6000/rs6000.md (UNSPEC_SIGNBIT): New constant.
++ (SIGNBIT): New mode iterator.
++ (Fsignbit): New mode attribute.
++ (signbit<mode>2): Change operand1 to match FLOAT128 instead of
++ IBM128; dispatch to gen_signbit{kf,tf}2_dm for __float128
++ when direct moves are available.
++ (signbit<mode>2_dm): New define_insn_and_split).
++ (signbit<mode>2_dm2): New define_insn.
++
++2016-07-12 Michael Meissner <meissner@linux.vnet.ibm.com>
++
++ Backport from mainline
++ 2016-07-12 Michael Meissner <meissner@linux.vnet.ibm.com>
++
++ PR target/71805
++ * config/rs6000/altivec.md (altivec_vperm_<mode>_internal):
++ The xxperm and xxpermr instructions require that the 2nd input
++ operand overlap with the output operand, and not the 1st.
++ (altivec_vperm_v8hiv16qi): Likewise.
++ (altivec_vperm_<mode>_uns_internal): Likewise.
++ (altivec_vpermr_<mode>_internal): Likewise.
++ (vperm_v8hiv4si): Likewise.
++ (vperm_v16qiv8hi): Likewise.
++
++2016-07-12 Segher Boessenkool <segher@kernel.crashing.org>
++
++ Backport from mainline
++ 2016-07-06 Segher Boessenkool <segher@kernel.crashing.org>
++
++ PR target/70098
++ PR target/71763
++ * config/rs6000/rs6000.md (*ctr<mode>_internal1, *ctr<mode>_internal2,
++ *ctr<mode>_internal5, *ctr<mode>_internal6): Add *wi to the output
++ constraint.
++
++2016-07-11 Jakub Jelinek <jakub@redhat.com>
++
++ PR middle-end/71758
++ * omp-low.c (expand_omp_target): Gimplify device.
++
++ PR tree-optimization/71823
++ * tree-vect-stmts.c (vectorizable_operation): Use vect_get_vec_defs
++ to get vec_oprnds2 from op2.
++
++2016-07-11 Yuri Rumyantsev <ysrumyan@gmail.com>
++
++ Backport from mainline r238055.
++ 2016-07-06 Yuri Rumyantsev <ysrumyan@gmail.com>
++
++ PR tree-optimization/71518
++ * tree-vect-data-refs.c (vect_compute_data_ref_alignment): Adjust
++ misalign also for outer loops with negative step.
++
++2016-07-08 Martin Liska <mliska@suse.cz>
++
++ Backported from mainline
++ 2016-07-08 Martin Liska <mliska@suse.cz>
++
++ PR middle-end/71606
++ * fold-const.c (fold_convertible_p): As COMPLEX_TYPE
++ folding produces SAVE_EXPRs, thus return false for the type.
++
++2016-07-08 Kelvin Nilsen <kelvin@gcc.gnu.org>
++
++ * config/rs6000/rs6000-builtin.def (BU_P9_MISC_1): Remove
++ redundant and erroneous definition of this macro accidentally
++ inserted during backporting.
++ (BU_P9_64BIT_MISC_0): Likewise.
++ (BU_P9_MISC_0): Likewise.
++
++2016-07-08 Jiong Wang <jiong.wang@arm.com>
++
++ Back port from the trunk
++ 2016-07-08 Jiong Wang <jiong.wang@arm.com>
++
++ * config/aarch64/aarch64-simd-builtins.def (smax): Remove float
++ variants.
++ (smin): Likewise.
++ (fmax): New entry.
++ (fmin): Likewise.
++ * config/aarch64/arm_neon.h (vmaxnm_f32): Use
++ __builtin_aarch64_fmaxv2sf.
++ (vmaxnmq_f32): Likewise.
++ (vmaxnmq_f64): Likewise.
++ (vminnm_f32): Likewise.
++ (vminnmq_f32): Likewise.
++ (vminnmq_f64): Likewise.
++
++2016-07-08 Michael Meissner <meissner@linux.vnet.ibm.com>
++
++ Back port from trunk
++ 2016-07-08 Michael Meissner <meissner@linux.vnet.ibm.com>
++
++ PR target/71806
++ * config/rs6000/rs6000-cpus.def (ISA_3_0_MASKS_SERVER): Do not
++ enable -mfloat128-hardware by default.
++ (ISA_3_0_MASKS_IEEE): New macro to give all of the VSX options
++ that IEEE 128-bit hardware support needs.
++ * config/rs6000/rs6000.c (rs6000_option_override_internal): If
++ -mcpu=power9 -mfloat128, enable -mfloat128-hardware by default.
++ Use ISA_3_0_MASKS_IEEE as the set of options that IEEE 128-bit
++ floating point requires.
++ * doc/invoke.texi (RS/6000 and PowerPC Options): Document
++ -mfloat128 and -mfloat128-hardware changes.
++
++2016-07-08 Kelvin Nilsen <kelvin@gcc.gnu.org>
++
++ Backport from mainline r237912
++ 2016-07-01 Kelvin Nilsen <kelvin@gcc.gnu.org>
++
++ * config/rs6000/altivec.md (*altivec_vpermr_<mode>_internal):
++ Exchange the order of the second and third operands in the vpermr
++ instruction tmeplate.
++
++2016-07-07 Michael Meissner <meissner@linux.vnet.ibm.com>
++
++ Back port from the trunk
++ 2016-07-01 Michael Meissner <meissner@linux.vnet.ibm.com>
++
++ PR target/71720
++ * config/rs6000/vsx.md (vsx_splat_v4sf_internal): When splitting
++ the insns, use an insn form that does not adjust the offset on
++ little endian systems.
++
++2016-07-07 Kelvin Nilsen <kelvin@gcc.gnu.org>
++
++ Backport from mainline r237885
++ 2016-06-30 Kelvin Nilsen <kelvin@gcc.gnu.org>
++
++ * config/rs6000/altivec.md (darn_32): Change the condition to
++ TARGET_P9_MISC instead of TARGET_MODULO.
++ (darn_raw): Replace TARGET_MODULO with TARGET_P9_MISC in the
++ condition expression.
++ (darn): Replace TARGET_MODULO with TARGET_P9_MISC in the
++ condition expression.
++ * config/rs6000/dfp.md (UNSPEC_DTSTSFI): New unspec constant.
++ (DFP_TEST): New code iterator.
++ (dfptstsfi_<code>_mode>): New define_expand.
++ (*dfp_sgnfcnc_<mode>): New define_insn.
++ * config/rs6000/rs6000-builtin.def (BU_P9_MISC_0): Move this macro
++ definition next to BU_P9_MISC_1 definition and change the MASK
++ value to RS6000_BTM_P9_MISC.
++ (BU_P9_MISC_1): Change the MASK value to RS6000_BTM_P9_MISC.
++ (BU_P9_64BIT_MISC_0): Likewise.
++ (BU_P9_DFP_MISC_0): New macro definition.
++ (BU_P9_DFP_MISC_1): New macro definition.
++ (BU_P9_DFP_MISC_2): New macro definition.
++ (BU_P9_DFP_OVERLOAD_1): New macro definition.
++ (BU_P9_DFP_OVERLOAD_2): New macro definition.
++ (BU_P9_DFP_OVERLOAD_3): New macro definition.
++ (TSTSFI_LT_DD): New BU_P9_DFP_MISC_2.
++ (TSTSFI_LT_TD): Likewise.
++ (TSTSFI_EQ_DD): Likewise.
++ (TSTSFI_EQ_TD): Likewise.
++ (TSTSFI_GT_DD): Likewise.
++ (TSTSFI_GT_TD): Likewise.
++ (TSTSFI_OV_DD): Likewise.
++ (TSTSFI_OV_TD): Likewise.
++ (TSTSFI_LT): New BU_P9_DFP_OVERLOAD_2.
++ (TSTSFI_LT_DD): Likewise.
++ (TSTSFI_LT_TD): Likewise.
++ (TSTSFI_EQ): Likewise.
++ (TSTSFI_EQ_DD): Likewise.
++ (TSTSFI_EQ_TD): Likewise.
++ (TSTSFI_GT): Likewise.
++ (TSTSFI_GT_DD): Likewise.
++ (TSTSFI_GT_TD): Likewise.
++ (TSTSFI_OV): Likewise.
++ (TSTSFI_OV_DD): Likewise.
++ (TSTSFI_OV_TD): Likewise.
++ * config/rs6000/rs6000-c.c (altivec_overloaded_builtins): Add
++ overloaded test significance functions.
++ * config/rs6000/rs6000-cpus.def (ISA_3_0_MASKS_SERVER): Add
++ OPTION_MASK_P9_MISC into the representation of this mask.
++ (POWERPC_MASKS): Add OPTION_MASK_P9_MISC into the representation
++ of this mask.
++ * config/rs6000/rs6000.c (rs6000_builtin_mask_calculate): Set the
++ RS6000_BTM_P9_MISC flag in the return value if TARGET_P9_MISC is
++ non-zero.
++ (rs6000_expand_binop_builtin): Enforce that argument 0 of the exp
++ argument is a 6-bit unsigned literal value if the icode argument
++ represents a DFP test significance built-in call.
++ (rs6000_invalid_builtin): Add support for the RS6000_BTM_P9_MISC
++ flag used independently and in combination with the
++ RS6000_BTM_64BIT flag.
++ (rs6000_opt_masks): Add entry for power9-misc command-line option.
++ (rs6000_builtin_mask_names): Add entry for power9-misc
++ command-line option.
++ * config/rs6000/rs6000.h: Redefine TARGET_P9_MISC as 0 if
++ HAVE_AS_POWER9 is not a defined macro. Define MASK_P9_MISC and
++ RS6000_BTM_P9_MISC macros.
++ * config/rs6000/rs6000.opt: Add support for the -mpower9-misc
++ option and change the description of the -mpower9-vector option to
++ enable only vector instructions, removing its erroneously claimed
++ support for scalar instructions.
++ * doc/extend.texi (PowerPC AltiVec Built-in Functions): Document
++ the ISA 3.0 digital floating point test significance built-in
++ functions.
++
++2016-07-07 Richard Biener <rguenther@suse.de>
++
++ Backport from mainline
++ 2016-06-13 Richard Biener <rguenther@suse.de>
++
++ PR middle-end/64516
++ * fold-const.c (fold_unary_loc): Preserve alignment when
++ folding a VIEW_CONVERT_EXPR into a MEM_REF.
++
++2016-07-07 Richard Biener <rguenther@suse.de>
++
++ Backport from mainline
++ 2016-05-25 Richard Biener <rguenther@suse.de>
++
++ PR tree-optimization/71264
++ * tree-vect-stmts.c (vect_init_vector): Properly deal with
++ vector type val.
++
++ 2016-06-07 Richard Biener <rguenther@suse.de>
++
++ PR middle-end/71423
++ * match.pd ((X | ~Y) -> Y <= X): Properly invert the comparison
++ for signed ops.
++
++ 2016-06-14 Richard Biener <rguenther@suse.de>
++
++ PR tree-optimization/71521
++ * tree-vrp.c (extract_range_from_binary_expr_1): Guard
++ division int_const_binop against zero divisor.
++
++ 2016-06-08 Richard Biener <rguenther@suse.de>
++
++ PR tree-optimization/71452
++ * tree-ssa.c (non_rewritable_lvalue_p): Make sure that the
++ type used for the SSA rewrite has enough precision to cover
++ the dynamic type of the location.
++
++ 2016-06-14 Richard Biener <rguenther@suse.de>
++
++ PR tree-optimization/71522
++ * tree-ssa.c (non_rewritable_lvalue_p): Do not rewrite non-float
++ copying into float copying.
++
++2016-07-06 Senthil Kumar Selvaraj <senthil_kumar.selvaraj@atmel.com>
++
++ Backport from mainline
++ 2016-07-06 Senthil Kumar Selvaraj <senthil_kumar.selvaraj@atmel.com>
++
++ PR target/50739
++ * config/avr/avr.c (avr_asm_select_section): Strip off
++ SECTION_DECLARED from flags when calling get_section.
++
++2016-07-05 Pat Haugen <pthaugen@us.ibm.com>
++
++ Backport from mainline
++ 2016-06-28 Pat Haugen <pthaugen@us.ibm.com>
++
++ * config/rs6000/rs6000.md ('type' attribute): Add htmsimple/dfp types.
++ ('size' attribute): Add '128'.
++ Include power9.md.
++ (*mov<mode>_hardfloat32, *mov<mode>_hardfloat64, *movdi_internal32,
++ *movdi_internal64, *movdf_update1): Set size attribute to '64'.
++ (add<mode>3, sub<mode>3, mul<mode>3, div<mode>3, sqrt<mode>2,
++ copysign<mode>3, neg<mode>2_hw, abs<mode>2_hw, *nabs<mode>2_hw,
++ *fma<mode>4_hw, *fms<mode>4_hw, *nfma<mode>4_hw, *nfms<mode>4_hw,
++ extend<SFDF:mode><IEEE128:mode>2_hw, trunc<mode>df2_hw,
++ *xscvqp<su>wz_<mode>, *xscvqp<su>dz_<mode>, *xscv<su>dqp_<mode>,
++ *trunc<mode>df2_odd): Set size attribute to '128'.
++ (*cmp<mode>_hw): Change type to veccmp and set size attribute to '128'.
++ * config/rs6000/power6.md (power6-fp): Include dfp type.
++ * config/rs6000/power7.md (power7-fp): Likewise.
++ * config/rs6000/power8.md (power8-fp): Likewise.
++ * config/rs6000/power9.md: New file.
++ * config/rs6000/t-rs6000 (MD_INCLUDES): Add power9.md.
++ * config/rs6000/htm.md (*tabort, *tabort<wd>c, *tabort<wd>ci,
++ *trechkpt, *treclaim, *tsr, *ttest): Change type attribute to
++ htmsimple.
++ * config/rs6000/dfp.md (extendsddd2, truncddsd2, extendddtd2,
++ trunctddd2, adddd3, addtd3, subdd3, subtd3, muldd3, multd3, divdd3,
++ divtd3, *cmpdd_internal1, *cmptd_internal1, floatdidd2, floatditd2,
++ ftruncdd2, fixdddi2, ftrunctd2, fixtddi2, dfp_ddedpd_<mode>,
++ dfp_denbcd_<mode>, dfp_dxex_<mode>, dfp_diex_<mode>, dfp_dscli_<mode>,
++ dfp_dscri_<mode>): Change type attribute to dfp.
++ * config/rs6000/crypto.md (crypto_vshasigma<CR_char>): Change type
++ attribute to vecsimple.
++ * config/rs6000/rs6000.c (power9_cost): Update costs, cache size
++ and prefetch streams.
++ (rs6000_option_override_internal): Remove temporary code setting
++ tuning to power8. Don't set rs6000_sched_groups for power9.
++ (last_scheduled_insn): Change to rtx_insn *.
++ (divide_cnt, vec_load_pendulum): New variables.
++ (rs6000_adjust_cost): Add Power9 to test for store->load separation.
++ (rs6000_issue_rate): Set issue rate for Power9.
++ (is_power9_pairable_vec_type): New.
++ (power9_sched_reorder2): New.
++ (rs6000_sched_reorder2): Call new function for Power9 specific
++ reordering.
++ (insn_must_be_first_in_group): Remove Power9.
++ (insn_must_be_last_in_group): Likewise.
++ (force_new_group): Likewise.
++ (rs6000_sched_init): Fix initialization of last_scheduled_insn.
++ Initialize divide_cnt/vec_load_pendulum.
++ (_rs6000_sched_context, rs6000_init_sched_context,
++ rs6000_set_sched_context): Handle context save/restore of new
++ variables.
++
++2016-07-05 Pat Haugen <pthaugen@us.ibm.com>
++
++ Backport from mainline
++ 2016-06-27 Pat Haugen <pthaugen@us.ibm.com>
++
++ * config/rs6000/rs6000.md ('type' attribute): Add
++ veclogical,veccmpfx,vecexts,vecmove insn types.
++ (*abs<mode>2_fpr, *nabs<mode>2_fpr, *neg<mode>2_fpr, *extendsfdf2_fpr,
++ copysign<mode>3_fcpsgn, trunc<mode>df2_internal1, neg<mode>2_internal,
++ p8_fmrgow_<mode>, pack<mode>): Change type to fpsimple.
++ (*xxsel<mode>, copysign<mode>3_hard, neg<mode>2_hw, abs<mode>2_hw,
++ *nabs<mode>2_hw): Change type to vecmove.
++ (*and<mode>3_internal, *bool<mode>3_internal, *boolc<mode>3_internal,
++ *boolcc<mode>3_internal, *eqv<mode>3_internal,
++ *one_cmpl<mode>3_internal, *ieee_128bit_vsx_neg<mode>2_internal,
++ *ieee_128bit_vsx_abs<mode>2_internal,
++ *ieee_128bit_vsx_nabs<mode>2_internal, extendkftf2, trunctfkf2,
++ *ieee128_mfvsrd_64bit, *ieee128_mfvsrd_32bit, *ieee128_mtvsrd_64bit,
++ *ieee128_mtvsrd_32bit): Change type to veclogical.
++ (mov<mode>_hardfloat, *mov<mode>_hardfloat32, *mov<mode>_hardfloat64,
++ *movdi_internal32, *movdi_internal64): Update insn types.
++ * config/rs6000/vsx.md (*vsx_le_undo_permute_<mode>,
++ vsx_extract_<mode>): Change type to veclogical.
++ (*vsx_xxsel<mode>, *vsx_xxsel<mode>_uns): Change type to vecmove.
++ (vsx_sign_extend_qi_<mode>, *vsx_sign_extend_hi_<mode>,
++ *vsx_sign_extend_si_v2di): Change type to vecexts.
++ * config/rs6000/altivec.md (*altivec_mov<mode>, *altivec_movti): Change
++ type to veclogical.
++ (*altivec_eq<mode>, *altivec_gt<mode>, *altivec_gtu<mode>,
++ *altivec_vcmpequ<VI_char>_p, *altivec_vcmpgts<VI_char>_p,
++ *altivec_vcmpgtu<VI_char>_p): Change type to veccmpfx.
++ (*altivec_vsel<mode>, *altivec_vsel<mode>_uns): Change type to vecmove.
++ * config/rs6000/dfp.md (*negdd2_fpr, *absdd2_fpr, *nabsdd2_fpr,
++ negtd2, *abstd2_fpr, *nabstd2_fpr): Change type to fpsimple.
++ * config/rs6000/40x.md (ppc405-float): Add fpsimple.
++ * config/rs6000/440.md (ppc440-fp): Add fpsimple.
++ * config/rs6000/476.md (ppc476-fp): Add fpsimple.
++ * config/rs6000/601.md (ppc601-fp): Add fpsimple.
++ * config/rs6000/603.md (ppc603-fp): Add fpsimple.
++ * config/rs6000/6xx.md (ppc604-fp): Add fpsimple.
++ * config/rs6000/7xx.md (ppc750-fp): Add fpsimple.
++ (ppc7400-vecsimple): Add veclogical, vecmove, veccmpfx.
++ * config/rs6000/7450.md (ppc7450-fp): Add fpsimple.
++ (ppc7450-vecsimple): Add veclogical, vecmove.
++ (ppc7450-veccmp): Add veccmpfx.
++ * config/rs6000/8540.md (ppc8540_simple_vector): Add veclogical,
++ vecmove.
++ (ppc8540_vector_compare): Add veccmpfx.
++ * config/rs6000/a2.md (ppca2-fp): Add fpsimple.
++ * config/rs6000/cell.md (cell-fp): Add fpsimple.
++ (cell-vecsimple): Add veclogical, vecmove.
++ (cell-veccmp): Add veccmpfx.
++ * config/rs6000/e300c2c3.md (ppce300c3_fp): Add fpsimple.
++ * config/rs6000/e6500.md (e6500_vecsimple): Add veclogical, vecmove,
++ veccmpfx.
++ * config/rs6000/mpc.md (mpccore-fp): Add fpsimple.
++ * config/rs6000/power4.md (power4-fp): Add fpsimple.
++ (power4-vecsimple): Add veclogical, vecmove.
++ (power4-veccmp): Add veccmpfx.
++ * config/rs6000/power5.md (power5-fp): Add fpsimple.
++ * config/rs6000/power6.md (power6-fp): Add fpsimple.
++ (power6-vecsimple): Add veclogical, vecmove.
++ (power6-veccmp): Add veccmpfx.
++ * config/rs6000/power7.md (power7-fp): Add fpsimple.
++ (power7-vecsimple): Add veclogical, vecmove, veccmpfx.
++ * config/rs6000/power8.md (power8-fp): Add fpsimple.
++ (power8-vecsimple): Add veclogical, vecmove, veccmpfx.
++ * config/rs6000/rs64.md (rs64a-fp): Add fpsimple.
++ * config/rs6000/titan.md (titan_fp): Add fpsimple.
++ * config/rs6000/xfpu.md (fp-default, fp-addsub-s, fp-addsub-d): Add
++ fpsimple.
++ * config/rs6000/rs6000.c (rs6000_adjust_cost): Add TYPE_FPSIMPLE.
++
++2016-07-05 Kelvin Nilsen <kelvin@gcc.gnu.org>
++
++ Backport from mainline r237391
++ 2016-06-13 Kelvin Nilsen <kelvin@gcc.gnu.org>
++
++ * config/rs6000/rs6000.h (RS6000_BTM_COMMON): Add the
++ RS6000_BTM_MODULO flag into the set of flags that are considered
++ to be part of the common configuration.
++
++2016-07-04 Jakub Jelinek <jakub@redhat.com>
++
++ PR c++/71739
++ * tree.c (attribute_value_equal): Use get_attribute_name instead of
++ directly using TREE_PURPOSE.
++
++2016-07-04 Segher Boessenkool <segher@kernel.crashing.org>
++
++ Backport from mainline
++ 2016-06-27 Segher Boessenkool <segher@kernel.crashing.org>
++
++ PR target/71670
++ * config/rs6000/rs6000.md (ashdi3_extswsli_dot): Use
++ gen_ashdi3_extswsli_dot2 instead of gen_ashdi3_extswsli_dot.
++
++2016-07-02 Jakub Jelinek <jakub@redhat.com>
++
++ Backported from mainline
++ 2016-06-28 Jakub Jelinek <jakub@redhat.com>
++
++ PR middle-end/71626
++ * config/i386/i386.c (ix86_expand_vector_move): For SUBREG of
++ a constant, force its SUBREG_REG into memory or register instead
++ of whole op1.
++
++ 2016-06-20 Jakub Jelinek <jakub@redhat.com>
++
++ PR target/71559
++ * config/i386/i386.c (ix86_fp_cmp_code_to_pcmp_immediate): Fix up
++ returned values and add UN*/LTGT/*ORDERED cases with values matching
++ D operand modifier on vcmp for AVX.
++
++2016-07-01 Kelvin Nilsen <kelvin@gcc.gnu.org>
++
++ Backport from trunk r237659
++ 2016-06-21 Kelvin Nilsen <kelvin@gcc.gnu.org>
++
++ * config/rs6000/rs6000.h: Add conditional preprocessing directives
++ to disable Power9-specific compiler features if HAVE_AS_POWER9 is
++ not defined.
++
++2016-07-01 Peter Bergner <bergner@vnet.ibm.com>
++
++ Backport from trunk
++ 2016-06-27 Peter Bergner <bergner@vnet.ibm.com>
++
++ PR target/71656
++ * config/rs6000/rs6000-cpus.def (ISA_3_0_MASKS_SERVER): Add
++ OPTION_MASK_P9_DFORM_VECTOR.
++ * config/rs6000/rs6000.c (rs6000_option_override_internal): Do not
++ disable -mpower9-dform-vector when using reload.
++ (quad_address_p): Remove 'gpr_p' argument and all associated code.
++ New 'strict' argument. Update all callers. Add strict addressing
++ support.
++ (rs6000_legitimate_offset_address_p): Remove call to
++ virtual_stack_registers_memory_p.
++ (rs6000_legitimize_reload_address): Add quad address support.
++ (rs6000_legitimate_address_p): Move call to quad_address_p above
++ call to virtual_stack_registers_memory_p. Adjust quad_address_p args
++ to account for new strict usage.
++ (rs6000_output_move_128bit): Adjust quad_address_p args to account
++ for new strict usage.
++ * config/rs6000/predicates.md (quad_memory_operand): Likewise.
++
++2016-07-01 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
++
++ Backport from mainline
++ 2016-06-24 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
++
++ * config/rs6000/rs6000-builtin.def (BU_FLOAT128_2): New #define.
++ (BU_FLOAT128_1): Likewise.
++ (FABSQ): Likewise.
++ (COPYSIGNQ): Likewise.
++ (RS6000_BUILTIN_NANQ): Likewise.
++ (RS6000_BUILTIN_NANSQ): Likewise.
++ (RS6000_BUILTIN_INFQ): Likewise.
++ (RS6000_BUILTIN_HUGE_VALQ): Likewise.
++ * config/rs6000/rs6000.c (rs6000_fold_builtin): New prototype.
++ (TARGET_FOLD_BUILTIN): New #define.
++ (rs6000_builtin_mask_calculate): Add TARGET_FLOAT128 entry.
++ (rs6000_invalid_builtin): Add handling for RS6000_BTM_FLOAT128.
++ (rs6000_fold_builtin): New target hook implementation, handling
++ folding of 128-bit NaNs and infinities.
++ (rs6000_init_builtins): Initialize const_str_type_node; ensure all
++ entries are filled in to avoid problems during bootstrap
++ self-test; define builtins for 128-bit NaNs and infinities.
++ (rs6000_opt_mask): Add entry for float128.
++ * config/rs6000/rs6000.h (RS6000_BTM_FLOAT128): New #define.
++ (RS6000_BTM_COMMON): Include RS6000_BTM_FLOAT128.
++ (rs6000_builtin_type_index): Add RS6000_BTI_const_str.
++ (const_str_type_node): New #define.
++ * config/rs6000/rs6000.md (copysign<mode>3 for IEEE128): Convert
++ to a define_expand that dispatches to either copysign<mode>3_soft
++ or copysign<mode>3_hard.
++ (copysign<mode>3_hard): Rename from copysign<mode>3.
++ (copysign<mode>3_soft): New define_insn.
++ * doc/extend.texi: Document new builtins.
++
++2016-07-01 Peter Bergner <bergner@vnet.ibm.com>
++
++ Backport from trunk
++ 2016-07-01 Peter Bergner <bergner@vnet.ibm.com>
++
++ PR target/71698
++ * config/rs6000/rs6000.c (rs6000_secondary_reload_simple_move): Disallow
++ TDmode values.
++
++2016-07-01 Kelvin Nilsen <kelvin@gcc.gnu.org>
++
++ Backport from trunk r236992
++ 2016-06-01 Kelvin Nilsen <kelvin@gcc.gnu.org>
++
++ * config/rs6000/altivec.h (vec_slv): New macro.
++ (vec_srv): New macro.
++ * config/rs6000/altivec.md (UNSPEC_VSLV): New value.
++ (UNSPEC_VSRV): New value.
++ (vslv): New insn.
++ (vsrv): New insn.
++ * config/rs6000/rs6000-builtin.def (vslv): New builtin definition.
++ (vsrv): New builtin definition.
++ * config/rs6000/rs6000-c.c (P9V_BUILTIN_VSLV): Macro expansion to
++ define argument types for new builtin.
++ (P9V_BUILTIN_VSRV): Macro expansion to define argument types for
++ new builtin.
++ * doc/extend.texi: Document the new vec_vslv and vec_srv built-in
++ functions.
++
++2016-07-01 Eric Botcazou <ebotcazou@adacore.com>
++
++ * config/arm/arm.c (arm_function_ok_for_sibcall): Add another check
++ for NULL decl.
++
++2016-06-30 Kelvin Nilsen <kelvin@gcc.gnu.org>
++
++ Backport from trunk r237390
++ 2016-06-13 Kelvin Nilsen <kelvin@gcc.gnu.org>
++
++ * config/rs6000/altivec.h (vec_absd): New macro for vector absolute
++ difference unsigned.
++ (vec_absdb): New macro for vector absolute difference unsigned
++ byte.
++ (vec_absdh): New macro for vector absolute difference unsigned
++ half-word.
++ (vec_absdw): New macro for vector absolute difference unsigned word.
++ * config/rs6000/altivec.md (UNSPEC_VADU): New value.
++ (vadu<mode>3): New insn.
++ (*p9_vadu<mode>3): New insn.
++ * config/rs6000/rs6000-builtin.def (vadub): New built-in
++ definition.
++ (vaduh): New built-in definition.
++ (vaduw): New built-in definition.
++ (vadu): New overloaded built-in definition.
++ (vadub): New overloaded built-in definition.
++ (vaduh): New overloaded built-in definition.
++ (vaduw): New overloaded built-in definition.
++ * config/rs6000/rs6000-c.c (altivec_overloaded_builtins): Add
++ overloaded vector absolute difference unsigned functions.
++ * doc/extend.texi (PowerPC AltiVec Built-in Functions): Document
++ the ISA 3.0 vector absolute difference unsigned built-in functions.
++
++2016-06-30 David Malcolm <dmalcolm@redhat.com>
++
++ Backport from trunk r237880.
++ 2016-06-30 David Malcolm <dmalcolm@redhat.com>
++
++ PR driver/71651
++ * gcc.c (driver::build_option_suggestions): Pass "option" to
++ add_misspelling_candidates.
++ * opts-common.c (add_misspelling_candidates): Add "option" param;
++ use it to avoid adding negated forms for options marked with
++ RejectNegative.
++ * opts.h (add_misspelling_candidates): Add "option" param.
++
++2016-06-30 Jakub Jelinek <jakub@redhat.com>
++
++ PR middle-end/71693
++ * fold-const.c (fold_binary_loc) <case RROTATE_EXPR>: Cast
++ TREE_OPERAND (arg0, 0) and TREE_OPERAND (arg0, 1) to type
++ first when permuting bitwise operation with rotate. Cast
++ TREE_OPERAND (arg0, 0) to type when cancelling two rotations.
++
++2016-06-30 Martin Liska <mliska@suse.cz>
++
++ Parting backport from mainline
++ 2016-06-29 Martin Liska <mliska@suse.cz>
++
++ * ipa-inline-transform.c (inline_call): Remove unnecessary call
++ of build_optimization_node.
++
++2016-06-29 Eric Botcazou <ebotcazou@adacore.com>
++
++ Backport from mainline
++ 2016-06-09 Eric Botcazou <ebotcazou@adacore.com>
++
++ * df-problems.c (df_note_bb_compute): Guard use of DF_INSN_INFO_GET.
++
++2016-06-27 Michael Meissner <meissner@linux.vnet.ibm.com>
++
++ Back port from trunk
++ 2016-06-21 Michael Meissner <meissner@linux.vnet.ibm.com>
++
++ * stor-layout.c (layout_type): Move setting complex MODE to
++ layout_type, instead of setting it ahead of time by the caller.
++
++ Back port from trunk
++ 2016-05-11 Alan Modra <amodra@gmail.com>
++
++ * config/rs6000/rs6000.c (is_complex_IBM_long_double,
++ abi_v4_pass_in_fpr): New functions.
++ (rs6000_function_arg_boundary): Exclude complex IBM long double
++ from 64-bit alignment when ABI_V4.
++ (rs6000_function_arg, rs6000_function_arg_advance_1,
++ rs6000_gimplify_va_arg): Use abi_v4_pass_in_fpr.
++
++ Back port from trunk
++ 2016-05-02 Michael Meissner <meissner@linux.vnet.ibm.com>
++
++ * machmode.h (mode_complex): Add support to give the complex mode
++ for a given mode.
++ (GET_MODE_COMPLEX_MODE): Likewise.
++ * stor-layout.c (layout_type): For COMPLEX_TYPE, use the mode
++ stored by build_complex_type and gfc_build_complex_type instead of
++ trying to figure out the appropriate mode based on the size. Raise
++ an assertion error, if the type was not set.
++ * genmodes.c (struct mode_data): Add field for the complex type of
++ the given type.
++ (blank_mode): Likewise.
++ (make_complex_modes): Remember the complex mode created in the
++ base type.
++ (emit_mode_complex): Write out the mode_complex array to map a
++ type mode to the complex version.
++ (emit_insn_modes_c): Likewise.
++ * tree.c (build_complex_type): Set the complex type to use before
++ calling layout_type.
++ * config/rs6000/rs6000.c (rs6000_hard_regno_nregs_internal): Add
++ support for __float128 complex datatypes.
++ (rs6000_hard_regno_mode_ok): Likewise.
++ (rs6000_setup_reg_addr_masks): Likewise.
++ (rs6000_complex_function_value): Likewise.
++ * config/rs6000/rs6000.h (FLOAT128_IEEE_P): Likewise.
++ __float128 and __ibm128 complex.
++ (FLOAT128_IBM_P): Likewise.
++ (ALTIVEC_ARG_MAX_RETURN): Likewise.
++ * doc/extend.texi (Additional Floating Types): Document that
++ -mfloat128 must be used to enable __float128. Document complex
++ __float128 and __ibm128 support.
++
++2016-06-24 Jakub Jelinek <jakub@redhat.com>
++
++ PR tree-optimization/71647
++ * omp-low.c (lower_rec_input_clauses): Convert
++ omp_clause_aligned_alignment (c) to size_type_node for the
++ last argument of __builtin_assume_aligned.
++
++2016-06-22 Eric Botcazou <ebotcazou@adacore.com>
++
++ * function.c (assign_parm_setup_reg): Prevent sharing in another case.
++
++2016-06-21 Georg-Johann Lay <avr@gjlay.de>
++
++ Backport from 2016-06-21 trunk r237639.
++
++ PR target/30417
++ * config/avr/gen-avr-mmcu-specs.c (print_mcu):
++ [*link_data_start]: Wrap -Tdata into %{!Tdata:...}.
++ [*link_text_start]: Wrap -Ttext into %{!Ttext:...}.
++
++2016-06-21 Georg-Johann Lay <avr@gjlay.de>
++
++ PR target/71103
++ * config/avr/avr.md (movqi): Only handle loading subreg:qi of
++ constant addresses if can_create_pseudo_p.
++
++2016-06-21 Jakub Jelinek <jakub@redhat.com>
++
++ PR tree-optimization/71588
++ * tree-ssa-strlen.c (valid_builtin_call): New function.
++ (adjust_last_stmt, handle_builtin_memset, strlen_optimize_stmt): Use
++ it.
++
++ Backported from mainline
++ 2016-06-20 Jakub Jelinek <jakub@redhat.com>
++
++ PR middle-end/71581
++ * tree-ssa-uninit.c (warn_uninit): If EXPR and VAR are NULL,
++ see if T isn't anonymous SSA_NAME with COMPLEX_EXPR created
++ for conversion of scalar user var to complex type and use the
++ underlying SSA_NAME_VAR in that case. If EXPR is still NULL,
++ punt.
++
++ 2016-06-16 Jakub Jelinek <jakub@redhat.com>
++
++ * gimplify.c (gimplify_scan_omp_clauses): Handle COMPONENT_REFs
++ with base of reference to struct.
++
++2016-06-20 Ilya Enkovich <ilya.enkovich@intel.com>
++
++ Backport from mainline r237484.
++ 2016-06-15 Ilya Enkovich <ilya.enkovich@intel.com>
++
++ PR middle-end/71529
++ * ipa-chkp.c (chkp_build_instrumented_fndecl): Fix
++ DECL_CONTEXT for copied arguments.
++
++2016-06-20 Georg-Johann Lay <avr@gjlay.de>
++ Pitchumani Sivanupandi <pitchumani.s@atmel.com>
++
++ Backport from 2016-06-20 trunk r237589, r236558.
++
++ PR target/71103
++ * config/avr/avr.md (movqi): Handle loading subreg:qi (const,
++ symbol_ref,label_ref).
++
++2016-06-16 Jakub Jelinek <jakub@redhat.com>
++
++ PR target/71554
++ * config/i386/i386.md (setcc + movzbl peephole2): Use reg_set_p.
++ (setcc + and peephole2): Likewise.
++
++2016-06-15 Andreas Tobler <andreast@gcc.gnu.org>
++
++ Backported from mainline
++ 2016-06-14 Andreas Tobler <andreast@gcc.gnu.org>
++
++ * config/arm/freebsd.h: Only enable unaligned access for armv6 on
++ FreeBSD 11 and above.
++
++2016-06-15 Ilya Verbin <ilya.verbin@intel.com>
++
++ Backport from mainline
++ 2016-04-30 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
++
++ * config/darwin.h (LINK_COMMAND_SPEC_A): Handle -fcilkplus.
++
++2016-06-14 Jakub Jelinek <jakub@redhat.com>
++
++ Backported from mainline
++ 2016-06-10 Jakub Jelinek <jakub@redhat.com>
++
++ PR middle-end/71494
++ * tree-nested.c (convert_nonlocal_reference_stmt): For GIMPLE_GOTO
++ without LABEL_DECL, set *handled_ops_p to false instead of true.
++
++ 2016-06-08 Jakub Jelinek <jakub@redhat.com>
++ Richard Biener <rguenther@suse.de>
++
++ PR c++/71448
++ * fold-const.c (fold_comparison): Handle CONSTANT_CLASS_P (base0)
++ the same as DECL_P (base0) for indirect_base0. Use equality_code
++ in one further place.
++
++ 2016-06-04 Jakub Jelinek <jakub@redhat.com>
++
++ PR tree-optimization/71405
++ * tree-ssa.c (execute_update_addresses_taken): For clobber with
++ incompatible type, build a new clobber with the right type instead
++ of building a VIEW_CONVERT_EXPR around it.
++
++2016-06-13 Eric Botcazou <ebotcazou@adacore.com>
++
++ * tree-ssa-sccvn.c (vn_reference_lookup_3): Use a uniform test and
++ update shared_lookup_references only once after changing operands.
++
++2016-06-13 Richard Biener <rguenther@suse.de>
++
++ PR tree-optimization/71505
++ * tree-vect-data-refs.c (vect_analyze_data_ref_accesses): Make
++ assert match comment.
++
++2016-06-13 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
++
++ Backport from mainline
++ 2016-06-13 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
++
++ PR target/71379
++ * config/s390/s390.c (s390_expand_builtin): Increase MAX_ARGS by
++ one.
++
++2016-06-10 Thomas Schwinge <thomas@codesourcery.com>
++
++ PR middle-end/71373
++ Backport from trunk r237291:
++ * tree-nested.c (convert_nonlocal_omp_clauses)
++ (convert_local_omp_clauses): Handle OMP_CLAUSE_ASYNC,
++ OMP_CLAUSE_WAIT, OMP_CLAUSE_INDEPENDENT, OMP_CLAUSE_AUTO,
++ OMP_CLAUSE__CACHE_, OMP_CLAUSE_TILE.
++
++ Backport from trunk r237291:
++ * gimplify.c (gimplify_adjust_omp_clauses): Discard
++ OMP_CLAUSE_TILE.
++ * omp-low.c (scan_sharing_clauses): Don't expect OMP_CLAUSE_TILE.
++
++ Backport from trunk r237290:
++ * omp-low.c (scan_sharing_clauses): Don't expect
++ OMP_CLAUSE__CACHE_.
++
++ Backport trunk r235964:
++ 2016-05-06 Nathan Sidwell <nathan@codesourcery.com>
++
++ * gimple.c (gimple_call_same_target_p): Unique functions are eq.
++ * tree-ssa-tail-merge.c (same_succ::equal): Check pointer eq
++ equality first.
++
++2016-06-09 Michael Meissner <meissner@linux.vnet.ibm.com>
++
++ Back port from trunk
++ 2016-05-31 Michael Meissner <meissner@linux.vnet.ibm.com>
++
++ * config/rs6000/vsx.md (vsx_splat_<mode>, V2DI/V2DF): Simplify
++ alternatives, eliminating preferred register class. Add support
++ for the MTVSRDD instruction in ISA 3.0.
++ (vsx_splat_v4si_internal): Use splat_input_operand instead of
++ reg_or_indexed_operand.
++ (vsx_splat_v4sf_internal): Likewise.
++
++ Back port from trunk
++ 2016-05-31 Michael Meissner <meissner@linux.vnet.ibm.com>
++
++ PR target/71186
++ * config/rs6000/vsx.md (xxspltib_<mode>_nosplit): Add alternatives
++ for loading up all 0's or all 1's.
++
++ Back port from trunk
++ 2016-05-18 Michael Meissner <meissner@linux.vnet.ibm.com>
++
++ PR target/70915
++ * config/rs6000/constraints.md (wE constraint): New constraint
++ for a vector constant that can be loaded with XXSPLTIB.
++ (wM constraint): New constraint for a vector constant of a 1's.
++ (wS constraint): New constraint for a vector constant that can be
++ loaded with XXSPLTIB and a vector sign extend instruction.
++ * config/rs6000/predicates.md (xxspltib_constant_split): New
++ predicates for wE/wS constraints.
++ (xxspltib_constant_nosplit): Likewise.
++ (easy_vector_constant): Add support for constants that can be
++ loaded via XXSPLTIB.
++ (splat_input_operand): Add support for ISA 3.0 word splat operations.
++ * config/rs6000/rs6000.c (xxspltib_constant_p): New function to
++ return if a constant can be loaded with the ISA 3.0 XXSPLTIB
++ instruction and possibly with a sign extension.
++ (output_vec_const_move): Add support for XXSPLTIB. If we are
++ loading up 0/-1 into Altivec registers, prefer using VSPLTISW
++ instead of XXLXOR/XXLORC.
++ (rs6000_expand_vector_init): Add support for ISA 3.0 word splat
++ operations.
++ (rs6000_legitimize_reload_address): Likewise.
++ (rs6000_output_move_128bit): Use output_vec_const_move to emit
++ constants.
++ * config/rs6000/vsx.md (VSX_M): Add TImode (if -mvsx-timode) and
++ combine VSX_M and VSX_M2 into one iterator.
++ (VSX_M2): Likewise.
++ (VSINT_84): New iterators for loading constants with XXSPLTIB.
++ (VSINT_842): Likewise.
++ (UNSPEC_VSX_SIGN_EXTEND): New UNSPEC.
++ (xxspltib_v16qi): New insns to load up constants with the ISA 3.0
++ XXSPLTIB instruction.
++ (xxspltib_<mode>_nosplit): Likewise.
++ (xxspltib_<mode>_split): New insn to load up constants with
++ XXSPLTIB and a sign extend instruction.
++ (vsx_mov<mode>): Replace single move that handled all vector types
++ with separate 32-bit and 64-bit moves. Combine the movti_<bit>
++ moves (when -mvsx-timode is in effect) into the main vector
++ moves. Eliminate separate moves for <VSr> <VSa>, where the
++ preferred register class (<VSr>) is listed first, and the
++ secondary register class (<VSa>) is listed second with a '?' to
++ discourage use. Prefer loading 0/-1 in any VSX register for ISA
++ 3.0, and Altivec registers for ISA 2.06/2.07 (PR target/70915) so
++ that if the register was involved in a slow operation, the
++ clear/set operation does not wait for the slow operation to
++ finish. Adjust the length attributes for 32-bit mode. Use
++ rs6000_output_move_128bit and drop the use of the string
++ instructions for 32-bit movti when -mvsx-timode is in effect. Use
++ spacing so that the alternatives and attributes don't generate
++ long lines, and put things in columns, so that it is easier to
++ match up the operands and attributes with the insn alternatives.
++ (vsx_mov<mode>_64bit): Likewise.
++ (vsx_mov<mode>_32bit): Likewise.
++ (vsx_movti_64bit): Fold movti into normal vector moves.
++ (vsx_movti_32bit): Likewise.
++ (vsx_splat_<mode>, V4SI/V4SF modes): Add support for ISA 3.0 word
++ splat instructions.
++ (vsx_splat_v4si_internal): Likewise.
++ (vsx_splat_v4sf_internal): Likewise.
++ (vector fusion peepholes): Use VSX_M instead of VSX_M2.
++ (vsx_sign_extend_qi_<mode>): New ISA 3.0 instructions to sign
++ extend vector elements.
++ (vsx_sign_extend_hi_<mode>): Likewise.
++ (vsx_sign_extend_si_v2di): Likewise.
++ * config/rs6000/rs6000-protos.h (xxspltib_constant_p): Add
++ declaration.
++ * doc/md.texi (PowerPC constraints): Document the wE, wM, and wS
++ constraints. Add trailing period to wL documentation.
++
++2016-06-08 Jose E. Marchesi <jose.marchesi@oracle.com>
++
++ Backport from mainline
++ 2016-06-08 Jose E. Marchesi <jose.marchesi@oracle.com>
++
++ * config/sparc/driver-sparc.c (cpu_names): Fix the entry for the
++ SPARC-M7 and add an entry for SPARC-S7 cpus (Sonoma).
++
++2016-06-08 Eric Botcazou <ebotcazou@adacore.com>
++
++ Backport from mainline
++ 2016-06-06 Jose E. Marchesi <jose.marchesi@oracle.com>
++
++ * config/sparc/sparc.md (cpu): Add niagara7 cpu type.
++ Include the M7 SPARC DFA scheduler.
++ New attribute v3pipe.
++ Annotate insns with v3pipe where appropriate.
++ Define cpu_feature vis4.
++ Add lzd instruction type and set it on clzdi_sp64 and clzsi_sp64.
++ Add (V8QI "8") to vbits.
++ Add insns {add,sub}v8qi3
++ Add insns ss{add,sub}v8qi3
++ Add insns us{add,sub}{v8qi,v4hi}3
++ Add insns {min,max}{v8qi,v4hi,v2si}3
++ Add insns {minu,maxu}{v8qi,v4hi,v2si}3
++ Add insns fpcmp{le,gt,ule,ug,ule,ugt}{8,16,32}_vis.
++ * config/sparc/niagara4.md: Add a comment explaining the
++ discrepancy between the documented latenty numbers and the
++ implemented ones.
++ * config/sparc/niagara7.md: New file.
++ * configure.ac (HAVE_AS_SPARC5_VIS4): Define if the assembler
++ supports SPARC5 and VIS 4.0 instructions.
++ * configure: Regenerate.
++ * config.in: Likewise.
++ * config.gcc: niagara7 is a supported cpu in sparc*-*-* targets.
++ * config/sparc/sol2.h (ASM_CPU32_DEFAUILT_SPEC): Set for
++ TARGET_CPU_niagara7.
++ (ASM_CPU64_DEFAULT_SPEC): Likewise.
++ (CPP_CPU_SPEC): Handle niagara7.
++ (ASM_CPU_SPEC): Likewise.
++ * config/sparc/sparc-opts.h (processor_type): Add
++ PROCESSOR_NIAGARA7.
++ (mvis4): New option.
++ * config/sparc/sparc.h (TARGET_CPU_niagara7): Define.
++ (AS_NIAGARA7_FLAG): Define.
++ (ASM_CPU64_DEFAULT_SPEC): Set for niagara7.
++ (CPP_CPU64_DEFAULT_SPEC): Likewise.
++ (CPP_CPU_SPEC): Handle niagara7.
++ (ASM_CPU_SPEC): Likewise.
++ * config/sparc/sparc.c (niagara7_costs): Define.
++ (sparc_option_override): Handle niagara7 and adjust cache-related
++ parameters with better values for niagara cpus. Also support VIS4.
++ (sparc32_initialize_trampoline): Likewise.
++ (sparc_use_sched_lookahead): Likewise.
++ (sparc_issue_rate): Likewise.
++ (sparc_register_move_cost): Likewise.
++ (dump_target_flag_bits): Support VIS4.
++ (sparc_vis_init_builtins): Likewise.
++ (sparc_builtins): Likewise.
++ * config/sparc/sparc-c.c (sparc_target_macros): Define __VIS__ for
++ VIS4 4.0.
++ * config/sparc/driver-sparc.c (cpu_names): Add SPARC-M7 and
++ UltraSparc M7.
++ * config/sparc/sparc.opt (sparc_processor_type): New value
++ niagara7.
++ * config/sparc/visintrin.h (__attribute__): Prototypes for the
++ VIS4 builtins.
++ * doc/invoke.texi (SPARC Options): Document -mcpu=niagara7 and
++ -mvis4.
++ * doc/extend.texi (SPARC VIS Built-in Functions): Document the
++ VIS4 builtins.
++
++ 2016-05-30 Jose E. Marchesi <jose.marchesi@oracle.com>
++
++ * config.gcc (sparc*-*-*): Support cpu_32, cpu_64, tune_32 and
++ tune_64.
++ * doc/install.texi (--with-cpu-32, --with-cpu-64): Document
++ support on SPARC.
++ * config/sparc/linux64.h (OPTION_DEFAULT_SPECS): Add entries for
++ cpu_32, cpu_64, tune_32 and tune_64.
++ * config/sparc/sol2.h (OPTION_DEFAULT_SPECS): Likewise.
++
++2016-06-08 Ilya Verbin <ilya.verbin@intel.com>
++
++ Backport from mainline
++ 2016-05-25 Ilya Verbin <ilya.verbin@intel.com>
++
++ * config/i386/i386-builtin-types.def: Add V16SI_FTYPE_V16SF,
++ V8DF_FTYPE_V8DF_ROUND, V16SF_FTYPE_V16SF_ROUND, V16SI_FTYPE_V16SF_ROUND.
++ * config/i386/i386.c (enum ix86_builtins): Add
++ IX86_BUILTIN_CVTPS2DQ512_MASK, IX86_BUILTIN_FLOORPS512,
++ IX86_BUILTIN_FLOORPD512, IX86_BUILTIN_CEILPS512, IX86_BUILTIN_CEILPD512,
++ IX86_BUILTIN_TRUNCPS512, IX86_BUILTIN_TRUNCPD512,
++ IX86_BUILTIN_CVTPS2DQ512, IX86_BUILTIN_VEC_PACK_SFIX512,
++ IX86_BUILTIN_FLOORPS_SFIX512, IX86_BUILTIN_CEILPS_SFIX512,
++ IX86_BUILTIN_ROUNDPS_AZ_SFIX512.
++ (builtin_description bdesc_args): Add __builtin_ia32_floorps512,
++ __builtin_ia32_ceilps512, __builtin_ia32_truncps512,
++ __builtin_ia32_floorpd512, __builtin_ia32_ceilpd512,
++ __builtin_ia32_truncpd512, __builtin_ia32_cvtps2dq512,
++ __builtin_ia32_vec_pack_sfix512, __builtin_ia32_roundps_az_sfix512,
++ __builtin_ia32_floorps_sfix512, __builtin_ia32_ceilps_sfix512.
++ Change IX86_BUILTIN_CVTPS2DQ512 to IX86_BUILTIN_CVTPS2DQ512_MASK for
++ __builtin_ia32_cvtps2dq512_mask.
++ (ix86_expand_args_builtin): Handle V8DF_FTYPE_V8DF_ROUND,
++ V16SF_FTYPE_V16SF_ROUND, V16SI_FTYPE_V16SF_ROUND, V16SI_FTYPE_V16SF.
++ (ix86_builtin_vectorized_function): Handle builtins mentioned above.
++ * config/i386/sse.md
++ (<mask_codefor>avx512f_fix_notruncv16sfv16si<mask_name><round_name>):
++ Rename to ...
++ (avx512f_fix_notruncv16sfv16si<mask_name><round_name>): ... this.
++ (<mask_codefor>avx512f_cvtpd2dq512<mask_name><round_name>): Rename
++ to ...
++ (avx512f_cvtpd2dq512<mask_name><round_name>): ... this.
++ (avx512f_vec_pack_sfix_v8df): New define_expand.
++ (avx512f_roundpd512): Rename to ...
++ (avx512f_round<castmode>512): ... this. Change iterator.
++ (avx512f_roundps512_sfix): New define_expand.
++ (round<mode>2_sfix): Change iterator.
++
++2016-06-07 Peter Bergner <bergner@vnet.ibm.com>
++
++ Backport from mainline
++ 2016-06-07 Peter Bergner <bergner@vnet.ibm.com>
++
++ * doc/invoke.texi (RS/6000 and PowerPC Options): Document -mhtm and
++ -mno-htm.
++
++2016-06-07 Uros Bizjak <ubizjak@gmail.com>
++
++ PR target/71389
++ * config/i386/i386.c (ix86_avx256_split_vector_move_misalign):
++ Copy op1 RTX to avoid invalid sharing.
++ (ix86_expand_vector_move_misalign): Ditto.
++
++2016-06-06 Jakub Jelinek <jakub@redhat.com>
++
++ PR tree-optimization/71259
++ * tree-vect-slp.c (vect_get_constant_vectors): For
++ VECTOR_BOOLEAN_TYPE_P, return all ones constant instead of
++ one for constant op, and use COND_EXPR for non-constant.
++
++2016-06-06 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
++
++ Backport from trunk
++ 2016-06-02 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
++
++ PR target/70830
++ * config/arm/arm.c (arm_output_multireg_pop): Guard "pop" on update.
++
++2016-06-05 Uros Bizjak <ubizjak@gmail.com>
++
++ Backport from mainline
++ 2016-06-01 Uros Bizjak <ubizjak@gmail.com>
++ Jocelyn Mayer <l_indien@magic.fr>
++
++ PR target/67310
++ * config/i386/driver-i386.c (host_detect_local_cpu): Correctly
++ detect processor family for signature_CENTAUR_ebx.
++ <case PROCESSOR_I486>: Pass c3, winchip2 or winchip-c6 for
++ signature_CENTAUR_ebx.
++ <case PROCESSOR _PENTIUMPRO>: Pass c3-2 for signature_CENTAUR_ebx.
++ <default>: Pass x86-64 for has_longmode.
++
++2016-06-03 Jakub Jelinek <jakub@redhat.com>
++
++ PR middle-end/71387
++ * cgraph.c (cgraph_edge::redirect_call_stmt_to_callee): If redirecting
++ to noreturn e->callee->decl that has void return type and void
++ arguments, adjust gimple_call_fntype and remove lhs even if it had
++ previously addressable type.
++
++2016-06-02 Michael Meissner <meissner@linux.vnet.ibm.com>
++
++ Back port from trunk
++ 2016-05-26 Michael Meissner <meissner@linux.vnet.ibm.com>
++
++ * config/rs6000/rs6000.c (rs6000_emit_p9_fp_minmax): New function
++ for ISA 3.0 min/max support.
++ (rs6000_emit_p9_fp_cmove): New function for ISA 3.0 floating point
++ conditional move support.
++ (rs6000_emit_cmove): Call rs6000_emit_p9_fp_minmax and
++ rs6000_emit_p9_fp_cmove if the ISA 3.0 instructions are
++ available.
++ * config/rs6000/rs6000.md (SFDF2): New iterator to allow doing
++ conditional moves where the comparison type is different from move
++ type.
++ (fp_minmax): New code iterator for smin/smax.
++ (minmax): New code attributes for min/max.
++ (SMINMAX): Likewise.
++ (smax<mode>3): Combine min, max insns into one insn using the
++ fp_minmax code iterator. Add support for ISA 3.0 min/max
++ instructions that don't need -ffast-math.
++ (s<minmax><mode>3): Likewise.
++ (smax<mode>3_vsx): Likewise.
++ (smin<mode>3): Likewise.
++ (s<minmax><mode>3_vsx): Likewise.
++ (smin<mode>3_vsx): Likewise.
++ (pre-VSX min/max splitters): Likewise.
++ (s<minmax><mode>3_fpr): Likewise.
++ (movsfcc): Rewrite floating point conditional moves to combine
++ SFmode/DFmode into a single insn.
++ (mov<mode>cc): Likewise.
++ (movdfcc): Likewise.
++ (fselsfsf4): Combine FSEL cases into a single insn, using SFDF and
++ SFDF2 iterators to handle all combinations.
++ (fseldfsf4): Likewise.
++ (fsel<SFDF:mode><SFDF2:mode>4): Likewise.
++ (fseldfdf4): Likewise.
++ (fselsfdf4): Likewise.
++ (mov<SFDF:mode><SFDF2:mode>cc_p9): Add support for the ISA 3.0
++ comparison instructions that set a 0/-1 mask, and use it for
++ floating point conditional move via XXSEL.
++ (fpmask<mode>): Likewise.
++ (xxsel<mode>): Likewise.
++ * config/rs6000/predicates.md (min_max_operator): Delete, no
++ longer used.
++ (fpmask_comparison_operaton): New insn for ISA 3.0 comparison
++ instructions that generate a 0/-1 mask for use with XXSEL.
++ * config/rs6000/rs6000.h (TARGET_MINMAX_SF): New helper macros to
++ say whether floating point min/max is available, either through
++ FSEL, ISA 2.06 min/max, and ISA 3.0 min/max instrucitons.
++ (TARGET_MINMAX_DF): Likewise.
++
++ Back port from trunk
++ 2016-05-18 Michael Meissner <meissner@linux.vnet.ibm.com>
++
++ * config/rs6000/predicate.md (all_ones_constant): New predicate
++ for vector constant with all 1's set.
++
++2016-06-02 Kelvin Nilsen <kelvin@gcc.gnu.org>
++
++ Back port from trunk
++ 2016-05-19 Kelvin Nilsen <kelvin@gcc.gnu.org>
++
++ * config/rs6000/altivec.md (UNSPEC_DARN): New unspec constant.
++ (UNSPEC_DARN_32): New unspec constant.
++ (UNSPEC_DARN_RAW): New unspec constant.
++ (darn_32): New instruction.
++ (darn_raw): New instruction.
++ (darn): New instruction.
++ * config/rs6000/rs6000-builtin.def (RS6000_BUILTIN_0): Add
++ support and documentation for this macro.
++ (BU_P9_MISC_1): New macro definition.
++ (BU_P9_64BIT_MISC_0): New macro definition.
++ (BU_P9_MISC_0): New macro definition.
++ (darn_32): New builtin definition.
++ (darn_raw): New builtin definition.
++ (darn): New builtin definition.
++ * config/rs6000/rs6000.c: Add #define RS6000_BUILTIN_0 and #undef
++ RS6000_BUILTIN_0 directives to surround each occurrence of
++ #include "rs6000-builtin.def".
++ (rs6000_builtin_mask_calculate): Add in the RS6000_BTM_MODULO and
++ RS6000_BTM_64BIT flags to the returned mask, depending on
++ configuration.
++ (def_builtin): Correct an error in the assignments made to the
++ debugging variable attr_string.
++ (rs6000_expand_builtin): Add support for no-operand built-in
++ functions.
++ (builtin_function_type): Remove fatal_error assertion that is no
++ longer valid.
++ (rs6000_common_init_builtins): Add support for no-operand built-in
++ functions.
++ * config/rs6000/rs6000.h (RS6000_BTM_MODULO): New macro
++ definition.
++ (RS6000_BTM_PURE): Enhance comment to clarify intent of this flag
++ definition.
++ (RS6000_BTM_64BIT): New macro definition.
++ * doc/extend.texi: Document __builtin_darn (void),
++ __builtin_darn_raw (void), and __builtin_darn_32 (void) built-in
++ functions.
++
++2016-06-01 Michael Meissner <meissner@linux.vnet.ibm.com>
++
++ Back port from trunk
++ 2016-05-23 Michael Meissner <meissner@linux.vnet.ibm.com>
++
++ PR target/71201
++ * config/rs6000/altivec.md (altivec_vperm_<mode>_internal): Drop
++ ISA 3.0 xxperm fusion alternative.
++ (altivec_vperm_v8hiv16qi): Likewise.
++ (altivec_vperm_<mode>_uns_internal): Likewise.
++ (vperm_v8hiv4si): Likewise.
++ (vperm_v16qiv8hi): Likewise.
++
++ Back port from trunk
++ 2016-05-23 Michael Meissner <meissner@linux.vnet.ibm.com>
++ Kelvin Nilsen <kelvin@gcc.gnu.org>
++
++ * config/rs6000/rs6000.c (rs6000_expand_vector_set): Generate
++ vpermr/xxpermr on ISA 3.0.
++ (altivec_expand_vec_perm_le): Likewise.
++ * config/rs6000/altivec.md (UNSPEC_VPERMR): New unspec.
++ (altivec_vpermr_<mode>_internal): Add VPERMR/XXPERMR support for
++ ISA 3.0.
++
++ Back port from trunk
++ 2016-05-24 Michael Meissner <meissner@linux.vnet.ibm.com>
++
++ * config/rs6000/altivec.md (VParity): New mode iterator for vector
++ parity built-in functions.
++ (p9v_ctz<mode>2): Add support for ISA 3.0 vector count trailing
++ zeros.
++ (p9v_parity<mode>2): Likewise.
++ * config/rs6000/vector.md (VEC_IP): New mode iterator for vector
++ parity.
++ (ctz<mode>2): ISA 3.0 expander for vector count trailing zeros.
++ (parity<mode>2): ISA 3.0 expander for vector parity.
++ * config/rs6000/rs6000-builtin.def (BU_P9_MISC_1): New macros for
++ power9 built-ins.
++ (BU_P9_64BIT_MISC_0): Likewise.
++ (BU_P9_MISC_0): Likewise.
++ (BU_P9V_AV_1): Likewise.
++ (BU_P9V_AV_2): Likewise.
++ (BU_P9V_AV_3): Likewise.
++ (BU_P9V_AV_P): Likewise.
++ (BU_P9V_VSX_1): Likewise.
++ (BU_P9V_OVERLOAD_1): Likewise.
++ (BU_P9V_OVERLOAD_2): Likewise.
++ (BU_P9V_OVERLOAD_3): Likewise.
++ (VCTZB): Add vector count trailing zeros support.
++ (VCTZH): Likewise.
++ (VCTZW): Likewise.
++ (VCTZD): Likewise.
++ (VPRTYBD): Add vector parity support.
++ (VPRTYBQ): Likewise.
++ (VPRTYBW): Likewise.
++ (VCTZ): Add overloaded vector count trailing zeros support.
++ (VPRTYB): Add overloaded vector parity support.
++ * config/rs6000/rs6000-c.c (altivec_overloaded_builtins): Add
++ overloaded vector count trailing zeros and parity instructions.
++ * config/rs6000/rs6000.md (wd mode attribute): Add V1TI and TI for
++ vector parity support.
++ * config/rs6000/altivec.h (vec_vctz): Add ISA 3.0 vector count
++ trailing zeros support.
++ (vec_cntlz): Likewise.
++ (vec_vctzb): Likewise.
++ (vec_vctzd): Likewise.
++ (vec_vctzh): Likewise.
++ (vec_vctzw): Likewise.
++ (vec_vprtyb): Add ISA 3.0 vector parity support.
++ (vec_vprtybd): Likewise.
++ (vec_vprtybw): Likewise.
++ (vec_vprtybq): Likewise.
++ * doc/extend.texi (PowerPC AltiVec Built-in Functions): Document
++ the ISA 3.0 vector count trailing zeros and vector parity built-in
++ functions.
++
++ Back port from trunk
++ 2016-05-24 Michael Meissner <meissner@linux.vnet.ibm.com>
++
++ * config/rs6000/altivec.md (VNEG iterator): New iterator for
++ VNEGW/VNEGD instructions.
++ (p9_neg<mode>2): New insns for ISA 3.0 VNEGW/VNEGD.
++ (neg<mode>2): Add expander for V2DImode added in ISA 2.07, and
++ support for ISA 3.0 VNEGW/VNEGD instructions.
++
++ Back port from trunk
++ 2016-05-11 Michael Meissner <meissner@linux.vnet.ibm.com>
++
++ * config/rs6000/predicates.md (quad_memory_operand): Move most of
++ the code into quad_address_p and call it to share code with
++ vsx_quad_dform_memory_operand.
++ (vsx_quad_dform_memory_operand): New predicate for ISA 3.0 vector
++ d-form support.
++ * config/rs6000/rs6000.opt (-mlra): Switch to being an option mask
++ bit instead of being a separate word. Split -mpower9-dform into
++ two switches, -mpower9-dform-scalar and -mpower9-dform-vector.
++ * config/rs6000/rs6000.c (RELOAD_REG_QUAD_OFFSET): New addr_mask
++ for the register class supporting 128-bit quad word memory offsets.
++ (mode_supports_vsx_dform_quad): Helper function to return if the
++ register class uses quad word memory offsets.
++ (rs6000_debug_addr_mask): Add support for quad word memory offsets.
++ (rs6000_debug_reg_global): Always print if we are using LRA or not.
++ (rs6000_setup_reg_addr_masks): If ISA 3.0 vector d-form
++ instructions are enabled, set up the appropriate addr_masks for
++ 128-bit types.
++ (rs6000_init_hard_regno_mode_ok): wb constraint is now based on
++ -mpower9-dform-scalar, instead of -mpower9-dform.
++ (rs6000_option_override_internal): Split -mpower9-dform into two
++ switches, -mpower9-dform-scalar and -mpower9-dform-vector. The
++ -mpower9-dform switch sets or clears both. If we are not using
++ the LRA register allocator, do not enable -mpower9-dform-vector by
++ default. If we are using LRA, enable -mpower9-dform-vector and
++ -mvsx-timode if it is appropriate. Issue a warning if either
++ -mpower9-dform-vector or -mvsx-timode are explicitly used without
++ enabling LRA.
++ (quad_address_offset_p): New helper function to return if the
++ offset is legal for quad word memory instructions.
++ (quad_address_p): New function to determin if GPR or vector
++ register quad word memory addresses are legal.
++ (mem_operand_gpr): Validate quad word address offsets.
++ (reg_offset_addressing_ok_p): Add support for ISA 3.0 vector
++ d-form (register + offset) instructions.
++ (offsettable_ok_by_alignment): Likewise.
++ (rs6000_legitimate_offset_address_p): Likewise.
++ (legitimate_lo_sum_address_p): Likewise.
++ (rs6000_legitimize_address): Likewise.
++ (rs6000_legitimize_reload_address): Add more debug statements for
++ -mdebug=addr.
++ (rs6000_legitimate_address_p): Add support for ISA 3.0 vector
++ d-form instructions.
++ (rs6000_secondary_reload_memory): Add support for ISA 3.0 vector
++ d-form instructions. Distinguish different cases in debug
++ output. (rs6000_secondary_reload_inner): Add support for ISA 3.0 vector
++ d-form instructions.
++ (rs6000_preferred_reload_class): Likewise.
++ (rs6000_output_move_128bit): Add support for ISA 3.0 d-form
++ instructions. If ISA 3.0 is available, generate lxvx/stxvx instead
++ of the ISA 2.06 indexed memory instructions.
++ (rs6000_emit_prologue): If we have ISA 3.0 d-form instructions,
++ use them to save/restore the saved vector registers instead of
++ using Altivec instructions.
++ (rs6000_emit_epilogue): Likewise.
++ (rs6000_lra_p): Use TARGET_LRA instead of the old option word.
++ (rs6000_opt_masks): Split -mpower9-dform into
++ -mpower9-dform-scalar and -mpower9-dform-vector.
++ (rs6000_print_options_internal): Print -mno-<switch> if <switch>
++ was not selected.
++ * config/rs6000/vsx.md (p9_vecload_<mode>): Delete hack to emit
++ ISA 3.0 vector indexed memory instructions, and fold the code into
++ the normal mov<mode> patterns.
++ (p9_vecstore_<mode>): Likewise.
++ (vsx_mov<mode>): Add support for ISA 3.0 vector d-form
++ instructions.
++ (vsx_movti_64bit): Likewise.
++ (vsx_movti_32bit): Likewise.
++ * config/rs6000/constraints.md (wO constraint): New constraint for
++ ISA 3.0 vector d-form support.
++ * config/rs6000/rs6000-cpus.def (ISA_3_0_MASKS_SERVER): Use
++ -mpower9-dform-scalar instead of -mpower9-dform. Add note not to
++ include -mpower9-dform-vector until we switch over to LRA.
++ (POWERPC_MASKS): Add -mlra. Split -mpower9-dform into two.
++ switches, -mpower9-dform-scalar and -mpower9-dform-vector.
++ * config/rs6000/rs6000-protos.h (quad_address_p): Add declaration.
++ * doc/invoke.texi (RS/6000 and PowerPC Options): Add documentation
++ for -mpower9-dform and -mlra.
++ * doc/md.texi (wO constraint): Document wO constraint.
++
++2016-06-01 Eric Botcazou <ebotcazou@adacore.com>
++
++ * tree-vect-loop.c (vect_determine_vectorization_factor): Also compute
++ the factor for live Phi nodes.
++
++2016-06-01 Jakub Jelinek <jakub@redhat.com>
++
++ PR middle-end/71371
++ * gimplify.c (gimplify_omp_for): Temporarily clear gimplify_omp_ctxp
++ around creation of the temporary.
++
++2016-06-01 Eric Botcazou <ebotcazou@adacore.com>
++
++ * tree-vect-loop.c (vect_determine_vectorization_factor): Also take
++ into account live statements for mask producers.
++
++2016-05-31 Richard Biener <rguenther@suse.de>
++
++ Backport from mainline
++ 2016-05-11 Richard Biener <rguenther@suse.de>
++
++ PR debug/71057
++ * dwarf2out.c (retry_incomplete_types): Set early_dwarf.
++ (dwarf2out_finish): Move retry_incomplete_types call ...
++ (dwarf2out_early_finish): ... here.
++
++2016-05-31 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
++
++ PR target/71056
++ * config/arm/arm-builtins.c (arm_builtin_vectorized_function): Return
++ NULL_TREE early if NEON is not available. Remove now redundant check
++ in ARM_CHECK_BUILTIN_MODE.
++
++2016-05-31 Tom de Vries <tom@codesourcery.com>
++
++ backport:
++ 2016-05-31 Tom de Vries <tom@codesourcery.com>
++
++ PR tree-optimization/69068
++ * graphite-isl-ast-to-gimple.c (copy_bb_and_scalar_dependences): Handle
++ phis with more than two args.
++
++2016-05-30 Andreas Tobler <andreast@gcc.gnu.org>
++
++ Backport from mainline
++ 2016-05-30 Andreas Tobler <andreast@gcc.gnu.org>
++
++ * config.gcc: Move hard float support for arm*hf*-*-freebsd* into
++ armv6*-*-freebsd* for FreeBSD 11. Eliminate the arm*hf*-*-freebsd*
++ target.
++
++2016-05-30 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
++
++ Backport from mainline
++ 2016-04-29 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
++
++ * config/rs6000/altivec.h: Change definitions of vec_xl and
++ vec_xst.
++ * config/rs6000/rs6000-builtin.def (LD_ELEMREV_V2DF): New.
++ (LD_ELEMREV_V2DI): New.
++ (LD_ELEMREV_V4SF): New.
++ (LD_ELEMREV_V4SI): New.
++ (LD_ELEMREV_V8HI): New.
++ (LD_ELEMREV_V16QI): New.
++ (ST_ELEMREV_V2DF): New.
++ (ST_ELEMREV_V2DI): New.
++ (ST_ELEMREV_V4SF): New.
++ (ST_ELEMREV_V4SI): New.
++ (ST_ELEMREV_V8HI): New.
++ (ST_ELEMREV_V16QI): New.
++ (XL): New.
++ (XST): New.
++ * config/rs6000/rs6000-c.c (altivec_overloaded_builtins): Add
++ descriptions for VSX_BUILTIN_VEC_XL and VSX_BUILTIN_VEC_XST.
++ * config/rs6000/rs6000.c (rs6000_builtin_mask_calculate): Map from
++ TARGET_P9_VECTOR to RS6000_BTM_P9_VECTOR.
++ (altivec_expand_builtin): Add handling for
++ VSX_BUILTIN_ST_ELEMREV_<MODE> and VSX_BUILTIN_LD_ELEMREV_<MODE>.
++ (rs6000_invalid_builtin): Add error-checking for
++ RS6000_BTM_P9_VECTOR.
++ (altivec_init_builtins): Define builtins used to implement vec_xl
++ and vec_xst.
++ (rs6000_builtin_mask_names): Define power9-vector.
++ * config/rs6000/rs6000.h (MASK_P9_VECTOR): Define.
++ (RS6000_BTM_P9_VECTOR): Define.
++ (RS6000_BTM_COMMON): Include RS6000_BTM_P9_VECTOR.
++ * config/rs6000/vsx.md (vsx_ld_elemrev_v2di): New define_insn.
++ (vsx_ld_elemrev_v2df): Likewise.
++ (vsx_ld_elemrev_v4sf): Likewise.
++ (vsx_ld_elemrev_v4si): Likewise.
++ (vsx_ld_elemrev_v8hi): Likewise.
++ (vsx_ld_elemrev_v16qi): Likewise.
++ (vsx_st_elemrev_v2df): Likewise.
++ (vsx_st_elemrev_v2di): Likewise.
++ (vsx_st_elemrev_v4sf): Likewise.
++ (vsx_st_elemrev_v4si): Likewise.
++ (vsx_st_elemrev_v8hi): Likewise.
++ (vsx_st_elemrev_v16qi): Likewise.
++ * doc/extend.texi: Add prototypes for vec_xl and vec_xst. Correct
++ grammar.
++
++2016-05-30 Richard Biener <rguenther@suse.de>
++
++ Backport from mainline
++ 2016-05-11 Richard Biener <rguenther@suse.de>
++
++ PR middle-end/71002
++ * alias.c (reference_alias_ptr_type): Preserve alias-set zero
++ if the langhook insists on it.
++ * fold-const.c (make_bit_field_ref): Add arg for the original
++ reference and preserve its alias-set.
++ (decode_field_reference): Take exp by reference and adjust it
++ to the original memory reference.
++ (optimize_bit_field_compare): Adjust callers.
++ (fold_truth_andor_1): Likewise.
++
++ 2016-05-13 Jakub Jelinek <jakub@redhat.com>
++
++ PR bootstrap/71071
++ * fold-const.c (fold_checksum_tree): Allow modification
++ of TYPE_ALIAS_SET during folding.
++
++2016-05-30 Eric Botcazou <ebotcazou@adacore.com>
++
++ * config/visium/visium.c (visium_split_double_add): Minor tweaks.
++ (visium_expand_copysign): Use gen_int_mode directly.
++ (visium_compute_frame_size): Minor tweaks.
++
++2016-05-30 Tom de Vries <tom@codesourcery.com>
++
++ backport:
++ 2016-05-30 Tom de Vries <tom@codesourcery.com>
++
++ PR tree-optimization/69067
++ * graphite-isl-ast-to-gimple.c (get_def_bb_for_const): Remove assert.
++
++2016-05-27 Eric Botcazou <ebotcazou@adacore.com>
++
++ * config/visium/visium-protos.h (split_double_move): Rename into...
++ (visium_split_double_move): ...this.
++ (visium_split_double_add): Declare.
++ * config/visium/visium.c (split_double_move): Rename into...
++ (visium_split_double_move): ...this.
++ (visium_split_double_add): New function.
++ (visium_expand_copysign): Renumber operands for consistency.
++ * config/visium/visium.md (DImode move splitter): Adjust to renaming.
++ (DFmode move splitter): Likewise.
++ (*addi3_insn): Split by means of visium_split_double_add.
++ (*adddi3_insn_flags): Delete.
++ (*plus_plus_sltu<subst_arith>): New insn.
++ (*subdi3_insn): Split by means of visium_split_double_add.
++ (subdi3_insn_flags): Delete.
++ (*minus_minus_sltu<subst_arith>): New insn.
++ (*negdi2_insn): Split by means of visium_split_double_add.
++ (*negdi2_insn_flags): Delete.
++
++2016-05-27 Ilya Enkovich <ilya.enkovich@intel.com>
++
++ Backport from mainline r236810.
++ 2016-05-27 Ilya Enkovich <ilya.enkovich@intel.com>
++
++ PR middle-end/71279
++ * fold-const.c (fold_ternary_loc): Don't fold VEC_COND_EXPR
++ into comparison.
++
++2016-05-25 Eric Botcazou <ebotcazou@adacore.com>
++
++ * tree-ssa-phiopt.c (factor_out_conditional_conversion): Remove
++ redundant test and bail out if the type of the new operand is not
++ a GIMPLE register type after stripping a VIEW_CONVERT_EXPR.
++
++2016-05-24 Martin Sebor <msebor@redhat.com>
++
++ PR c++/71147
++ * tree.h (complete_or_array_type_p): New inline function.
++
++2016-05-24 Jakub Jelinek <jakub@redhat.com>
++
++ * config/i386/i386.h (TARGET_AVOID_4BYTE_PREFIXES): Define.
++ * config/i386/constraints.md (Yr): Test TARGET_AVOID_4BYTE_PREFIXES
++ rather than X86_TUNE_AVOID_4BYTE_PREFIXES. Use SSE_REGS instead
++ of ALL_SSE_REGS. Return SSE_REGS also when TARGET_AVX.
++
++2016-05-24 Jakub Jelinek <jakub@redhat.com>
++
++ PR c++/71257
++ * tree-vect-stmts.c (vectorizable_simd_clone_call): Handle
++ SIMD_CLONE_ARG_TYPE_LINEAR_REF_CONSTANT_STEP like
++ SIMD_CLONE_ARG_TYPE_LINEAR_CONSTANT_STEP. Add
++ SIMD_CLONE_ARG_TYPE_LINEAR_VAL_CONSTANT_STEP and
++ SIMD_CLONE_ARG_TYPE_LINEAR_UVAL_CONSTANT_STEP cases explicitly.
++
++2016-05-23 Martin Jambor <mjambor@suse.cz>
++
++ * hsa-gen.c (gen_hsa_insns_for_switch_stmt): Create an empty
++ default block if a PHI node in the original one would be resized.
++
++2016-05-23 Martin Jambor <mjambor@suse.cz>
++
++ PR tree-optimization/70884
++ * tree-sra.c (initialize_constant_pool_replacements): Do not check
++ should_scalarize_away_bitmap and cannot_scalarize_away_bitmap bits.
++ (sort_and_splice_var_accesses): Do not consider multiple scalar reads
++ of constant pool data as a reason for scalarization.
++
++2016-05-20 Eric Botcazou <ebotcazou@adacore.com>
++
++ * config/arm/arm.c (arm_expand_prologue): Set the stack usage to 0
++ for naked functions.
++ (thumb1_expand_prologue): Likewise.
++
++2016-05-20 Jakub Jelinek <jakub@redhat.com>
++
++ PR c++/71210
++ * gimple-fold.c (gimple_fold_call): Do not remove lhs of noreturn
++ calls if the LHS is variable length or has addressable type.
++ If targets[0]->decl is a noreturn call with void return type and
++ zero arguments, adjust fntype and remove lhs in that case.
++
++2016-05-20 Uros Bizjak <ubizjak@gmail.com>
++
++ * sched-deps.c (sched_analyze_2) <case TRAP_IF>: Also
++ force pending loads from memory.
++
++2016-05-19 Marek Polacek <polacek@redhat.com>
++
++ Backport from mainline
++ 2016-05-19 Marek Polacek <polacek@redhat.com>
++
++ PR tree-optimization/71031
++ * tree-vrp.c (extract_range_from_binary_expr_1): Turn assert into a
++ condition and adjust the code a bit.
++
++2016-05-19 Martin Jambor <mjambor@suse.cz>
++
++ PR ipa/70646
++ * ipa-prop.c (determine_locally_known_aggregate_parts): Bail out early
++ if parameter PARAM_IPA_MAX_AGG_ITEMS is zero.
++
++2016-05-19 Martin Jambor <mjambor@suse.cz>
++
++ PR ipa/70646
++ * ipa-inline.h (condition): New field size.
++ * ipa-inline-analysis.c (add_condition): New parameter SIZE, use it
++ for comaprison and store it into the new condition.
++ (evaluate_conditions_for_known_args): Use condition size to check
++ access sizes for all but CHANGED conditions.
++ (unmodified_parm_1): New parameter size_p, store access size into it.
++ (unmodified_parm): Likewise.
++ (unmodified_parm_or_parm_agg_item): Likewise.
++ (eliminated_by_inlining_prob): Pass NULL to unmodified_parm as size_p.
++ (set_cond_stmt_execution_predicate): Extract access sizes and store
++ them to conditions.
++ (set_switch_stmt_execution_predicate): Likewise.
++ (will_be_nonconstant_expr_predicate): Likewise.
++ (will_be_nonconstant_predicate): Likewise.
++ (inline_read_section): Stream condition size.
++ (inline_write_summary): Likewise.
++ * lto-streamer.h (LTO_minor_version): Bump.
++
++2016-05-18 Martin Liska <mliska@suse.cz>
++
++ Backport from mainline
++ 2016-05-18 Martin Liska <mliska@suse.cz>
++
++ PR fortran/70856
++ * ipa-icf.c (sem_variable::merge): Set DECL_PT_UID for
++ merged variables.
++
++2016-05-18 Jakub Jelinek <jakub@redhat.com>
++
++ PR c++/71100
++ * cgraph.c (cgraph_edge::redirect_call_stmt_to_callee): Don't drop
++ lhs if it has TREE_ADDRESSABLE type.
++
++2016-05-18 Uros Bizjak <ubizjak@gmail.com>
++
++ PR target/71145
++ * config/alpha/alpha.md (trap): Add (use (reg:DI 29)).
++ (*exception_receiver_1): Return "#" for TARGET_EXPLICIT_RELOCS.
++
++2016-05-17 Thomas Schwinge <thomas@codesourcery.com>
++
++ Backport trunk r235748:
++ PR target/70860
++ * config/nvptx/nvptx.c (nvptx_libcall_value): Handle NULL cfun.
++ (nvptx_function_value): Assert non-NULL cfun.
++
++2016-05-17 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
++
++ Backport from mainline
++ 2016-05-17 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
++
++ PR target/70809
++ * config/aarch64/aarch64-simd.md (aarch64_vmls<mode>): Delete.
++
++2016-05-16 Martin Jambor <mjambor@suse.cz>
++
++ * hsa-gen.c (fillup_for_decl): Increase alignment to natural one.
++ (get_symbol_for_decl): Sorry if a global symbol in under-aligned.
++
++2016-05-16 Martin Jambor <mjambor@suse.cz>
++
++ PR hsa/70857
++ * omp-low.c (grid_expand_target_grid_body): Copy RESULT_DECL of
++ the outlined kernel function.
++
++2016-05-16 James Norris <jnorris@codesourcery.com>
++
++ Backport from mainline r236098.
++ 2016-05-10 James Norris <jnorris@codesourcery.com>
++
++ PR driver/68463
++ * config/rs6000/sysv4.h (CRTOFFLOADBEGIN): Define. Add crtoffloadbegin.o
++ if offloading is enabled and -fopenacc or -fopenmp is specified.
++ (CRTOFFLOADEND): Likewise.
++ (STARTFILE_LINUX_SPEC): Add CRTOFFLOADBEGIN.
++ (ENDFILE_LINUX_SPEC): Add CRTOFFLOADEND.
++
++2016-05-16 Alan Modra <amodra@gmail.com>
++
++ Apply from mainline
++ 2016-05-10 Alan Modra <amodra@gmail.com>
++ PR target/70947
++ * config/rs6000/rs6000.c (rs6000_expand_split_stack_prologue): Stop
++ regrename modifying insns saving lr before __morestack call.
++ * config/rs6000/rs6000.md (split_stack_return): Similarly for
++ insns restoring lr after __morestack call.
++
++2016-05-13 Richard Biener <rguenther@suse.de>
++
++ Backport from mainline
++ 2016-04-27 Richard Biener <rguenther@suse.de>
++
++ PR ipa/70760
++ * tree-ssa-structalias.c (find_func_aliases_for_call): Use
++ aggregate_value_p to determine if a function result is
++ returned by reference.
++
++ 2016-05-06 Richard Biener <rguenther@suse.de>
++
++ PR middle-end/70931
++ * dwarf2out.c (native_encode_initializer): Skip zero-sized fields.
++
++ 2016-05-06 Richard Biener <rguenther@suse.de>
++
++ PR middle-end/70941
++ * fold-const.c (split_tree): Always convert to the original type
++ before negating.
++
++2016-05-12 Martin Liska <mliska@suse.cz>
++
++ Backport from mainline
++ 2016-05-10 Martin Liska <mliska@suse.cz>
++
++ * tree-inline.c (remap_dependence_clique): Do not remap
++ debugging statements.
++
++2016-05-12 Ilya Enkovich <ilya.enkovich@intel.com>
++
++ Backport from mainline r236171.
++ 2016-05-12 Ilya Enkovich <ilya.enkovich@intel.com>
++
++ PR tree-optimization/71006
++ * tree-vect-loop.c (vect_determine_vectorization_factor): Don't
++ consider COND_EXPR as a mask producer.
++
++2016-05-12 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
++
++ Backport from mainline
++ 2016-05-12 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
++
++ PR target/70830
++ * config/arm/arm.c (arm_output_multireg_pop): Avoid POP instruction
++ when popping the PC and within an interrupt handler routine.
++ Add missing tab to output of "ldmfd".
++ (output_return_instruction): Output LDMFD with SP update rather
++ than POP when returning from interrupt handler.
++
++2016-05-11 Ilya Enkovich <ilya.enkovich@intel.com>
++
++ Backport from mainline r236088.
++ 2016-05-10 Ilya Enkovich <ilya.enkovich@intel.com>
++
++ PR middle-end/70877
++ * tree-chkp.c (chkp_add_bounds_to_call_stmt): Handle
++ calls with type casted fndecl.
++
++2016-05-11 Ilya Enkovich <ilya.enkovich@intel.com>
++
++ Backport from mainline r236086.
++ 2016-05-10 Ilya Enkovich <ilya.enkovich@intel.com>
++
++ PR tree-optimization/70876
++ * tree-chkp.c (chkp_find_bounds_1): Support WITH_SIZE_EXPR.
++ * gcc/calls.c (initialize_argument_information): Bind bounds
++ with corresponding args passed by reference.
++
++2016-05-10 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
++
++ Backport from mainline
++ 2016-05-10 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
++
++ PR target/70963
++ * config/rs6000/vsx.md (vsx_xvcvdpsxds_scale): Generate correct
++ code for a zero scale factor.
++ (vsx_xvcvdpuxds_scale): Likewise.
++
++2016-05-10 Jakub Jelinek <jakub@redhat.com>
++
++ Backported from mainline
++ 2016-05-03 Jakub Jelinek <jakub@redhat.com>
++
++ PR tree-optimization/70916
++ * tree-vect-patterns.c (vect_recog_mask_conversion_pattern): Give up
++ if COND_EXPR rhs1 is neither SSA_NAME nor COMPARISON_CLASS_P.
++
++2016-05-10 Yuri Rumyantsev <ysrumyan@gmail.com>
++
++ Backport from mainline r235962.
++ 2016-05-06 Yuri Rumyantsev <ysrumyan@gmail.com>
++
++ PR debug/70935
++ * tree-ssa-loop-unswitch.c (find_loop_guard): Reject guard edge with
++ loop latch destination.
++
++2016-05-10 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
++
++ Backport from mainline
++ 2016-05-10 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
++
++ * config/s390/s390.md ("*vec_cmp<insn_cmp>df_cconly")
++ ("*fixuns_truncdfdi2_z13")
++ ("*fixuns_trunc<FP:mode><GPR:mode>2_z196")
++ ("*fix_truncdfdi2_bfp_z13", "*floatunsdidf2_z13")
++ ("*extendsfdf2_z13"): Replace TARGET_Z13 with TARGET_VX.
++
++2016-05-10 Sebastian Huber <sebastian.huber@embedded-brains.de>
++
++ Backport from mainline
++ 2016-04-27 Sebastian Huber <sebastian.huber@embedded-brains.de>
++
++ * config/rtems.h (LIB_SPEC): Add -latomic.
++
++2016-05-10 Sebastian Huber <sebastian.huber@embedded-brains.de>
++
++ Backport from mainline
++ 2016-04-27 Joel Sherrill <joel@rtems.org>
++
++ * config/microblaze/rtems.h: Redefine LINK_SPEC to avoid
++ xilink.ld and flags not relevant to RTEMS.
++
++2016-05-09 Uros Bizjak <ubizjak@gmail.com>
++
++ * config/i386/i386.md (absneg splitters with general regs): Use
++ general_reg_operand predicate.
++ (btsq peephole2): Use x86_64_immediate_operand to check if new
++ value is suitable for immediate operand. Generate emitted insn
++ using RTL expressions.
++ (btcq peephole2): Ditto.
++ (btrq peephole2): Ditto. Generate correct immediate operand
++ for AND masking.
++
++2016-05-07 Tom de Vries <tom@codesourcery.com>
++
++ backport:
++ 2016-05-07 Tom de Vries <tom@codesourcery.com>
++
++ PR tree-optimization/70956
++ * graphite-scop-detection.c (build_cross_bb_scalars_def): Handle NULL
++ def.
++
++2016-05-06 Marek Polacek <polacek@redhat.com>
++
++ Backported from mainline
++ 2016-05-06 Marek Polacek <polacek@redhat.com>
++
++ PR sanitizer/70875
++ * ubsan.c (get_ubsan_type_info_for_type): Remove assert.
++
++2016-05-06 Marek Polacek <polacek@redhat.com>
++
++ Backported from mainline
++ 2016-04-29 Marek Polacek <polacek@redhat.com>
++ Jakub Jelinek <jakub@redhat.com>
++
++ PR sanitizer/70342
++ * fold-const.c (tree_single_nonzero_warnv_p): For TARGET_EXPR, use
++ TARGET_EXPR_SLOT as a base.
++
++2016-05-04 Eric Botcazou <ebotcazou@adacore.com>
++
++ * tree-ssa-coalesce.c (gimple_can_coalesce_p): Fix reference in head
++ comment.
++ (compute_samebase_partition_bases): Fix typo.
++
++2016-05-03 Pierre-Marie de Rodat <derodat@adacore.com>
++
++ * dwarf2out.c (resolve_args_picking_1): Replace the frame_offset
++ occurence with frame_offset_ ones.
++
++2016-04-28 Jakub Jelinek <jakub@redhat.com>
++
++ PR target/70858
++ * config/i386/i386.c (bdesc_special_args): Add | OPTION_MASK_ISA_64BIT
++ to __builtin_ia32_lwpval64 and __builtin_ia32_lwpins64.
++ (bdesc_args): Add | OPTION_MASK_ISA_64BIT to __builtin_ia32_bextr_u64,
++ __builtin_ia32_bextri_u64, __builtin_ia32_bzhi_di,
++ __builtin_ia32_pdep_di and __builtin_ia32_pext_di.
++
++2016-04-28 Eric Botcazou <ebotcazou@adacore.com>
++
++ Backport from mainline
++ 2016-04-27 Eric Botcazou <ebotcazou@adacore.com>
++
++ PR ada/70759
++ * stor-layout.h (internal_reference_types): Delete.
++ * stor-layout.c (reference_types_internal): Likewise.
++ (internal_reference_types): Likewise.
++ (layout_type) <REFERENCE_TYPE>: Adjust.
++
++2016-04-27 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
++
++ Backport from mainline
++ 2016-04-25 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
++
++ * config/rs6000/rs6000-builtin.def: Correct pasto error for
++ stxvd2x and stxvw4x built-in functions.
++
++2016-04-27 H.J. Lu <hongjiu.lu@intel.com>
++
++ Backported from mainline
++ 2016-04-21 H.J. Lu <hongjiu.lu@intel.com>
++
++ PR target/70750
++ * config/i386/predicates.md (call_insn_operand): Replace
++ sibcall_memory_operand with memory_operand.
++
++2016-04-27 Richard Biener <rguenther@suse.de>
++
++ PR ipa/70785
++ * tree-ssa-structalias.c (refered_from_nonlocal_fn): New
++ function cummulating used_from_other_partition, externally_visible
++ and force_output from aliases.
++ (refered_from_nonlocal_var): Likewise.
++ (ipa_pta_execute): Use call_for_symbol_and_aliases to cummulate
++ node flags properly.
++
++2016-04-27 Jakub Jelinek <jakub@redhat.com>
++
++ Backported from mainline
++ 2016-04-23 Jakub Jelinek <jakub@redhat.com>
++
++ PR sanitizer/70712
++ * cfgexpand.c (expand_stack_vars): Fix typo.
++
++ 2016-04-19 Jakub Jelinek <jakub@redhat.com>
++
++ PR middle-end/70680
++ * gimplify.c (gimplify_omp_for): Call omp_notice_variable for
++ implicitly linear or lastprivate iterator on the outer context.
++
++2016-04-27 Kirill Yukhin <kirill.yukhin@intel.com>
++
++ PR target/70728
++ * gcc/config/i386/sse.md (define_insn "<shift_insn><mode>3<mask_name>"):
++ Extract AVX-512BW constraint from AVX.
++
++2016-04-27 Jakub Jelinek <jakub@redhat.com>
++
++ * BASE-VER: Set to 6.1.1.
++
+ 2016-04-27 Release Manager
+
+ * GCC 6.1.0 released.
+@@ -49,7 +2066,7 @@
+ constant boolean.
+
+ 2016-04-20 Andrew Pinski <apinski@cavium.com>
+- Kyrylo Tkachov <kyrylo.tkachov@arm.com>
++ Kyrylo Tkachov <kyrylo.tkachov@arm.com>
+
+ PR target/64971
+ * config/aarch64/aarch64.md (sibcall): Force call
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/DATESTAMP gcc-6-20160721/gcc/DATESTAMP
+--- gcc-6.1.0/gcc/DATESTAMP 2016-04-27 00:16:13.000000000 +0000
++++ gcc-6-20160721/gcc/DATESTAMP 2016-07-21 00:16:15.000000000 +0000
+@@ -1 +1 @@
+-20160427
++20160721
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/ada/ChangeLog gcc-6-20160721/gcc/ada/ChangeLog
+--- gcc-6.1.0/gcc/ada/ChangeLog 2016-04-27 08:20:21.000000000 +0000
++++ gcc-6-20160721/gcc/ada/ChangeLog 2016-06-13 08:02:10.000000000 +0000
+@@ -1,3 +1,96 @@
++2016-06-13 Eric Botcazou <ebotcazou@adacore.com>
++
++ * gcc-interface/decl.c (gnat_to_gnu_entity) <E_Variable>: Deal with
++ PLUS_EXPR in the expression of a renaming.
++
++2016-06-11 Eric Botcazou <ebotcazou@adacore.com>
++
++ * gcc-interface/trans.c (Case_Statement_to_gnu): Deal with characters.
++
++2016-06-11 Pierre-Marie de Rodat <derodat@adacore.com>
++
++ * gcc-interface/decl.c (gnat_to_gnu_entity): Do not clobber
++ gnat_entity_name with temporary names for XUP and XUT types.
++
++2016-06-06 Eric Botcazou <ebotcazou@adacore.com>
++
++ * gcc-interface/utils.c (gnat_internal_attribute_table): Add support
++ for noinline and noclone attributes.
++ (handle_noinline_attribute): New handler.
++ (handle_noclone_attribute): Likewise.
++
++2016-06-06 Eric Botcazou <ebotcazou@adacore.com>
++
++ * gcc-interface/utils2.c (build_call_alloc_dealloc): Do not substitute
++ placeholder expressions here but...
++ * gcc-interface/trans.c (gnat_to_gnu) <N_Free_Statement>: ...here.
++ Make an exception to the protection of a CALL_EXPR result with an
++ unconstrained type only in the same cases as Call_to_gnu.
++
++2016-06-01 Simon Wright <simon@pushface.org>
++
++ PR ada/71358
++ * g-comlin.adb (Display_Section_Help): Do not dereference
++ Config.Switches if it's null.
++ (Getopt): Likewise.
++
++2016-05-31 Eric Botcazou <ebotcazou@adacore.com>
++
++ * s-osinte-kfreebsd-gnu.ads (clock_getres): Define.
++ (Get_Page_Size): Remove duplicate and return int.
++
++2016-05-31 Jan Sommer <soja-lists@aries.uberspace.de>
++
++ PR ada/71317
++ * s-osinte-rtems.ads (clock_getres): Define.
++ (Get_Page_Size): Remove duplicate and return int.
++
++2016-05-06 Eric Botcazou <ebotcazou@adacore.com>
++
++ PR ada/70969
++ * system-darwin-ppc64.ads: Add pragma No_Elaboration_Code_All.
++ * system-linux-armeb.ads: Likewise.
++ * system-linux-mips64el.ads: Likewise.
++ * system-linux-mips.ads: Likewise.
++ * system-linux-mipsel.ads: Likewise.
++ * system-linux-ppc64.ads: Likewise.
++ * system-linux-sparcv9.ads: Likewise.
++ * system-rtems.ads: Likewise.
++
++2016-05-04 Samuel Thibault <samuel.thibault@ens-lyon.org>
++
++ * s-osinte-gnu.ads (Get_Page_Size): Return int and use getpagesize
++ instead of __getpagesize.
++
++2016-04-28 Eric Botcazou <ebotcazou@adacore.com>
++
++ PR ada/70900
++ Backport from mainline
++ 2016-04-18 Ed Schonberg <schonberg@adacore.com>
++
++ * sem_ch6.adb (Process_Formals): Do not set a delay freeze on
++ a subprogram that returns a class-wide type, if the subprogram
++ is a compilation unit, because otherwise gigi will treat the
++ subprogram as external, leading to link errors.
++
++2016-05-02 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
++
++ * gcc-interface/Makefile.in (install-gcc-specs): Use foreach.
++ Honor DESTDIR.
++
++2016-04-28 Eric Botcazou <ebotcazou@adacore.com>
++
++ PR ada/70786
++ * a-textio.adb (Get_Immediate): Add missing 'not' in expression.
++
++2016-04-28 Eric Botcazou <ebotcazou@adacore.com>
++
++ Backport from mainline
++ 2016-04-27 Eric Botcazou <ebotcazou@adacore.com>
++
++ * gcc-interface/misc.c (gnat_init): Do not call
++ internal_reference_types.
++
+ 2016-04-27 Release Manager
+
+ * GCC 6.1.0 released.
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/ada/a-textio.adb gcc-6-20160721/gcc/ada/a-textio.adb
+--- gcc-6.1.0/gcc/ada/a-textio.adb 2015-10-16 12:43:21.000000000 +0000
++++ gcc-6-20160721/gcc/ada/a-textio.adb 2016-04-28 10:58:54.000000000 +0000
+@@ -668,7 +668,7 @@
+ Available := True;
+
+ Item :=
+- (if Is_Start_Of_Encoding (Character'Val (ch), File.WC_Method)
++ (if not Is_Start_Of_Encoding (Character'Val (ch), File.WC_Method)
+ then Character'Val (ch)
+ else Get_Upper_Half_Char_Immed (Character'Val (ch), File));
+ end if;
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/ada/g-comlin.adb gcc-6-20160721/gcc/ada/g-comlin.adb
+--- gcc-6.1.0/gcc/ada/g-comlin.adb 2015-11-18 10:31:53.000000000 +0000
++++ gcc-6-20160721/gcc/ada/g-comlin.adb 2016-06-01 07:44:10.000000000 +0000
+@@ -6,7 +6,7 @@
+ -- --
+ -- B o d y --
+ -- --
+--- Copyright (C) 1999-2015, Free Software Foundation, Inc. --
++-- Copyright (C) 1999-2016, Free Software Foundation, Inc. --
+ -- --
+ -- GNAT is free software; you can redistribute it and/or modify it under --
+ -- terms of the GNU General Public License as published by the Free Soft- --
+@@ -3151,16 +3151,18 @@
+
+ New_Line;
+
+- if Section /= "" then
++ if Section /= "" and then Config.Switches /= null then
+ Put_Line ("Switches after " & Section);
+ end if;
+
+ -- Compute size of the switches column
+
+- for S in Config.Switches'Range loop
+- Max_Len := Natural'Max
+- (Max_Len, Switch_Name (Config.Switches (S), Section)'Length);
+- end loop;
++ if Config.Switches /= null then
++ for S in Config.Switches'Range loop
++ Max_Len := Natural'Max
++ (Max_Len, Switch_Name (Config.Switches (S), Section)'Length);
++ end loop;
++ end if;
+
+ if Config.Aliases /= null then
+ for A in Config.Aliases'Range loop
+@@ -3173,25 +3175,27 @@
+
+ -- Display the switches
+
+- for S in Config.Switches'Range loop
+- declare
+- N : constant String :=
+- Switch_Name (Config.Switches (S), Section);
++ if Config.Switches /= null then
++ for S in Config.Switches'Range loop
++ declare
++ N : constant String :=
++ Switch_Name (Config.Switches (S), Section);
+
+- begin
+- if N /= "" then
+- Put (" ");
+- Put (N);
+- Put ((1 .. Max_Len - N'Length + 1 => ' '));
++ begin
++ if N /= "" then
++ Put (" ");
++ Put (N);
++ Put ((1 .. Max_Len - N'Length + 1 => ' '));
+
+- if Config.Switches (S).Help /= null then
+- Put (Config.Switches (S).Help.all);
+- end if;
++ if Config.Switches (S).Help /= null then
++ Put (Config.Switches (S).Help.all);
++ end if;
+
+- New_Line;
+- end if;
+- end;
+- end loop;
++ New_Line;
++ end if;
++ end;
++ end loop;
++ end if;
+
+ -- Display the aliases
+
+@@ -3454,25 +3458,27 @@
+
+ -- Initialize output values for automatically handled switches
+
+- for S in Config.Switches'Range loop
+- case Config.Switches (S).Typ is
+- when Switch_Untyped =>
+- null; -- Nothing to do
+-
+- when Switch_Boolean =>
+- Config.Switches (S).Boolean_Output.all :=
+- not Config.Switches (S).Boolean_Value;
+-
+- when Switch_Integer =>
+- Config.Switches (S).Integer_Output.all :=
+- Config.Switches (S).Integer_Initial;
+-
+- when Switch_String =>
+- if Config.Switches (S).String_Output.all = null then
+- Config.Switches (S).String_Output.all := new String'("");
+- end if;
+- end case;
+- end loop;
++ if Config.Switches /= null then
++ for S in Config.Switches'Range loop
++ case Config.Switches (S).Typ is
++ when Switch_Untyped =>
++ null; -- Nothing to do
++
++ when Switch_Boolean =>
++ Config.Switches (S).Boolean_Output.all :=
++ not Config.Switches (S).Boolean_Value;
++
++ when Switch_Integer =>
++ Config.Switches (S).Integer_Output.all :=
++ Config.Switches (S).Integer_Initial;
++
++ when Switch_String =>
++ if Config.Switches (S).String_Output.all = null then
++ Config.Switches (S).String_Output.all := new String'("");
++ end if;
++ end case;
++ end loop;
++ end if;
+
+ -- For all sections, and all switches within those sections
+
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/ada/gcc-interface/Makefile.in gcc-6-20160721/gcc/ada/gcc-interface/Makefile.in
+--- gcc-6.1.0/gcc/ada/gcc-interface/Makefile.in 2016-04-27 07:39:18.000000000 +0000
++++ gcc-6-20160721/gcc/ada/gcc-interface/Makefile.in 2016-05-02 13:16:33.000000000 +0000
+@@ -2670,10 +2670,9 @@
+ install-gcc-specs:
+ # Install all the requested GCC spec files.
+
+- for f in $(GCC_SPEC_FILES); do \
+- $(INSTALL_DATA_DATE) $(srcdir)/ada/$$f \
+- $(libsubdir)/$$(echo $$f|sed -e 's#_[a-zA-Z0-9]*##g'); \
+- done
++ $(foreach f,$(GCC_SPEC_FILES), \
++ $(INSTALL_DATA_DATE) $(srcdir)/ada/$(f) \
++ $(DESTDIR)$(libsubdir)/$$(echo $(f)|sed -e 's#_[a-zA-Z0-9]*##g');)
+
+ install-gnatlib: ../stamp-gnatlib-$(RTSDIR) install-gcc-specs
+ $(RMDIR) $(DESTDIR)$(ADA_RTL_OBJ_DIR)
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/ada/gcc-interface/decl.c gcc-6-20160721/gcc/ada/gcc-interface/decl.c
+--- gcc-6.1.0/gcc/ada/gcc-interface/decl.c 2016-04-02 08:56:19.000000000 +0000
++++ gcc-6-20160721/gcc/ada/gcc-interface/decl.c 2016-06-13 08:02:10.000000000 +0000
+@@ -966,6 +966,7 @@
+ && !call_is_atomic_load (inner))
+ || TREE_CODE (inner) == ADDR_EXPR
+ || TREE_CODE (inner) == NULL_EXPR
++ || TREE_CODE (inner) == PLUS_EXPR
+ || TREE_CODE (inner) == CONSTRUCTOR
+ || CONSTANT_CLASS_P (inner)
+ /* We need to detect the case where a temporary is created to
+@@ -2321,10 +2322,12 @@
+ gnat_name = Packed_Array_Impl_Type (gnat_entity);
+ else
+ gnat_name = gnat_entity;
+- if (gnat_encodings != DWARF_GNAT_ENCODINGS_MINIMAL)
+- gnu_entity_name = create_concat_name (gnat_name, "XUP");
+- create_type_decl (gnu_entity_name, gnu_fat_type, artificial_p,
+- debug_info_p, gnat_entity);
++ tree xup_name
++ = (gnat_encodings == DWARF_GNAT_ENCODINGS_MINIMAL)
++ ? get_entity_name (gnat_name)
++ : create_concat_name (gnat_name, "XUP");
++ create_type_decl (xup_name, gnu_fat_type, artificial_p, debug_info_p,
++ gnat_entity);
+
+ /* Create the type to be designated by thin pointers: a record type for
+ the array and its template. We used to shift the fields to have the
+@@ -2334,11 +2337,11 @@
+ Note that GDB can handle standard DWARF information for them, so we
+ don't have to name them as a GNAT encoding, except if specifically
+ asked to. */
+- if (gnat_encodings != DWARF_GNAT_ENCODINGS_MINIMAL)
+- gnu_entity_name = create_concat_name (gnat_name, "XUT");
+- else
+- gnu_entity_name = get_entity_name (gnat_name);
+- tem = build_unc_object_type (gnu_template_type, tem, gnu_entity_name,
++ tree xut_name
++ = (gnat_encodings == DWARF_GNAT_ENCODINGS_MINIMAL)
++ ? get_entity_name (gnat_name)
++ : create_concat_name (gnat_name, "XUT");
++ tem = build_unc_object_type (gnu_template_type, tem, xut_name,
+ debug_info_p);
+
+ SET_TYPE_UNCONSTRAINED_ARRAY (tem, gnu_type);
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/ada/gcc-interface/misc.c gcc-6-20160721/gcc/ada/gcc-interface/misc.c
+--- gcc-6.1.0/gcc/ada/gcc-interface/misc.c 2016-02-16 18:01:04.000000000 +0000
++++ gcc-6-20160721/gcc/ada/gcc-interface/misc.c 2016-04-28 10:49:13.000000000 +0000
+@@ -369,9 +369,6 @@
+ sbitsize_one_node = sbitsize_int (1);
+ sbitsize_unit_node = sbitsize_int (BITS_PER_UNIT);
+
+- /* Show that REFERENCE_TYPEs are internal and should be Pmode. */
+- internal_reference_types ();
+-
+ /* Register our internal error function. */
+ global_dc->internal_error = &internal_error_function;
+
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/ada/gcc-interface/trans.c gcc-6-20160721/gcc/ada/gcc-interface/trans.c
+--- gcc-6.1.0/gcc/ada/gcc-interface/trans.c 2016-03-07 08:46:52.000000000 +0000
++++ gcc-6-20160721/gcc/ada/gcc-interface/trans.c 2016-06-11 11:55:51.000000000 +0000
+@@ -2483,13 +2483,15 @@
+ static tree
+ Case_Statement_to_gnu (Node_Id gnat_node)
+ {
+- tree gnu_result, gnu_expr, gnu_label;
++ tree gnu_result, gnu_expr, gnu_type, gnu_label;
+ Node_Id gnat_when;
+ location_t end_locus;
+ bool may_fallthru = false;
+
+ gnu_expr = gnat_to_gnu (Expression (gnat_node));
+ gnu_expr = convert (get_base_type (TREE_TYPE (gnu_expr)), gnu_expr);
++ gnu_expr = maybe_character_value (gnu_expr);
++ gnu_type = TREE_TYPE (gnu_expr);
+
+ /* We build a SWITCH_EXPR that contains the code with interspersed
+ CASE_LABEL_EXPRs for each label. */
+@@ -2559,6 +2561,11 @@
+ gcc_assert (!gnu_low || TREE_CODE (gnu_low) == INTEGER_CST);
+ gcc_assert (!gnu_high || TREE_CODE (gnu_high) == INTEGER_CST);
+
++ if (gnu_low && TREE_TYPE (gnu_low) != gnu_type)
++ gnu_low = convert (gnu_type, gnu_low);
++ if (gnu_high && TREE_TYPE (gnu_high) != gnu_type)
++ gnu_high = convert (gnu_type, gnu_high);
++
+ add_stmt_with_node (build_case_label (gnu_low, gnu_high, label),
+ gnat_choice);
+ choices_added_p = true;
+@@ -2590,8 +2597,8 @@
+ /* Now emit a definition of the label the cases branch to, if any. */
+ if (may_fallthru)
+ add_stmt (build1 (LABEL_EXPR, void_type_node, gnu_label));
+- gnu_result = build3 (SWITCH_EXPR, TREE_TYPE (gnu_expr), gnu_expr,
+- end_stmt_group (), NULL_TREE);
++ gnu_result
++ = build3 (SWITCH_EXPR, gnu_type, gnu_expr, end_stmt_group (), NULL_TREE);
+
+ return gnu_result;
+ }
+@@ -7635,10 +7642,11 @@
+ else
+ gnu_actual_obj_type = gnu_obj_type;
+
++ tree gnu_size = TYPE_SIZE_UNIT (gnu_actual_obj_type);
++ gnu_size = SUBSTITUTE_PLACEHOLDER_IN_EXPR (gnu_size, gnu_ptr);
++
+ gnu_result
+- = build_call_alloc_dealloc (gnu_ptr,
+- TYPE_SIZE_UNIT (gnu_actual_obj_type),
+- gnu_obj_type,
++ = build_call_alloc_dealloc (gnu_ptr, gnu_size, gnu_obj_type,
+ Procedure_To_Call (gnat_node),
+ Storage_Pool (gnat_node),
+ gnat_node);
+@@ -7719,16 +7727,22 @@
+ N_Raise_Constraint_Error));
+ }
+
+- /* If the result has side-effects and is of an unconstrained type, make a
+- SAVE_EXPR so that we can be sure it will only be referenced once. But
+- this is useless for a call to a function that returns an unconstrained
+- type with default discriminant, as we cannot compute the size of the
+- actual returned object. We must do this before any conversions. */
++ /* If the result has side-effects and is of an unconstrained type, protect
++ the expression in case it will be referenced multiple times, i.e. for
++ its value and to compute the size of an object. But do it neither for
++ an object nor a renaming declaration, nor a return statement of a call
++ to a function that returns an unconstrained record type with default
++ discriminant, because there is no size to be computed in these cases
++ and this will create a useless temporary. We must do this before any
++ conversions. */
+ if (TREE_SIDE_EFFECTS (gnu_result)
+- && !(TREE_CODE (gnu_result) == CALL_EXPR
+- && type_is_padding_self_referential (TREE_TYPE (gnu_result)))
+ && (TREE_CODE (gnu_result_type) == UNCONSTRAINED_ARRAY_TYPE
+- || CONTAINS_PLACEHOLDER_P (TYPE_SIZE (gnu_result_type))))
++ || CONTAINS_PLACEHOLDER_P (TYPE_SIZE (gnu_result_type)))
++ && !(TREE_CODE (gnu_result) == CALL_EXPR
++ && type_is_padding_self_referential (TREE_TYPE (gnu_result))
++ && (Nkind (Parent (gnat_node)) == N_Object_Declaration
++ || Nkind (Parent (gnat_node)) == N_Object_Renaming_Declaration
++ || Nkind (Parent (gnat_node)) == N_Simple_Return_Statement)))
+ gnu_result = gnat_protect_expr (gnu_result);
+
+ /* Now convert the result to the result type, unless we are in one of the
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/ada/gcc-interface/utils.c gcc-6-20160721/gcc/ada/gcc-interface/utils.c
+--- gcc-6.1.0/gcc/ada/gcc-interface/utils.c 2016-02-29 15:30:08.000000000 +0000
++++ gcc-6-20160721/gcc/ada/gcc-interface/utils.c 2016-06-06 09:51:43.000000000 +0000
+@@ -90,6 +90,8 @@
+ static tree handle_nonnull_attribute (tree *, tree, tree, int, bool *);
+ static tree handle_sentinel_attribute (tree *, tree, tree, int, bool *);
+ static tree handle_noreturn_attribute (tree *, tree, tree, int, bool *);
++static tree handle_noinline_attribute (tree *, tree, tree, int, bool *);
++static tree handle_noclone_attribute (tree *, tree, tree, int, bool *);
+ static tree handle_leaf_attribute (tree *, tree, tree, int, bool *);
+ static tree handle_always_inline_attribute (tree *, tree, tree, int, bool *);
+ static tree handle_malloc_attribute (tree *, tree, tree, int, bool *);
+@@ -121,6 +123,10 @@
+ false },
+ { "noreturn", 0, 0, true, false, false, handle_noreturn_attribute,
+ false },
++ { "noinline", 0, 0, true, false, false, handle_noinline_attribute,
++ false },
++ { "noclone", 0, 0, true, false, false, handle_noclone_attribute,
++ false },
+ { "leaf", 0, 0, true, false, false, handle_leaf_attribute,
+ false },
+ { "always_inline",0, 0, true, false, false, handle_always_inline_attribute,
+@@ -5971,6 +5977,51 @@
+ *no_add_attrs = true;
+ }
+
++ return NULL_TREE;
++}
++
++/* Handle a "noinline" attribute; arguments as in
++ struct attribute_spec.handler. */
++
++static tree
++handle_noinline_attribute (tree *node, tree name,
++ tree ARG_UNUSED (args),
++ int ARG_UNUSED (flags), bool *no_add_attrs)
++{
++ if (TREE_CODE (*node) == FUNCTION_DECL)
++ {
++ if (lookup_attribute ("always_inline", DECL_ATTRIBUTES (*node)))
++ {
++ warning (OPT_Wattributes, "%qE attribute ignored due to conflict "
++ "with attribute %qs", name, "always_inline");
++ *no_add_attrs = true;
++ }
++ else
++ DECL_UNINLINABLE (*node) = 1;
++ }
++ else
++ {
++ warning (OPT_Wattributes, "%qE attribute ignored", name);
++ *no_add_attrs = true;
++ }
++
++ return NULL_TREE;
++}
++
++/* Handle a "noclone" attribute; arguments as in
++ struct attribute_spec.handler. */
++
++static tree
++handle_noclone_attribute (tree *node, tree name,
++ tree ARG_UNUSED (args),
++ int ARG_UNUSED (flags), bool *no_add_attrs)
++{
++ if (TREE_CODE (*node) != FUNCTION_DECL)
++ {
++ warning (OPT_Wattributes, "%qE attribute ignored", name);
++ *no_add_attrs = true;
++ }
++
+ return NULL_TREE;
+ }
+
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/ada/gcc-interface/utils2.c gcc-6-20160721/gcc/ada/gcc-interface/utils2.c
+--- gcc-6.1.0/gcc/ada/gcc-interface/utils2.c 2016-02-29 09:02:46.000000000 +0000
++++ gcc-6-20160721/gcc/ada/gcc-interface/utils2.c 2016-06-06 09:43:59.000000000 +0000
+@@ -2266,8 +2266,6 @@
+ Entity_Id gnat_proc, Entity_Id gnat_pool,
+ Node_Id gnat_node)
+ {
+- gnu_size = SUBSTITUTE_PLACEHOLDER_IN_EXPR (gnu_size, gnu_obj);
+-
+ /* Explicit proc to call ? This one is assumed to deal with the type
+ alignment constraints. */
+ if (Present (gnat_proc))
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/ada/s-osinte-gnu.ads gcc-6-20160721/gcc/ada/s-osinte-gnu.ads
+--- gcc-6.1.0/gcc/ada/s-osinte-gnu.ads 2016-04-27 07:39:18.000000000 +0000
++++ gcc-6-20160721/gcc/ada/s-osinte-gnu.ads 2016-05-04 19:14:17.000000000 +0000
+@@ -344,10 +344,9 @@
+ -- returns the stack base of the specified thread. Only call this function
+ -- when Stack_Base_Available is True.
+
+- -- From: /usr/include/i386-gnu/bits/shm.h __getpagesize or getpagesize??
+- function Get_Page_Size return size_t;
+- function Get_Page_Size return Address;
+- pragma Import (C, Get_Page_Size, "__getpagesize");
++ -- From: /usr/include/i386-gnu/bits/shm.h
++ function Get_Page_Size return int;
++ pragma Import (C, Get_Page_Size, "getpagesize");
+ -- Returns the size of a page
+
+ -- From /usr/include/i386-gnu/bits/mman.h
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/ada/s-osinte-kfreebsd-gnu.ads gcc-6-20160721/gcc/ada/s-osinte-kfreebsd-gnu.ads
+--- gcc-6.1.0/gcc/ada/s-osinte-kfreebsd-gnu.ads 2015-12-06 15:28:16.000000000 +0000
++++ gcc-6-20160721/gcc/ada/s-osinte-kfreebsd-gnu.ads 2016-05-31 18:59:45.000000000 +0000
+@@ -7,7 +7,7 @@
+ -- S p e c --
+ -- --
+ -- Copyright (C) 1991-1994, Florida State University --
+--- Copyright (C) 1995-2015, Free Software Foundation, Inc. --
++-- Copyright (C) 1995-2016, Free Software Foundation, Inc. --
+ -- --
+ -- GNAT is free software; you can redistribute it and/or modify it under --
+ -- terms of the GNU General Public License as published by the Free Soft- --
+@@ -216,6 +216,11 @@
+ return int;
+ pragma Import (C, clock_gettime, "clock_gettime");
+
++ function clock_getres
++ (clock_id : clockid_t;
++ res : access timespec) return int;
++ pragma Import (C, clock_getres, "clock_getres");
++
+ function To_Duration (TS : timespec) return Duration;
+ pragma Inline (To_Duration);
+
+@@ -330,8 +335,7 @@
+ -- returns the stack base of the specified thread. Only call this function
+ -- when Stack_Base_Available is True.
+
+- function Get_Page_Size return size_t;
+- function Get_Page_Size return Address;
++ function Get_Page_Size return int;
+ pragma Import (C, Get_Page_Size, "getpagesize");
+ -- Returns the size of a page
+
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/ada/s-osinte-rtems.ads gcc-6-20160721/gcc/ada/s-osinte-rtems.ads
+--- gcc-6.1.0/gcc/ada/s-osinte-rtems.ads 2015-12-02 07:09:41.000000000 +0000
++++ gcc-6-20160721/gcc/ada/s-osinte-rtems.ads 2016-05-31 18:59:45.000000000 +0000
+@@ -6,7 +6,7 @@
+ -- --
+ -- S p e c --
+ -- --
+--- Copyright (C) 1997-2011 Free Software Foundation, Inc. --
++-- Copyright (C) 1997-2016 Free Software Foundation, Inc. --
+ -- --
+ -- GNARL is free software; you can redistribute it and/or modify it under --
+ -- terms of the GNU General Public License as published by the Free Soft- --
+@@ -188,6 +188,11 @@
+ tp : access timespec) return int;
+ pragma Import (C, clock_gettime, "clock_gettime");
+
++ function clock_getres
++ (clock_id : clockid_t;
++ res : access timespec) return int;
++ pragma Import (C, clock_getres, "clock_getres");
++
+ function To_Duration (TS : timespec) return Duration;
+ pragma Inline (To_Duration);
+
+@@ -291,8 +296,7 @@
+ -- These two functions are only needed to share s-taprop.adb with
+ -- FSU threads.
+
+- function Get_Page_Size return size_t;
+- function Get_Page_Size return Address;
++ function Get_Page_Size return int;
+ pragma Import (C, Get_Page_Size, "getpagesize");
+ -- Returns the size of a page
+
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/ada/sem_ch6.adb gcc-6-20160721/gcc/ada/sem_ch6.adb
+--- gcc-6.1.0/gcc/ada/sem_ch6.adb 2015-11-24 09:22:24.000000000 +0000
++++ gcc-6-20160721/gcc/ada/sem_ch6.adb 2016-05-02 20:33:47.000000000 +0000
+@@ -10415,10 +10415,12 @@
+ Analyze_Return_Type (Related_Nod);
+
+ -- If return type is class-wide, subprogram freezing may be
+- -- delayed as well.
++ -- delayed as well, unless the declaration is a compilation unit
++ -- in which case the freeze node would appear too late.
+
+ if Is_Class_Wide_Type (Etype (Current_Scope))
+ and then not Is_Thunk (Current_Scope)
++ and then not Is_Compilation_Unit (Current_Scope)
+ and then Nkind (Unit_Declaration_Node (Current_Scope)) =
+ N_Subprogram_Declaration
+ then
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/ada/system-darwin-ppc64.ads gcc-6-20160721/gcc/ada/system-darwin-ppc64.ads
+--- gcc-6.1.0/gcc/ada/system-darwin-ppc64.ads 2015-11-23 11:31:24.000000000 +0000
++++ gcc-6-20160721/gcc/ada/system-darwin-ppc64.ads 2016-05-06 09:11:56.000000000 +0000
+@@ -7,7 +7,7 @@
+ -- S p e c --
+ -- (Darwin/PPC64 Version) --
+ -- --
+--- Copyright (C) 2011-2015, Free Software Foundation, Inc. --
++-- Copyright (C) 2011-2016, Free Software Foundation, Inc. --
+ -- --
+ -- This specification is derived from the Ada Reference Manual for use with --
+ -- GNAT. The copyright notice above, and the license provisions that follow --
+@@ -40,6 +40,9 @@
+ -- this unit Pure instead of Preelaborable; see RM 13.7.1(15). In Ada
+ -- 2005, this is Pure in any case (AI-362).
+
++ pragma No_Elaboration_Code_All;
++ -- Allow the use of that restriction in units that WITH this unit
++
+ type Name is (SYSTEM_NAME_GNAT);
+ System_Name : constant Name := SYSTEM_NAME_GNAT;
+
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/ada/system-linux-armeb.ads gcc-6-20160721/gcc/ada/system-linux-armeb.ads
+--- gcc-6.1.0/gcc/ada/system-linux-armeb.ads 2015-11-23 11:31:24.000000000 +0000
++++ gcc-6-20160721/gcc/ada/system-linux-armeb.ads 2016-05-06 09:11:56.000000000 +0000
+@@ -40,6 +40,9 @@
+ -- this unit Pure instead of Preelaborable; see RM 13.7.1(15). In Ada
+ -- 2005, this is Pure in any case (AI-362).
+
++ pragma No_Elaboration_Code_All;
++ -- Allow the use of that restriction in units that WITH this unit
++
+ type Name is (SYSTEM_NAME_GNAT);
+ System_Name : constant Name := SYSTEM_NAME_GNAT;
+
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/ada/system-linux-mips.ads gcc-6-20160721/gcc/ada/system-linux-mips.ads
+--- gcc-6.1.0/gcc/ada/system-linux-mips.ads 2015-11-23 11:31:24.000000000 +0000
++++ gcc-6-20160721/gcc/ada/system-linux-mips.ads 2016-05-06 09:11:56.000000000 +0000
+@@ -7,7 +7,7 @@
+ -- S p e c --
+ -- (GNU-Linux/MIPS Version) --
+ -- --
+--- Copyright (C) 1992-2015, Free Software Foundation, Inc. --
++-- Copyright (C) 1992-2016, Free Software Foundation, Inc. --
+ -- --
+ -- This specification is derived from the Ada Reference Manual for use with --
+ -- GNAT. The copyright notice above, and the license provisions that follow --
+@@ -40,6 +40,9 @@
+ -- this unit Pure instead of Preelaborable; see RM 13.7.1(15). In Ada
+ -- 2005, this is Pure in any case (AI-362).
+
++ pragma No_Elaboration_Code_All;
++ -- Allow the use of that restriction in units that WITH this unit
++
+ type Name is (SYSTEM_NAME_GNAT);
+ System_Name : constant Name := SYSTEM_NAME_GNAT;
+
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/ada/system-linux-mips64el.ads gcc-6-20160721/gcc/ada/system-linux-mips64el.ads
+--- gcc-6.1.0/gcc/ada/system-linux-mips64el.ads 2015-11-23 11:31:24.000000000 +0000
++++ gcc-6-20160721/gcc/ada/system-linux-mips64el.ads 2016-05-06 09:11:56.000000000 +0000
+@@ -7,7 +7,7 @@
+ -- S p e c --
+ -- (GNU-Linux/MIPS64EL Version) --
+ -- --
+--- Copyright (C) 1992-2015, Free Software Foundation, Inc. --
++-- Copyright (C) 1992-2016, Free Software Foundation, Inc. --
+ -- --
+ -- This specification is derived from the Ada Reference Manual for use with --
+ -- GNAT. The copyright notice above, and the license provisions that follow --
+@@ -40,6 +40,9 @@
+ -- this unit Pure instead of Preelaborable; see RM 13.7.1(15). In Ada
+ -- 2005, this is Pure in any case (AI-362).
+
++ pragma No_Elaboration_Code_All;
++ -- Allow the use of that restriction in units that WITH this unit
++
+ type Name is (SYSTEM_NAME_GNAT);
+ System_Name : constant Name := SYSTEM_NAME_GNAT;
+
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/ada/system-linux-mipsel.ads gcc-6-20160721/gcc/ada/system-linux-mipsel.ads
+--- gcc-6.1.0/gcc/ada/system-linux-mipsel.ads 2015-11-23 11:31:24.000000000 +0000
++++ gcc-6-20160721/gcc/ada/system-linux-mipsel.ads 2016-05-06 09:11:56.000000000 +0000
+@@ -7,7 +7,7 @@
+ -- S p e c --
+ -- (GNU-Linux/MIPSEL Version) --
+ -- --
+--- Copyright (C) 1992-2015, Free Software Foundation, Inc. --
++-- Copyright (C) 1992-2016, Free Software Foundation, Inc. --
+ -- --
+ -- This specification is derived from the Ada Reference Manual for use with --
+ -- GNAT. The copyright notice above, and the license provisions that follow --
+@@ -40,6 +40,9 @@
+ -- this unit Pure instead of Preelaborable; see RM 13.7.1(15). In Ada
+ -- 2005, this is Pure in any case (AI-362).
+
++ pragma No_Elaboration_Code_All;
++ -- Allow the use of that restriction in units that WITH this unit
++
+ type Name is (SYSTEM_NAME_GNAT);
+ System_Name : constant Name := SYSTEM_NAME_GNAT;
+
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/ada/system-linux-ppc64.ads gcc-6-20160721/gcc/ada/system-linux-ppc64.ads
+--- gcc-6.1.0/gcc/ada/system-linux-ppc64.ads 2015-11-23 11:31:24.000000000 +0000
++++ gcc-6-20160721/gcc/ada/system-linux-ppc64.ads 2016-05-06 09:11:56.000000000 +0000
+@@ -7,7 +7,7 @@
+ -- S p e c --
+ -- (GNU-Linux/PPC64 Version) --
+ -- --
+--- Copyright (C) 1992-2015, Free Software Foundation, Inc. --
++-- Copyright (C) 1992-2016, Free Software Foundation, Inc. --
+ -- --
+ -- This specification is derived from the Ada Reference Manual for use with --
+ -- GNAT. The copyright notice above, and the license provisions that follow --
+@@ -40,6 +40,9 @@
+ -- this unit Pure instead of Preelaborable; see RM 13.7.1(15). In Ada
+ -- 2005, this is Pure in any case (AI-362).
+
++ pragma No_Elaboration_Code_All;
++ -- Allow the use of that restriction in units that WITH this unit
++
+ type Name is (SYSTEM_NAME_GNAT);
+ System_Name : constant Name := SYSTEM_NAME_GNAT;
+
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/ada/system-linux-sparcv9.ads gcc-6-20160721/gcc/ada/system-linux-sparcv9.ads
+--- gcc-6.1.0/gcc/ada/system-linux-sparcv9.ads 2015-11-23 11:31:24.000000000 +0000
++++ gcc-6-20160721/gcc/ada/system-linux-sparcv9.ads 2016-05-06 09:11:56.000000000 +0000
+@@ -7,7 +7,7 @@
+ -- S p e c --
+ -- (GNU/Linux-SPARCV9 Version) --
+ -- --
+--- Copyright (C) 1992-2015, Free Software Foundation, Inc. --
++-- Copyright (C) 1992-2016, Free Software Foundation, Inc. --
+ -- --
+ -- This specification is derived from the Ada Reference Manual for use with --
+ -- GNAT. The copyright notice above, and the license provisions that follow --
+@@ -40,6 +40,9 @@
+ -- this unit Pure instead of Preelaborable; see RM 13.7.1(15). In Ada
+ -- 2005, this is Pure in any case (AI-362).
+
++ pragma No_Elaboration_Code_All;
++ -- Allow the use of that restriction in units that WITH this unit
++
+ type Name is (SYSTEM_NAME_GNAT);
+ System_Name : constant Name := SYSTEM_NAME_GNAT;
+
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/ada/system-rtems.ads gcc-6-20160721/gcc/ada/system-rtems.ads
+--- gcc-6.1.0/gcc/ada/system-rtems.ads 2015-11-23 11:31:24.000000000 +0000
++++ gcc-6-20160721/gcc/ada/system-rtems.ads 2016-05-06 09:11:56.000000000 +0000
+@@ -7,7 +7,7 @@
+ -- S p e c --
+ -- (Compiler Version) --
+ -- --
+--- Copyright (C) 1992-2015 Free Software Foundation, Inc. --
++-- Copyright (C) 1992-2016 Free Software Foundation, Inc. --
+ -- --
+ -- This specification is derived from the Ada Reference Manual for use with --
+ -- GNAT. The copyright notice above, and the license provisions that follow --
+@@ -44,6 +44,9 @@
+ -- this unit Pure instead of Preelaborable; see RM 13.7.1(15). In Ada
+ -- 2005, this is Pure in any case (AI-362).
+
++ pragma No_Elaboration_Code_All;
++ -- Allow the use of that restriction in units that WITH this unit
++
+ type Name is (SYSTEM_NAME_GNAT);
+ System_Name : constant Name := SYSTEM_NAME_GNAT;
+
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/alias.c gcc-6-20160721/gcc/alias.c
+--- gcc-6.1.0/gcc/alias.c 2016-04-04 09:30:16.000000000 +0000
++++ gcc-6-20160721/gcc/alias.c 2016-05-30 14:00:18.000000000 +0000
+@@ -769,6 +769,10 @@
+ tree
+ reference_alias_ptr_type (tree t)
+ {
++ /* If the frontend assigns this alias-set zero, preserve that. */
++ if (lang_hooks.get_alias_set (t) == 0)
++ return ptr_type_node;
++
+ tree ptype = reference_alias_ptr_type_1 (&t);
+ /* If there is a given pointer type for aliasing purposes, return it. */
+ if (ptype != NULL_TREE)
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/asan.c gcc-6-20160721/gcc/asan.c
+--- gcc-6.1.0/gcc/asan.c 2016-04-08 10:46:13.000000000 +0000
++++ gcc-6-20160721/gcc/asan.c 2016-07-21 16:18:46.000000000 +0000
+@@ -2159,6 +2159,9 @@
+ tree
+ asan_dynamic_init_call (bool after_p)
+ {
++ if (shadow_ptr_types[0] == NULL_TREE)
++ asan_init_shadow_ptr_types ();
++
+ tree fn = builtin_decl_implicit (after_p
+ ? BUILT_IN_ASAN_AFTER_DYNAMIC_INIT
+ : BUILT_IN_ASAN_BEFORE_DYNAMIC_INIT);
+@@ -2168,8 +2171,6 @@
+ pretty_printer module_name_pp;
+ pp_string (&module_name_pp, main_input_filename);
+
+- if (shadow_ptr_types[0] == NULL_TREE)
+- asan_init_shadow_ptr_types ();
+ module_name_cst = asan_pp_string (&module_name_pp);
+ module_name_cst = fold_convert (const_ptr_type_node,
+ module_name_cst);
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/c/ChangeLog gcc-6-20160721/gcc/c/ChangeLog
+--- gcc-6.1.0/gcc/c/ChangeLog 2016-04-27 08:20:21.000000000 +0000
++++ gcc-6-20160721/gcc/c/ChangeLog 2016-07-02 10:22:11.000000000 +0000
+@@ -1,3 +1,44 @@
++2016-07-02 Jakub Jelinek <jakub@redhat.com>
++
++ Backported from mainline
++ 2016-06-29 Jakub Jelinek <jakub@redhat.com>
++
++ PR c/71685
++ * c-typeck.c (c_build_qualified_type): Don't clear
++ C_TYPE_INCOMPLETE_VARS for the main variant.
++
++2016-06-10 Thomas Schwinge <thomas@codesourcery.com>
++
++ PR c/71381
++ Backport from trunk r237290:
++ * c-parser.c (c_parser_omp_variable_list) <OMP_CLAUSE__CACHE_>:
++ Loosen checking.
++
++2016-05-30 Jakub Jelinek <jakub@redhat.com>
++
++ PR c++/71349
++ * c-parser.c (c_parser_omp_for): Don't disallow nowait clause
++ when combined with target construct.
++
++2016-05-19 David Malcolm <dmalcolm@redhat.com>
++
++ Backport from trunk r236488.
++ PR c/71171
++ * c-parser.c (c_parser_generic_selection): Use c_expr::set_error
++ in error-handling.
++ (c_parser_postfix_expression): Likewise.
++ * c-tree.h (c_expr::set_error): New method.
++ * c-typeck.c (parser_build_binary_op): In error-handling, ensure
++ that result's range is initialized.
++
++2016-04-29 Cesar Philippidis <cesar@codesourcery.com>
++
++ PR middle-end/70626
++ * c-parser.c (c_parser_oacc_loop): Don't augment mask with
++ OACC_LOOP_CLAUSE_MASK.
++ (c_parser_oacc_kernels_parallel): Update call to
++ c_oacc_split_loop_clauses.
++
+ 2016-04-27 Release Manager
+
+ * GCC 6.1.0 released.
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/c/c-parser.c gcc-6-20160721/gcc/c/c-parser.c
+--- gcc-6.1.0/gcc/c/c-parser.c 2016-04-15 12:24:18.000000000 +0000
++++ gcc-6-20160721/gcc/c/c-parser.c 2016-06-10 09:46:04.000000000 +0000
+@@ -7185,7 +7185,7 @@
+
+ error_expr.original_code = ERROR_MARK;
+ error_expr.original_type = NULL;
+- error_expr.value = error_mark_node;
++ error_expr.set_error ();
+ matched_assoc.type_location = UNKNOWN_LOCATION;
+ matched_assoc.type = NULL_TREE;
+ matched_assoc.expression = error_expr;
+@@ -7496,13 +7496,13 @@
+ gcc_assert (c_dialect_objc ());
+ if (!c_parser_require (parser, CPP_DOT, "expected %<.%>"))
+ {
+- expr.value = error_mark_node;
++ expr.set_error ();
+ break;
+ }
+ if (c_parser_next_token_is_not (parser, CPP_NAME))
+ {
+ c_parser_error (parser, "expected identifier");
+- expr.value = error_mark_node;
++ expr.set_error ();
+ break;
+ }
+ c_token *component_tok = c_parser_peek_token (parser);
+@@ -7516,7 +7516,7 @@
+ }
+ default:
+ c_parser_error (parser, "expected expression");
+- expr.value = error_mark_node;
++ expr.set_error ();
+ break;
+ }
+ break;
+@@ -7538,7 +7538,7 @@
+ parser->error = true;
+ c_parser_skip_until_found (parser, CPP_CLOSE_BRACE, NULL);
+ c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
+- expr.value = error_mark_node;
++ expr.set_error ();
+ break;
+ }
+ stmt = c_begin_stmt_expr ();
+@@ -7567,7 +7567,7 @@
+ "expected %<)%>");
+ if (type_name == NULL)
+ {
+- expr.value = error_mark_node;
++ expr.set_error ();
+ }
+ else
+ expr = c_parser_postfix_expression_after_paren_type (parser,
+@@ -7627,7 +7627,7 @@
+ c_parser_consume_token (parser);
+ if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
+ {
+- expr.value = error_mark_node;
++ expr.set_error ();
+ break;
+ }
+ e1 = c_parser_expr_no_commas (parser, NULL);
+@@ -7636,7 +7636,7 @@
+ if (!c_parser_require (parser, CPP_COMMA, "expected %<,%>"))
+ {
+ c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
+- expr.value = error_mark_node;
++ expr.set_error ();
+ break;
+ }
+ loc = c_parser_peek_token (parser)->location;
+@@ -7646,7 +7646,7 @@
+ "expected %<)%>");
+ if (t1 == NULL)
+ {
+- expr.value = error_mark_node;
++ expr.set_error ();
+ }
+ else
+ {
+@@ -7668,7 +7668,7 @@
+ c_parser_consume_token (parser);
+ if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
+ {
+- expr.value = error_mark_node;
++ expr.set_error ();
+ break;
+ }
+ t1 = c_parser_type_name (parser);
+@@ -7679,7 +7679,7 @@
+ if (parser->error)
+ {
+ c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
+- expr.value = error_mark_node;
++ expr.set_error ();
+ break;
+ }
+
+@@ -7768,7 +7768,7 @@
+ &cexpr_list, true,
+ &close_paren_loc))
+ {
+- expr.value = error_mark_node;
++ expr.set_error ();
+ break;
+ }
+
+@@ -7776,7 +7776,7 @@
+ {
+ error_at (loc, "wrong number of arguments to "
+ "%<__builtin_choose_expr%>");
+- expr.value = error_mark_node;
++ expr.set_error ();
+ break;
+ }
+
+@@ -7801,25 +7801,25 @@
+ c_parser_consume_token (parser);
+ if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
+ {
+- expr.value = error_mark_node;
++ expr.set_error ();
+ break;
+ }
+ t1 = c_parser_type_name (parser);
+ if (t1 == NULL)
+ {
+- expr.value = error_mark_node;
++ expr.set_error ();
+ break;
+ }
+ if (!c_parser_require (parser, CPP_COMMA, "expected %<,%>"))
+ {
+ c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
+- expr.value = error_mark_node;
++ expr.set_error ();
+ break;
+ }
+ t2 = c_parser_type_name (parser);
+ if (t2 == NULL)
+ {
+- expr.value = error_mark_node;
++ expr.set_error ();
+ break;
+ }
+ {
+@@ -7831,7 +7831,7 @@
+ e2 = groktypename (t2, NULL, NULL);
+ if (e1 == error_mark_node || e2 == error_mark_node)
+ {
+- expr.value = error_mark_node;
++ expr.set_error ();
+ break;
+ }
+
+@@ -7856,14 +7856,14 @@
+ &cexpr_list, false,
+ &close_paren_loc))
+ {
+- expr.value = error_mark_node;
++ expr.set_error ();
+ break;
+ }
+ if (vec_safe_length (cexpr_list) != 2)
+ {
+ error_at (loc, "wrong number of arguments to "
+ "%<__builtin_call_with_static_chain%>");
+- expr.value = error_mark_node;
++ expr.set_error ();
+ break;
+ }
+
+@@ -7898,7 +7898,7 @@
+ &cexpr_list, false,
+ &close_paren_loc))
+ {
+- expr.value = error_mark_node;
++ expr.set_error ();
+ break;
+ }
+
+@@ -7906,7 +7906,7 @@
+ {
+ error_at (loc, "wrong number of arguments to "
+ "%<__builtin_complex%>");
+- expr.value = error_mark_node;
++ expr.set_error ();
+ break;
+ }
+
+@@ -7928,7 +7928,7 @@
+ {
+ error_at (loc, "%<__builtin_complex%> operand "
+ "not of real binary floating-point type");
+- expr.value = error_mark_node;
++ expr.set_error ();
+ break;
+ }
+ if (TYPE_MAIN_VARIANT (TREE_TYPE (e1_p->value))
+@@ -7936,7 +7936,7 @@
+ {
+ error_at (loc,
+ "%<__builtin_complex%> operands of different types");
+- expr.value = error_mark_node;
++ expr.set_error ();
+ break;
+ }
+ pedwarn_c90 (loc, OPT_Wpedantic,
+@@ -7962,7 +7962,7 @@
+ &cexpr_list, false,
+ &close_paren_loc))
+ {
+- expr.value = error_mark_node;
++ expr.set_error ();
+ break;
+ }
+
+@@ -7985,7 +7985,7 @@
+ {
+ error_at (loc, "wrong number of arguments to "
+ "%<__builtin_shuffle%>");
+- expr.value = error_mark_node;
++ expr.set_error ();
+ }
+ set_c_expr_source_range (&expr, loc, close_paren_loc);
+ break;
+@@ -7995,7 +7995,7 @@
+ c_parser_consume_token (parser);
+ if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
+ {
+- expr.value = error_mark_node;
++ expr.set_error ();
+ break;
+ }
+ {
+@@ -8012,14 +8012,14 @@
+ c_parser_consume_token (parser);
+ if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
+ {
+- expr.value = error_mark_node;
++ expr.set_error ();
+ break;
+ }
+ if (c_parser_next_token_is_not (parser, CPP_NAME))
+ {
+ c_parser_error (parser, "expected identifier");
+ c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
+- expr.value = error_mark_node;
++ expr.set_error ();
+ break;
+ }
+ {
+@@ -8038,13 +8038,13 @@
+ c_parser_consume_token (parser);
+ if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
+ {
+- expr.value = error_mark_node;
++ expr.set_error ();
+ break;
+ }
+ t1 = c_parser_type_name (parser);
+ if (t1 == NULL)
+ {
+- expr.value = error_mark_node;
++ expr.set_error ();
+ c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
+ break;
+ }
+@@ -8067,7 +8067,7 @@
+ error_at (loc, "-fcilkplus must be enabled to use "
+ "%<_Cilk_spawn%>");
+ expr = c_parser_cast_expression (parser, NULL);
+- expr.value = error_mark_node;
++ expr.set_error ();
+ }
+ else if (c_parser_peek_token (parser)->keyword == RID_CILK_SPAWN)
+ {
+@@ -8086,7 +8086,7 @@
+ break;
+ default:
+ c_parser_error (parser, "expected expression");
+- expr.value = error_mark_node;
++ expr.set_error ();
+ break;
+ }
+ break;
+@@ -8107,7 +8107,7 @@
+ /* Else fall through to report error. */
+ default:
+ c_parser_error (parser, "expected expression");
+- expr.value = error_mark_node;
++ expr.set_error ();
+ break;
+ }
+ return c_parser_postfix_expression_after_primary
+@@ -8325,7 +8325,7 @@
+ else
+ {
+ c_parser_error (parser, "expected identifier");
+- expr.value = error_mark_node;
++ expr.set_error ();
+ expr.original_code = ERROR_MARK;
+ expr.original_type = NULL;
+ return expr;
+@@ -8357,7 +8357,7 @@
+ else
+ {
+ c_parser_error (parser, "expected identifier");
+- expr.value = error_mark_node;
++ expr.set_error ();
+ expr.original_code = ERROR_MARK;
+ expr.original_type = NULL;
+ return expr;
+@@ -10595,6 +10595,8 @@
+ switch (kind)
+ {
+ case OMP_CLAUSE__CACHE_:
++ /* The OpenACC cache directive explicitly only allows "array
++ elements or subarrays". */
+ if (c_parser_peek_token (parser)->type != CPP_OPEN_SQUARE)
+ {
+ c_parser_error (parser, "expected %<[%>");
+@@ -10657,25 +10659,6 @@
+ break;
+ }
+
+- if (kind == OMP_CLAUSE__CACHE_)
+- {
+- if (TREE_CODE (low_bound) != INTEGER_CST
+- && !TREE_READONLY (low_bound))
+- {
+- error_at (clause_loc,
+- "%qD is not a constant", low_bound);
+- t = error_mark_node;
+- }
+-
+- if (TREE_CODE (length) != INTEGER_CST
+- && !TREE_READONLY (length))
+- {
+- error_at (clause_loc,
+- "%qD is not a constant", length);
+- t = error_mark_node;
+- }
+- }
+-
+ t = tree_cons (low_bound, length, t);
+ }
+ break;
+@@ -13822,6 +13805,8 @@
+ c_parser_oacc_loop (location_t loc, c_parser *parser, char *p_name,
+ omp_clause_mask mask, tree *cclauses, bool *if_p)
+ {
++ bool is_parallel = ((mask >> PRAGMA_OACC_CLAUSE_REDUCTION) & 1) == 1;
++
+ strcat (p_name, " loop");
+ mask |= OACC_LOOP_CLAUSE_MASK;
+
+@@ -13829,7 +13814,7 @@
+ cclauses == NULL);
+ if (cclauses)
+ {
+- clauses = c_oacc_split_loop_clauses (clauses, cclauses);
++ clauses = c_oacc_split_loop_clauses (clauses, cclauses, is_parallel);
+ if (*cclauses)
+ *cclauses = c_finish_omp_clauses (*cclauses, false);
+ if (clauses)
+@@ -13924,8 +13909,6 @@
+ if (strcmp (p, "loop") == 0)
+ {
+ c_parser_consume_token (parser);
+- mask |= OACC_LOOP_CLAUSE_MASK;
+-
+ tree block = c_begin_omp_parallel ();
+ tree clauses;
+ c_parser_oacc_loop (loc, parser, p_name, mask, &clauses, if_p);
+@@ -15094,7 +15077,9 @@
+
+ strcat (p_name, " for");
+ mask |= OMP_FOR_CLAUSE_MASK;
+- if (cclauses)
++ /* parallel for{, simd} disallows nowait clause, but for
++ target {teams distribute ,}parallel for{, simd} it should be accepted. */
++ if (cclauses && (mask & (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_MAP)) == 0)
+ mask &= ~(OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_NOWAIT);
+ /* Composite distribute parallel for{, simd} disallows ordered clause. */
+ if ((mask & (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_DIST_SCHEDULE)) != 0)
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/c/c-tree.h gcc-6-20160721/gcc/c/c-tree.h
+--- gcc-6.1.0/gcc/c/c-tree.h 2016-04-13 16:00:52.000000000 +0000
++++ gcc-6-20160721/gcc/c/c-tree.h 2016-05-19 20:33:51.000000000 +0000
+@@ -143,6 +143,15 @@
+ of this expression. */
+ location_t get_start () const { return src_range.m_start; }
+ location_t get_finish () const { return src_range.m_finish; }
++
++ /* Set the value to error_mark_node whilst ensuring that src_range
++ is initialized. */
++ void set_error ()
++ {
++ value = error_mark_node;
++ src_range.m_start = UNKNOWN_LOCATION;
++ src_range.m_finish = UNKNOWN_LOCATION;
++ }
+ };
+
+ /* Type alias for struct c_expr. This allows to use the structure
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/c/c-typeck.c gcc-6-20160721/gcc/c/c-typeck.c
+--- gcc-6.1.0/gcc/c/c-typeck.c 2016-04-15 14:46:06.000000000 +0000
++++ gcc-6-20160721/gcc/c/c-typeck.c 2016-07-02 10:22:11.000000000 +0000
+@@ -3530,7 +3530,12 @@
+ result.original_type = NULL;
+
+ if (TREE_CODE (result.value) == ERROR_MARK)
+- return result;
++ {
++ set_c_expr_source_range (&result,
++ arg1.get_start (),
++ arg2.get_finish ());
++ return result;
++ }
+
+ if (location != UNKNOWN_LOCATION)
+ protected_set_expr_location (result.value, location);
+@@ -13533,7 +13538,8 @@
+ : build_qualified_type (type, type_quals));
+ /* A variant type does not inherit the list of incomplete vars from the
+ type main variant. */
+- if (RECORD_OR_UNION_TYPE_P (var_type))
++ if (RECORD_OR_UNION_TYPE_P (var_type)
++ && TYPE_MAIN_VARIANT (var_type) != var_type)
+ C_TYPE_INCOMPLETE_VARS (var_type) = 0;
+ return var_type;
+ }
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/c-family/ChangeLog gcc-6-20160721/gcc/c-family/ChangeLog
+--- gcc-6.1.0/gcc/c-family/ChangeLog 2016-04-27 08:20:21.000000000 +0000
++++ gcc-6-20160721/gcc/c-family/ChangeLog 2016-07-05 17:55:36.000000000 +0000
+@@ -1,3 +1,37 @@
++2016-07-05 Markus Trippelsdorf <markus@trippelsdorf.de>
++
++ PR c++/71214
++ * c-cppbuiltin.c (c_cpp_builtins): Define __cpp_rvalue_references.
++
++2016-06-14 Jakub Jelinek <jakub@redhat.com>
++
++ Backported from mainline
++ 2016-06-10 Jakub Jelinek <jakub@redhat.com>
++
++ PR c/68657
++ * c.opt (Wpsabi): Add Warning flag.
++
++2016-06-13 Jakub Jelinek <jakub@redhat.com>
++
++ PR sanitizer/71498
++ * c-gimplify.c (ubsan_walk_array_refs_r): Set *walk_subtrees = 0 on
++ all BIND_EXPRs, and on all BIND_EXPRs recurse also on BIND_EXPR_BODY.
++
++2016-05-30 Jakub Jelinek <jakub@redhat.com>
++
++ PR c++/71349
++ * c-omp.c (c_omp_split_clauses): Put OMP_CLAUSE_DEPEND to
++ C_OMP_CLAUSE_SPLIT_TARGET. Put OMP_CLAUSE_NOWAIT to
++ C_OMP_CLAUSE_SPLIT_TARGET if combined with target construct,
++ instead of C_OMP_CLAUSE_SPLIT_FOR.
++
++2016-04-29 Cesar Philippidis <cesar@codesourcery.com>
++
++ PR middle-end/70626
++ * c-common.h (c_oacc_split_loop_clauses): Add boolean argument.
++ * c-omp.c (c_oacc_split_loop_clauses): Use it to duplicate
++ reduction clauses in acc parallel loops.
++
+ 2016-04-27 Release Manager
+
+ * GCC 6.1.0 released.
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/c-family/c-common.h gcc-6-20160721/gcc/c-family/c-common.h
+--- gcc-6.1.0/gcc/c-family/c-common.h 2016-01-27 17:17:23.000000000 +0000
++++ gcc-6-20160721/gcc/c-family/c-common.h 2016-04-29 17:37:55.000000000 +0000
+@@ -1276,7 +1276,7 @@
+ extern bool c_omp_check_loop_iv_exprs (location_t, tree, tree, tree, tree,
+ walk_tree_lh);
+ extern tree c_finish_oacc_wait (location_t, tree, tree);
+-extern tree c_oacc_split_loop_clauses (tree, tree *);
++extern tree c_oacc_split_loop_clauses (tree, tree *, bool);
+ extern void c_omp_split_clauses (location_t, enum tree_code, omp_clause_mask,
+ tree, tree *);
+ extern tree c_omp_declare_simd_clauses_to_numbers (tree, tree);
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/c-family/c-cppbuiltin.c gcc-6-20160721/gcc/c-family/c-cppbuiltin.c
+--- gcc-6.1.0/gcc/c-family/c-cppbuiltin.c 2016-04-20 13:24:29.000000000 +0000
++++ gcc-6-20160721/gcc/c-family/c-cppbuiltin.c 2016-07-05 17:55:36.000000000 +0000
+@@ -848,6 +848,7 @@
+ cpp_define (pfile, "__cpp_decltype=200707");
+ cpp_define (pfile, "__cpp_attributes=200809");
+ cpp_define (pfile, "__cpp_rvalue_reference=200610");
++ cpp_define (pfile, "__cpp_rvalue_references=200610");
+ cpp_define (pfile, "__cpp_variadic_templates=200704");
+ cpp_define (pfile, "__cpp_initializer_lists=200806");
+ cpp_define (pfile, "__cpp_delegating_constructors=200604");
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/c-family/c-gimplify.c gcc-6-20160721/gcc/c-family/c-gimplify.c
+--- gcc-6.1.0/gcc/c-family/c-gimplify.c 2016-01-27 17:17:23.000000000 +0000
++++ gcc-6-20160721/gcc/c-family/c-gimplify.c 2016-06-13 21:08:36.000000000 +0000
+@@ -67,23 +67,23 @@
+ {
+ hash_set<tree> *pset = (hash_set<tree> *) data;
+
+- /* Since walk_tree doesn't call the callback function on the decls
+- in BIND_EXPR_VARS, we have to walk them manually. */
+ if (TREE_CODE (*tp) == BIND_EXPR)
+ {
++ /* Since walk_tree doesn't call the callback function on the decls
++ in BIND_EXPR_VARS, we have to walk them manually, so we can avoid
++ instrumenting DECL_INITIAL of TREE_STATIC vars. */
++ *walk_subtrees = 0;
+ for (tree decl = BIND_EXPR_VARS (*tp); decl; decl = DECL_CHAIN (decl))
+ {
+ if (TREE_STATIC (decl))
+- {
+- *walk_subtrees = 0;
+- continue;
+- }
++ continue;
+ walk_tree (&DECL_INITIAL (decl), ubsan_walk_array_refs_r, pset,
+ pset);
+ walk_tree (&DECL_SIZE (decl), ubsan_walk_array_refs_r, pset, pset);
+ walk_tree (&DECL_SIZE_UNIT (decl), ubsan_walk_array_refs_r, pset,
+ pset);
+ }
++ walk_tree (&BIND_EXPR_BODY (*tp), ubsan_walk_array_refs_r, pset, pset);
+ }
+ else if (TREE_CODE (*tp) == ADDR_EXPR
+ && TREE_CODE (TREE_OPERAND (*tp, 0)) == ARRAY_REF)
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/c-family/c-omp.c gcc-6-20160721/gcc/c-family/c-omp.c
+--- gcc-6.1.0/gcc/c-family/c-omp.c 2016-01-18 14:48:26.000000000 +0000
++++ gcc-6-20160721/gcc/c-family/c-omp.c 2016-05-30 21:40:04.000000000 +0000
+@@ -861,9 +861,10 @@
+ #pragma acc parallel loop */
+
+ tree
+-c_oacc_split_loop_clauses (tree clauses, tree *not_loop_clauses)
++c_oacc_split_loop_clauses (tree clauses, tree *not_loop_clauses,
++ bool is_parallel)
+ {
+- tree next, loop_clauses;
++ tree next, loop_clauses, nc;
+
+ loop_clauses = *not_loop_clauses = NULL_TREE;
+ for (; clauses ; clauses = next)
+@@ -882,7 +883,23 @@
+ case OMP_CLAUSE_SEQ:
+ case OMP_CLAUSE_INDEPENDENT:
+ case OMP_CLAUSE_PRIVATE:
++ OMP_CLAUSE_CHAIN (clauses) = loop_clauses;
++ loop_clauses = clauses;
++ break;
++
++ /* Reductions must be duplicated on both constructs. */
+ case OMP_CLAUSE_REDUCTION:
++ if (is_parallel)
++ {
++ nc = build_omp_clause (OMP_CLAUSE_LOCATION (clauses),
++ OMP_CLAUSE_REDUCTION);
++ OMP_CLAUSE_DECL (nc) = OMP_CLAUSE_DECL (clauses);
++ OMP_CLAUSE_REDUCTION_CODE (nc)
++ = OMP_CLAUSE_REDUCTION_CODE (clauses);
++ OMP_CLAUSE_CHAIN (nc) = *not_loop_clauses;
++ *not_loop_clauses = nc;
++ }
++
+ OMP_CLAUSE_CHAIN (clauses) = loop_clauses;
+ loop_clauses = clauses;
+ break;
+@@ -966,6 +983,7 @@
+ case OMP_CLAUSE_MAP:
+ case OMP_CLAUSE_IS_DEVICE_PTR:
+ case OMP_CLAUSE_DEFAULTMAP:
++ case OMP_CLAUSE_DEPEND:
+ s = C_OMP_CLAUSE_SPLIT_TARGET;
+ break;
+ case OMP_CLAUSE_NUM_TEAMS:
+@@ -981,7 +999,6 @@
+ s = C_OMP_CLAUSE_SPLIT_PARALLEL;
+ break;
+ case OMP_CLAUSE_ORDERED:
+- case OMP_CLAUSE_NOWAIT:
+ s = C_OMP_CLAUSE_SPLIT_FOR;
+ break;
+ case OMP_CLAUSE_SCHEDULE:
+@@ -1316,6 +1333,18 @@
+ else
+ s = C_OMP_CLAUSE_SPLIT_FOR;
+ break;
++ case OMP_CLAUSE_NOWAIT:
++ /* Nowait clause is allowed on target, for and sections, but
++ is not allowed on parallel for or parallel sections. Therefore,
++ put it on target construct if present, because that can only
++ be combined with parallel for{, simd} and not with for{, simd},
++ otherwise to the worksharing construct. */
++ if ((mask & (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_MAP))
++ != 0)
++ s = C_OMP_CLAUSE_SPLIT_TARGET;
++ else
++ s = C_OMP_CLAUSE_SPLIT_FOR;
++ break;
+ default:
+ gcc_unreachable ();
+ }
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/c-family/c.opt gcc-6-20160721/gcc/c-family/c.opt
+--- gcc-6.1.0/gcc/c-family/c.opt 2016-03-23 17:51:56.000000000 +0000
++++ gcc-6-20160721/gcc/c-family/c.opt 2016-06-14 14:44:28.000000000 +0000
+@@ -265,7 +265,7 @@
+ Warn if a subobject has an abi_tag attribute that the complete object type does not have.
+
+ Wpsabi
+-C ObjC C++ ObjC++ LTO Var(warn_psabi) Init(1) Undocumented LangEnabledBy(C ObjC C++ ObjC++,Wabi)
++C ObjC C++ ObjC++ LTO Var(warn_psabi) Init(1) Warning Undocumented LangEnabledBy(C ObjC C++ ObjC++,Wabi)
+
+ Waddress
+ C ObjC C++ ObjC++ Var(warn_address) Warning LangEnabledBy(C ObjC C++ ObjC++,Wall)
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/calls.c gcc-6-20160721/gcc/calls.c
+--- gcc-6.1.0/gcc/calls.c 2016-03-18 15:31:18.000000000 +0000
++++ gcc-6-20160721/gcc/calls.c 2016-05-11 09:51:49.000000000 +0000
+@@ -1188,6 +1188,7 @@
+ j--;
+ }
+ }
++ argpos = 0;
+ FOR_EACH_CALL_EXPR_ARG (arg, iter, exp)
+ {
+ tree argtype = TREE_TYPE (arg);
+@@ -1206,6 +1207,14 @@
+ chkp_find_bound_slots (argtype, slots);
+ }
+ }
++ else if (CALL_WITH_BOUNDS_P (exp)
++ && pass_by_reference (NULL, TYPE_MODE (argtype), argtype,
++ argpos < n_named_args))
++ {
++ if (slots)
++ BITMAP_FREE (slots);
++ ptr_arg = j;
++ }
+ else if (POINTER_BOUNDS_TYPE_P (argtype))
+ {
+ /* We expect bounds in instrumented calls only.
+@@ -1249,6 +1258,7 @@
+ else
+ args[j].tree_value = arg;
+ j--;
++ argpos++;
+ }
+
+ if (slots)
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/cfgexpand.c gcc-6-20160721/gcc/cfgexpand.c
+--- gcc-6.1.0/gcc/cfgexpand.c 2016-04-14 16:23:06.000000000 +0000
++++ gcc-6-20160721/gcc/cfgexpand.c 2016-04-27 12:23:50.000000000 +0000
+@@ -1137,7 +1137,7 @@
+ HOST_WIDE_INT prev_offset
+ = align_base (frame_offset,
+ MAX (alignb, ASAN_RED_ZONE_SIZE),
+- FRAME_GROWS_DOWNWARD);
++ !FRAME_GROWS_DOWNWARD);
+ tree repr_decl = NULL_TREE;
+ offset
+ = alloc_stack_frame_space (stack_vars[i].size
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/cfgrtl.c gcc-6-20160721/gcc/cfgrtl.c
+--- gcc-6.1.0/gcc/cfgrtl.c 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/gcc/cfgrtl.c 2016-07-19 19:55:54.000000000 +0000
+@@ -572,8 +572,10 @@
+ {
+ rtx_insn *insn;
+
+- if (bb == EXIT_BLOCK_PTR_FOR_FN (cfun) || bb == ENTRY_BLOCK_PTR_FOR_FN (cfun)
+- || !single_succ_p (bb))
++ if (bb == EXIT_BLOCK_PTR_FOR_FN (cfun)
++ || bb == ENTRY_BLOCK_PTR_FOR_FN (cfun)
++ || !single_succ_p (bb)
++ || (single_succ_edge (bb)->flags & EDGE_FAKE) != 0)
+ return false;
+
+ for (insn = BB_HEAD (bb); insn != BB_END (bb); insn = NEXT_INSN (insn))
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/cgraph.c gcc-6-20160721/gcc/cgraph.c
+--- gcc-6.1.0/gcc/cgraph.c 2016-03-18 09:17:23.000000000 +0000
++++ gcc-6-20160721/gcc/cgraph.c 2016-06-03 08:27:40.000000000 +0000
+@@ -1504,10 +1504,21 @@
+ update_stmt_fn (DECL_STRUCT_FUNCTION (e->caller->decl), new_stmt);
+ }
+
++ /* If changing the call to __cxa_pure_virtual or similar noreturn function,
++ adjust gimple_call_fntype too. */
++ if (gimple_call_noreturn_p (new_stmt)
++ && VOID_TYPE_P (TREE_TYPE (TREE_TYPE (e->callee->decl)))
++ && TYPE_ARG_TYPES (TREE_TYPE (e->callee->decl))
++ && (TREE_VALUE (TYPE_ARG_TYPES (TREE_TYPE (e->callee->decl)))
++ == void_type_node))
++ gimple_call_set_fntype (new_stmt, TREE_TYPE (e->callee->decl));
++
+ /* If the call becomes noreturn, remove the LHS if possible. */
+ if (lhs
+ && (gimple_call_flags (new_stmt) & ECF_NORETURN)
+- && TREE_CODE (TYPE_SIZE_UNIT (TREE_TYPE (lhs))) == INTEGER_CST)
++ && (VOID_TYPE_P (TREE_TYPE (gimple_call_fntype (new_stmt)))
++ || (TREE_CODE (TYPE_SIZE_UNIT (TREE_TYPE (lhs))) == INTEGER_CST
++ && !TREE_ADDRESSABLE (TREE_TYPE (lhs)))))
+ {
+ if (TREE_CODE (lhs) == SSA_NAME)
+ {
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/config/aarch64/aarch64-simd-builtins.def gcc-6-20160721/gcc/config/aarch64/aarch64-simd-builtins.def
+--- gcc-6.1.0/gcc/config/aarch64/aarch64-simd-builtins.def 2016-01-15 17:50:01.000000000 +0000
++++ gcc-6-20160721/gcc/config/aarch64/aarch64-simd-builtins.def 2016-07-08 15:41:31.000000000 +0000
+@@ -244,13 +244,17 @@
+ /* Implemented by <maxmin><mode>3.
+ smax variants map to fmaxnm,
+ smax_nan variants map to fmax. */
+- BUILTIN_VDQIF (BINOP, smax, 3)
+- BUILTIN_VDQIF (BINOP, smin, 3)
++ BUILTIN_VDQ_BHSI (BINOP, smax, 3)
++ BUILTIN_VDQ_BHSI (BINOP, smin, 3)
+ BUILTIN_VDQ_BHSI (BINOP, umax, 3)
+ BUILTIN_VDQ_BHSI (BINOP, umin, 3)
+ BUILTIN_VDQF (BINOP, smax_nan, 3)
+ BUILTIN_VDQF (BINOP, smin_nan, 3)
+
++ /* Implemented by <fmaxmin><mode>3. */
++ BUILTIN_VDQF (BINOP, fmax, 3)
++ BUILTIN_VDQF (BINOP, fmin, 3)
++
+ /* Implemented by aarch64_<maxmin_uns>p<mode>. */
+ BUILTIN_VDQ_BHSI (BINOP, smaxp, 0)
+ BUILTIN_VDQ_BHSI (BINOP, sminp, 0)
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/config/aarch64/aarch64-simd.md gcc-6-20160721/gcc/config/aarch64/aarch64-simd.md
+--- gcc-6.1.0/gcc/config/aarch64/aarch64-simd.md 2016-02-26 23:41:53.000000000 +0000
++++ gcc-6-20160721/gcc/config/aarch64/aarch64-simd.md 2016-05-17 13:08:01.000000000 +0000
+@@ -1919,16 +1919,6 @@
+ }
+ )
+
+-(define_insn "aarch64_vmls<mode>"
+- [(set (match_operand:VDQF 0 "register_operand" "=w")
+- (minus:VDQF (match_operand:VDQF 1 "register_operand" "0")
+- (mult:VDQF (match_operand:VDQF 2 "register_operand" "w")
+- (match_operand:VDQF 3 "register_operand" "w"))))]
+- "TARGET_SIMD"
+- "fmls\\t%0.<Vtype>, %2.<Vtype>, %3.<Vtype>"
+- [(set_attr "type" "neon_fp_mla_<Vetype>_scalar<q>")]
+-)
+-
+ ;; FP Max/Min
+ ;; Max/Min are introduced by idiom recognition by GCC's mid-end. An
+ ;; expression like:
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/config/aarch64/arm_neon.h gcc-6-20160721/gcc/config/aarch64/arm_neon.h
+--- gcc-6.1.0/gcc/config/aarch64/arm_neon.h 2016-01-25 11:32:07.000000000 +0000
++++ gcc-6-20160721/gcc/config/aarch64/arm_neon.h 2016-07-08 15:41:31.000000000 +0000
+@@ -17856,19 +17856,19 @@
+ __extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
+ vmaxnm_f32 (float32x2_t __a, float32x2_t __b)
+ {
+- return __builtin_aarch64_smaxv2sf (__a, __b);
++ return __builtin_aarch64_fmaxv2sf (__a, __b);
+ }
+
+ __extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
+ vmaxnmq_f32 (float32x4_t __a, float32x4_t __b)
+ {
+- return __builtin_aarch64_smaxv4sf (__a, __b);
++ return __builtin_aarch64_fmaxv4sf (__a, __b);
+ }
+
+ __extension__ static __inline float64x2_t __attribute__ ((__always_inline__))
+ vmaxnmq_f64 (float64x2_t __a, float64x2_t __b)
+ {
+- return __builtin_aarch64_smaxv2df (__a, __b);
++ return __builtin_aarch64_fmaxv2df (__a, __b);
+ }
+
+ /* vmaxv */
+@@ -18086,19 +18086,19 @@
+ __extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
+ vminnm_f32 (float32x2_t __a, float32x2_t __b)
+ {
+- return __builtin_aarch64_sminv2sf (__a, __b);
++ return __builtin_aarch64_fminv2sf (__a, __b);
+ }
+
+ __extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
+ vminnmq_f32 (float32x4_t __a, float32x4_t __b)
+ {
+- return __builtin_aarch64_sminv4sf (__a, __b);
++ return __builtin_aarch64_fminv4sf (__a, __b);
+ }
+
+ __extension__ static __inline float64x2_t __attribute__ ((__always_inline__))
+ vminnmq_f64 (float64x2_t __a, float64x2_t __b)
+ {
+- return __builtin_aarch64_sminv2df (__a, __b);
++ return __builtin_aarch64_fminv2df (__a, __b);
+ }
+
+ /* vminv */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/config/alpha/alpha.md gcc-6-20160721/gcc/config/alpha/alpha.md
+--- gcc-6.1.0/gcc/config/alpha/alpha.md 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/gcc/config/alpha/alpha.md 2016-05-18 19:39:49.000000000 +0000
+@@ -3738,7 +3738,8 @@
+
+ ;; BUGCHK is documented common to OSF/1 and VMS PALcode.
+ (define_insn "trap"
+- [(trap_if (const_int 1) (const_int 0))]
++ [(trap_if (const_int 1) (const_int 0))
++ (use (reg:DI 29))]
+ ""
+ "call_pal 0x81"
+ [(set_attr "type" "callpal")])
+@@ -5157,7 +5158,7 @@
+ "TARGET_ABI_OSF"
+ {
+ if (TARGET_EXPLICIT_RELOCS)
+- return "ldah $29,0($26)\t\t!gpdisp!%*\;lda $29,0($29)\t\t!gpdisp!%*";
++ return "#";
+ else
+ return "ldgp $29,0($26)";
+ }
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/config/arm/arm-builtins.c gcc-6-20160721/gcc/config/arm/arm-builtins.c
+--- gcc-6.1.0/gcc/config/arm/arm-builtins.c 2016-01-21 09:52:46.000000000 +0000
++++ gcc-6-20160721/gcc/config/arm/arm-builtins.c 2016-05-31 08:29:39.000000000 +0000
+@@ -2861,6 +2861,10 @@
+ int in_n, out_n;
+ bool out_unsigned_p = TYPE_UNSIGNED (type_out);
+
++ /* Can't provide any vectorized builtins when we can't use NEON. */
++ if (!TARGET_NEON)
++ return NULL_TREE;
++
+ if (TREE_CODE (type_out) != VECTOR_TYPE
+ || TREE_CODE (type_in) != VECTOR_TYPE)
+ return NULL_TREE;
+@@ -2875,7 +2879,7 @@
+ NULL_TREE is returned if no such builtin is available. */
+ #undef ARM_CHECK_BUILTIN_MODE
+ #define ARM_CHECK_BUILTIN_MODE(C) \
+- (TARGET_NEON && TARGET_FPU_ARMV8 \
++ (TARGET_FPU_ARMV8 \
+ && flag_unsafe_math_optimizations \
+ && ARM_CHECK_BUILTIN_MODE_1 (C))
+
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/config/arm/arm.c gcc-6-20160721/gcc/config/arm/arm.c
+--- gcc-6.1.0/gcc/config/arm/arm.c 2016-03-30 12:48:42.000000000 +0000
++++ gcc-6-20160721/gcc/config/arm/arm.c 2016-07-01 07:40:37.000000000 +0000
+@@ -6704,7 +6704,7 @@
+
+ /* The PIC register is live on entry to VxWorks PLT entries, so we
+ must make the call before restoring the PIC register. */
+- if (TARGET_VXWORKS_RTP && flag_pic && !targetm.binds_local_p (decl))
++ if (TARGET_VXWORKS_RTP && flag_pic && decl && !targetm.binds_local_p (decl))
+ return false;
+
+ /* If we are interworking and the function is not declared static
+@@ -17755,6 +17755,7 @@
+ int num_saves = XVECLEN (operands[0], 0);
+ unsigned int regno;
+ unsigned int regno_base = REGNO (operands[1]);
++ bool interrupt_p = IS_INTERRUPT (arm_current_func_type ());
+
+ offset = 0;
+ offset += update ? 1 : 0;
+@@ -17772,20 +17773,16 @@
+ }
+
+ conditional = reverse ? "%?%D0" : "%?%d0";
+- if ((regno_base == SP_REGNUM) && update)
+- {
+- sprintf (pattern, "pop%s\t{", conditional);
+- }
++ /* Can't use POP if returning from an interrupt. */
++ if ((regno_base == SP_REGNUM) && update && !(interrupt_p && return_pc))
++ sprintf (pattern, "pop%s\t{", conditional);
+ else
+ {
+ /* Output ldmfd when the base register is SP, otherwise output ldmia.
+ It's just a convention, their semantics are identical. */
+ if (regno_base == SP_REGNUM)
+- /* update is never true here, hence there is no need to handle
+- pop here. */
+- sprintf (pattern, "ldmfd%s", conditional);
+-
+- if (update)
++ sprintf (pattern, "ldmfd%s\t", conditional);
++ else if (update)
+ sprintf (pattern, "ldmia%s\t", conditional);
+ else
+ sprintf (pattern, "ldm%s\t", conditional);
+@@ -17811,7 +17808,7 @@
+
+ strcat (pattern, "}");
+
+- if (IS_INTERRUPT (arm_current_func_type ()) && return_pc)
++ if (interrupt_p && return_pc)
+ strcat (pattern, "^");
+
+ output_asm_insn (pattern, &cond);
+@@ -19622,8 +19619,12 @@
+ sprintf (instr, "ldmfd%s\t%%|sp, {", conditional);
+ }
+ }
++ /* For interrupt returns we have to use an LDM rather than
++ a POP so that we can use the exception return variant. */
++ else if (IS_INTERRUPT (func_type))
++ sprintf (instr, "ldmfd%s\t%%|sp!, {", conditional);
+ else
+- sprintf (instr, "pop%s\t{", conditional);
++ sprintf (instr, "pop%s\t{", conditional);
+
+ p = instr + strlen (instr);
+
+@@ -21461,7 +21462,11 @@
+
+ /* Naked functions don't have prologues. */
+ if (IS_NAKED (func_type))
+- return;
++ {
++ if (flag_stack_usage_info)
++ current_function_static_stack_size = 0;
++ return;
++ }
+
+ /* Make a copy of c_f_p_a_s as we may need to modify it locally. */
+ args_to_push = crtl->args.pretend_args_size;
+@@ -24715,7 +24720,11 @@
+
+ /* Naked functions don't have prologues. */
+ if (IS_NAKED (func_type))
+- return;
++ {
++ if (flag_stack_usage_info)
++ current_function_static_stack_size = 0;
++ return;
++ }
+
+ if (IS_INTERRUPT (func_type))
+ {
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/config/arm/freebsd.h gcc-6-20160721/gcc/config/arm/freebsd.h
+--- gcc-6.1.0/gcc/config/arm/freebsd.h 2016-01-07 20:35:53.000000000 +0000
++++ gcc-6-20160721/gcc/config/arm/freebsd.h 2016-06-15 19:17:15.000000000 +0000
+@@ -120,6 +120,9 @@
+ #define SUBTARGET_CPU_DEFAULT TARGET_CPU_arm9
+ #endif
+
++/* FreeBSD 10 does not support unaligned access for armv6 and up.
++ Unaligned access support was added in FreeBSD 11. */
++#if FBSD_MAJOR < 11
+ #define SUBTARGET_OVERRIDE_INTERNAL_OPTIONS \
+ do { \
+ if (opts_set->x_unaligned_access == 1) \
+@@ -127,6 +130,7 @@
+ if (opts->x_unaligned_access) \
+ opts->x_unaligned_access = 0; \
+ } while (0)
++#endif
+
+ #undef MAX_SYNC_LIBFUNC_SIZE
+ #define MAX_SYNC_LIBFUNC_SIZE 4 /* UNITS_PER_WORD not defined yet. */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/config/avr/avr.c gcc-6-20160721/gcc/config/avr/avr.c
+--- gcc-6.1.0/gcc/config/avr/avr.c 2016-02-02 16:01:45.000000000 +0000
++++ gcc-6-20160721/gcc/config/avr/avr.c 2016-07-06 13:53:36.000000000 +0000
+@@ -9721,7 +9721,9 @@
+ {
+ const char *sname = ACONCAT ((new_prefix,
+ name + strlen (old_prefix), NULL));
+- return get_section (sname, sect->common.flags, sect->named.decl);
++ return get_section (sname,
++ sect->common.flags & ~SECTION_DECLARED,
++ sect->named.decl);
+ }
+ }
+
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/config/avr/avr.md gcc-6-20160721/gcc/config/avr/avr.md
+--- gcc-6.1.0/gcc/config/avr/avr.md 2016-03-15 16:21:49.000000000 +0000
++++ gcc-6-20160721/gcc/config/avr/avr.md 2016-06-21 10:23:08.000000000 +0000
+@@ -641,6 +641,22 @@
+ if (avr_mem_flash_p (dest))
+ DONE;
+
++ if (QImode == <MODE>mode
++ && SUBREG_P (src)
++ && CONSTANT_ADDRESS_P (SUBREG_REG (src))
++ && can_create_pseudo_p())
++ {
++ // store_bitfield may want to store a SYMBOL_REF or CONST in a
++ // structure that's represented as PSImode. As the upper 16 bits
++ // of PSImode cannot be expressed as an HImode subreg, the rhs is
++ // decomposed into QImode (word_mode) subregs of SYMBOL_REF,
++ // CONST or LABEL_REF; cf. PR71103.
++
++ rtx const_addr = SUBREG_REG (src);
++ operands[1] = src = copy_rtx (src);
++ SUBREG_REG (src) = copy_to_mode_reg (GET_MODE (const_addr), const_addr);
++ }
++
+ /* One of the operands has to be in a register. */
+ if (!register_operand (dest, <MODE>mode)
+ && !reg_or_0_operand (src, <MODE>mode))
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/config/avr/gen-avr-mmcu-specs.c gcc-6-20160721/gcc/config/avr/gen-avr-mmcu-specs.c
+--- gcc-6.1.0/gcc/config/avr/gen-avr-mmcu-specs.c 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/gcc/config/avr/gen-avr-mmcu-specs.c 2016-06-21 10:39:59.000000000 +0000
+@@ -27,7 +27,7 @@
+
+ #include "avr-devices.c"
+
+-// Get rid of "defaults.h". We just need tm.h for `WITH_AVRLIBS' and
++// Get rid of "defaults.h". We just need tm.h for `WITH_AVRLIBC' and
+ // and `WITH_RTEMS'. */
+ #define GCC_DEFAULTS_H
+
+@@ -242,12 +242,13 @@
+ fprintf (f, "*link_data_start:\n");
+ if (mcu->data_section_start
+ != arch->default_data_section_start)
+- fprintf (f, "\t-Tdata 0x%lX", 0x800000UL + mcu->data_section_start);
++ fprintf (f, "\t%%{!Tdata:-Tdata 0x%lX}",
++ 0x800000UL + mcu->data_section_start);
+ fprintf (f, "\n\n");
+
+ fprintf (f, "*link_text_start:\n");
+ if (mcu->text_section_start != 0x0)
+- fprintf (f, "\t-Ttext 0x%lX", 0UL + mcu->text_section_start);
++ fprintf (f, "\t%%{!Ttext:-Ttext 0x%lX}", 0UL + mcu->text_section_start);
+ fprintf (f, "\n\n");
+ }
+
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/config/darwin.h gcc-6-20160721/gcc/config/darwin.h
+--- gcc-6.1.0/gcc/config/darwin.h 2016-04-08 13:47:37.000000000 +0000
++++ gcc-6-20160721/gcc/config/darwin.h 2016-06-15 11:12:40.000000000 +0000
+@@ -179,6 +179,7 @@
+ %{L*} %(link_libgcc) %o %{fprofile-arcs|fprofile-generate*|coverage:-lgcov} \
+ %{fopenacc|fopenmp|%:gt(%{ftree-parallelize-loops=*:%*} 1): \
+ %{static|static-libgcc|static-libstdc++|static-libgfortran: libgomp.a%s; : -lgomp } } \
++ %{fcilkplus:%:include(libcilkrts.spec)%(link_cilkrts)} \
+ %{fgnu-tm: \
+ %{static|static-libgcc|static-libstdc++|static-libgfortran: libitm.a%s; : -litm } } \
+ %{!nostdlib:%{!nodefaultlibs:\
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/config/i386/constraints.md gcc-6-20160721/gcc/config/i386/constraints.md
+--- gcc-6.1.0/gcc/config/i386/constraints.md 2016-01-29 18:47:17.000000000 +0000
++++ gcc-6-20160721/gcc/config/i386/constraints.md 2016-05-25 08:04:09.000000000 +0000
+@@ -141,8 +141,12 @@
+ "(ix86_fpmath & FPMATH_387) ? FLOAT_REGS : NO_REGS"
+ "@internal Any x87 register when 80387 FP arithmetic is enabled.")
+
++;; Yr constraint is meant to be used in noavx contexts only, for VEX and EVEX
++;; the lower register numbers need the same instruction sizes as any other.
++;; In case Yr constraint is misused, try to limit the damage, by treating
++;; it as x constraint in avx mode, not v constraint.
+ (define_register_constraint "Yr"
+- "TARGET_SSE ? (X86_TUNE_AVOID_4BYTE_PREFIXES ? NO_REX_SSE_REGS : ALL_SSE_REGS) : NO_REGS"
++ "TARGET_SSE ? ((TARGET_AVOID_4BYTE_PREFIXES && !TARGET_AVX) ? NO_REX_SSE_REGS : SSE_REGS) : NO_REGS"
+ "@internal Lower SSE register when avoiding REX prefix and all SSE registers otherwise.")
+
+ ;; We use the B prefix to denote any number of internal operands:
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/config/i386/driver-i386.c gcc-6-20160721/gcc/config/i386/driver-i386.c
+--- gcc-6.1.0/gcc/config/i386/driver-i386.c 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/gcc/config/i386/driver-i386.c 2016-06-05 15:45:44.000000000 +0000
+@@ -637,33 +637,27 @@
+ }
+ else if (vendor == signature_CENTAUR_ebx)
+ {
+- if (arch)
++ processor = PROCESSOR_GENERIC;
++
++ switch (family)
+ {
+- switch (family)
+- {
+- case 6:
+- if (model > 9)
+- /* Use the default detection procedure. */
+- processor = PROCESSOR_GENERIC;
+- else if (model == 9)
+- cpu = "c3-2";
+- else if (model >= 6)
+- cpu = "c3";
+- else
+- processor = PROCESSOR_GENERIC;
+- break;
+- case 5:
+- if (has_3dnow)
+- cpu = "winchip2";
+- else if (has_mmx)
+- cpu = "winchip2-c6";
+- else
+- processor = PROCESSOR_GENERIC;
+- break;
+- default:
+- /* We have no idea. */
+- processor = PROCESSOR_GENERIC;
+- }
++ default:
++ /* We have no idea. */
++ break;
++
++ case 5:
++ if (has_3dnow || has_mmx)
++ processor = PROCESSOR_I486;
++ break;
++
++ case 6:
++ if (model > 9 || has_longmode)
++ /* Use the default detection procedure. */
++ ;
++ else if (model == 9)
++ processor = PROCESSOR_PENTIUMPRO;
++ else if (model >= 6)
++ processor = PROCESSOR_I486;
+ }
+ }
+ else
+@@ -694,7 +688,18 @@
+ /* Default. */
+ break;
+ case PROCESSOR_I486:
+- cpu = "i486";
++ if (arch && vendor == signature_CENTAUR_ebx)
++ {
++ if (model >= 6)
++ cpu = "c3";
++ else if (has_3dnow)
++ cpu = "winchip2";
++ else
++ /* Assume WinChip C6. */
++ cpu = "winchip-c6";
++ }
++ else
++ cpu = "i486";
+ break;
+ case PROCESSOR_PENTIUM:
+ if (arch && has_mmx)
+@@ -817,8 +822,13 @@
+ /* It is Pentium M. */
+ cpu = "pentium-m";
+ else if (has_sse)
+- /* It is Pentium III. */
+- cpu = "pentium3";
++ {
++ if (vendor == signature_CENTAUR_ebx)
++ cpu = "c3-2";
++ else
++ /* It is Pentium III. */
++ cpu = "pentium3";
++ }
+ else if (has_mmx)
+ /* It is Pentium II. */
+ cpu = "pentium2";
+@@ -902,6 +912,11 @@
+ else
+ cpu = "prescott";
+ }
++ else if (has_longmode)
++ /* Perhaps some emulator? Assume x86-64, otherwise gcc
++ -march=native would be unusable for 64-bit compilations,
++ as all the CPUs below are 32-bit only. */
++ cpu = "x86-64";
+ else if (has_sse2)
+ cpu = "pentium4";
+ else if (has_cmov)
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/config/i386/i386-builtin-types.def gcc-6-20160721/gcc/config/i386/i386-builtin-types.def
+--- gcc-6.1.0/gcc/config/i386/i386-builtin-types.def 2015-09-04 08:54:14.000000000 +0000
++++ gcc-6-20160721/gcc/config/i386/i386-builtin-types.def 2016-06-08 13:06:24.000000000 +0000
+@@ -292,6 +292,7 @@
+ DEF_FUNCTION_TYPE (V8DF, V2DF)
+ DEF_FUNCTION_TYPE (V16SI, V4SI)
+ DEF_FUNCTION_TYPE (V16SI, V8SI)
++DEF_FUNCTION_TYPE (V16SI, V16SF)
+ DEF_FUNCTION_TYPE (V16SI, V16SI, V16SI, UHI)
+ DEF_FUNCTION_TYPE (V8DI, V8DI, V8DI, UQI)
+ DEF_FUNCTION_TYPE (V8DI, PV8DI)
+@@ -1035,14 +1036,17 @@
+
+ DEF_FUNCTION_TYPE_ALIAS (V2DF_FTYPE_V2DF, ROUND)
+ DEF_FUNCTION_TYPE_ALIAS (V4DF_FTYPE_V4DF, ROUND)
++DEF_FUNCTION_TYPE_ALIAS (V8DF_FTYPE_V8DF, ROUND)
+ DEF_FUNCTION_TYPE_ALIAS (V4SF_FTYPE_V4SF, ROUND)
+ DEF_FUNCTION_TYPE_ALIAS (V8SF_FTYPE_V8SF, ROUND)
++DEF_FUNCTION_TYPE_ALIAS (V16SF_FTYPE_V16SF, ROUND)
+
+ DEF_FUNCTION_TYPE_ALIAS (V4SI_FTYPE_V2DF_V2DF, ROUND)
+ DEF_FUNCTION_TYPE_ALIAS (V8SI_FTYPE_V4DF_V4DF, ROUND)
+ DEF_FUNCTION_TYPE_ALIAS (V16SI_FTYPE_V8DF_V8DF, ROUND)
+ DEF_FUNCTION_TYPE_ALIAS (V4SI_FTYPE_V4SF, ROUND)
+ DEF_FUNCTION_TYPE_ALIAS (V8SI_FTYPE_V8SF, ROUND)
++DEF_FUNCTION_TYPE_ALIAS (V16SI_FTYPE_V16SF, ROUND)
+
+ DEF_FUNCTION_TYPE_ALIAS (INT_FTYPE_V2DF_V2DF, PTEST)
+ DEF_FUNCTION_TYPE_ALIAS (INT_FTYPE_V2DI_V2DI, PTEST)
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/config/i386/i386.c gcc-6-20160721/gcc/config/i386/i386.c
+--- gcc-6.1.0/gcc/config/i386/i386.c 2016-04-15 13:35:12.000000000 +0000
++++ gcc-6-20160721/gcc/config/i386/i386.c 2016-07-02 10:21:24.000000000 +0000
+@@ -18787,12 +18787,29 @@
+ of the register, once we have that information we may be able
+ to handle some of them more efficiently. */
+ if (can_create_pseudo_p ()
+- && register_operand (op0, mode)
+ && (CONSTANT_P (op1)
+ || (SUBREG_P (op1)
+ && CONSTANT_P (SUBREG_REG (op1))))
+- && !standard_sse_constant_p (op1))
+- op1 = validize_mem (force_const_mem (mode, op1));
++ && ((register_operand (op0, mode)
++ && !standard_sse_constant_p (op1))
++ /* ix86_expand_vector_move_misalign() does not like constants. */
++ || (SSE_REG_MODE_P (mode)
++ && MEM_P (op0)
++ && MEM_ALIGN (op0) < align)))
++ {
++ if (SUBREG_P (op1))
++ {
++ machine_mode imode = GET_MODE (SUBREG_REG (op1));
++ rtx r = force_const_mem (imode, SUBREG_REG (op1));
++ if (r)
++ r = validize_mem (r);
++ else
++ r = force_reg (imode, SUBREG_REG (op1));
++ op1 = simplify_gen_subreg (mode, r, imode, SUBREG_BYTE (op1));
++ }
++ else
++ op1 = validize_mem (force_const_mem (mode, op1));
++ }
+
+ /* We need to check memory alignment for SSE mode since attribute
+ can make operands unaligned. */
+@@ -18803,13 +18820,8 @@
+ {
+ rtx tmp[2];
+
+- /* ix86_expand_vector_move_misalign() does not like constants ... */
+- if (CONSTANT_P (op1)
+- || (SUBREG_P (op1)
+- && CONSTANT_P (SUBREG_REG (op1))))
+- op1 = validize_mem (force_const_mem (mode, op1));
+-
+- /* ... nor both arguments in memory. */
++ /* ix86_expand_vector_move_misalign() does not like both
++ arguments in memory. */
+ if (!register_operand (op0, mode)
+ && !register_operand (op1, mode))
+ op1 = force_reg (mode, op1);
+@@ -18895,7 +18907,7 @@
+ m = adjust_address (op0, mode, 0);
+ emit_insn (extract (m, op1, const0_rtx));
+ m = adjust_address (op0, mode, 16);
+- emit_insn (extract (m, op1, const1_rtx));
++ emit_insn (extract (m, copy_rtx (op1), const1_rtx));
+ }
+ else
+ emit_insn (store_unaligned (op0, op1));
+@@ -19203,7 +19215,7 @@
+ m = adjust_address (op0, V2SFmode, 0);
+ emit_insn (gen_sse_storelps (m, op1));
+ m = adjust_address (op0, V2SFmode, 8);
+- emit_insn (gen_sse_storehps (m, op1));
++ emit_insn (gen_sse_storehps (m, copy_rtx (op1)));
+ }
+ }
+ }
+@@ -23027,17 +23039,33 @@
+ switch (code)
+ {
+ case EQ:
+- return 0x08;
++ return 0x00;
+ case NE:
+ return 0x04;
+ case GT:
+- return 0x16;
++ return 0x0e;
+ case LE:
+- return 0x1a;
++ return 0x02;
+ case GE:
+- return 0x15;
++ return 0x0d;
+ case LT:
+- return 0x19;
++ return 0x01;
++ case UNLE:
++ return 0x0a;
++ case UNLT:
++ return 0x09;
++ case UNGE:
++ return 0x05;
++ case UNGT:
++ return 0x06;
++ case UNEQ:
++ return 0x18;
++ case LTGT:
++ return 0x0c;
++ case ORDERED:
++ return 0x07;
++ case UNORDERED:
++ return 0x03;
+ default:
+ gcc_unreachable ();
+ }
+@@ -30686,7 +30714,7 @@
+ IX86_BUILTIN_CVTPD2PS512,
+ IX86_BUILTIN_CVTPD2UDQ512,
+ IX86_BUILTIN_CVTPH2PS512,
+- IX86_BUILTIN_CVTPS2DQ512,
++ IX86_BUILTIN_CVTPS2DQ512_MASK,
+ IX86_BUILTIN_CVTPS2PD512,
+ IX86_BUILTIN_CVTPS2PH512,
+ IX86_BUILTIN_CVTPS2UDQ512,
+@@ -32126,14 +32154,25 @@
+ IX86_BUILTIN_COPYSIGNQ,
+
+ /* Vectorizer support builtins. */
+- IX86_BUILTIN_CEILPD_VEC_PACK_SFIX512,
+ IX86_BUILTIN_CPYSGNPS,
+ IX86_BUILTIN_CPYSGNPD,
+ IX86_BUILTIN_CPYSGNPS256,
+ IX86_BUILTIN_CPYSGNPS512,
+ IX86_BUILTIN_CPYSGNPD256,
+ IX86_BUILTIN_CPYSGNPD512,
++ IX86_BUILTIN_FLOORPS512,
++ IX86_BUILTIN_FLOORPD512,
++ IX86_BUILTIN_CEILPS512,
++ IX86_BUILTIN_CEILPD512,
++ IX86_BUILTIN_TRUNCPS512,
++ IX86_BUILTIN_TRUNCPD512,
++ IX86_BUILTIN_CVTPS2DQ512,
++ IX86_BUILTIN_VEC_PACK_SFIX512,
++ IX86_BUILTIN_FLOORPS_SFIX512,
+ IX86_BUILTIN_FLOORPD_VEC_PACK_SFIX512,
++ IX86_BUILTIN_CEILPS_SFIX512,
++ IX86_BUILTIN_CEILPD_VEC_PACK_SFIX512,
++ IX86_BUILTIN_ROUNDPS_AZ_SFIX512,
+ IX86_BUILTIN_ROUNDPD_AZ_VEC_PACK_SFIX512,
+
+
+@@ -32787,9 +32826,9 @@
+ { OPTION_MASK_ISA_LWP, CODE_FOR_lwp_llwpcb, "__builtin_ia32_llwpcb", IX86_BUILTIN_LLWPCB, UNKNOWN, (int) VOID_FTYPE_PVOID },
+ { OPTION_MASK_ISA_LWP, CODE_FOR_lwp_slwpcb, "__builtin_ia32_slwpcb", IX86_BUILTIN_SLWPCB, UNKNOWN, (int) PVOID_FTYPE_VOID },
+ { OPTION_MASK_ISA_LWP, CODE_FOR_lwp_lwpvalsi3, "__builtin_ia32_lwpval32", IX86_BUILTIN_LWPVAL32, UNKNOWN, (int) VOID_FTYPE_UINT_UINT_UINT },
+- { OPTION_MASK_ISA_LWP, CODE_FOR_lwp_lwpvaldi3, "__builtin_ia32_lwpval64", IX86_BUILTIN_LWPVAL64, UNKNOWN, (int) VOID_FTYPE_UINT64_UINT_UINT },
++ { OPTION_MASK_ISA_LWP | OPTION_MASK_ISA_64BIT, CODE_FOR_lwp_lwpvaldi3, "__builtin_ia32_lwpval64", IX86_BUILTIN_LWPVAL64, UNKNOWN, (int) VOID_FTYPE_UINT64_UINT_UINT },
+ { OPTION_MASK_ISA_LWP, CODE_FOR_lwp_lwpinssi3, "__builtin_ia32_lwpins32", IX86_BUILTIN_LWPINS32, UNKNOWN, (int) UCHAR_FTYPE_UINT_UINT_UINT },
+- { OPTION_MASK_ISA_LWP, CODE_FOR_lwp_lwpinsdi3, "__builtin_ia32_lwpins64", IX86_BUILTIN_LWPINS64, UNKNOWN, (int) UCHAR_FTYPE_UINT64_UINT_UINT },
++ { OPTION_MASK_ISA_LWP | OPTION_MASK_ISA_64BIT, CODE_FOR_lwp_lwpinsdi3, "__builtin_ia32_lwpins64", IX86_BUILTIN_LWPINS64, UNKNOWN, (int) UCHAR_FTYPE_UINT64_UINT_UINT },
+
+ /* FSGSBASE */
+ { OPTION_MASK_ISA_FSGSBASE | OPTION_MASK_ISA_64BIT, CODE_FOR_rdfsbasesi, "__builtin_ia32_rdfsbase32", IX86_BUILTIN_RDFSBASE32, UNKNOWN, (int) UNSIGNED_FTYPE_VOID },
+@@ -33724,12 +33763,12 @@
+
+ /* BMI */
+ { OPTION_MASK_ISA_BMI, CODE_FOR_bmi_bextr_si, "__builtin_ia32_bextr_u32", IX86_BUILTIN_BEXTR32, UNKNOWN, (int) UINT_FTYPE_UINT_UINT },
+- { OPTION_MASK_ISA_BMI, CODE_FOR_bmi_bextr_di, "__builtin_ia32_bextr_u64", IX86_BUILTIN_BEXTR64, UNKNOWN, (int) UINT64_FTYPE_UINT64_UINT64 },
++ { OPTION_MASK_ISA_BMI | OPTION_MASK_ISA_64BIT, CODE_FOR_bmi_bextr_di, "__builtin_ia32_bextr_u64", IX86_BUILTIN_BEXTR64, UNKNOWN, (int) UINT64_FTYPE_UINT64_UINT64 },
+ { OPTION_MASK_ISA_BMI, CODE_FOR_ctzhi2, "__builtin_ctzs", IX86_BUILTIN_CTZS, UNKNOWN, (int) UINT16_FTYPE_UINT16 },
+
+ /* TBM */
+ { OPTION_MASK_ISA_TBM, CODE_FOR_tbm_bextri_si, "__builtin_ia32_bextri_u32", IX86_BUILTIN_BEXTRI32, UNKNOWN, (int) UINT_FTYPE_UINT_UINT },
+- { OPTION_MASK_ISA_TBM, CODE_FOR_tbm_bextri_di, "__builtin_ia32_bextri_u64", IX86_BUILTIN_BEXTRI64, UNKNOWN, (int) UINT64_FTYPE_UINT64_UINT64 },
++ { OPTION_MASK_ISA_TBM | OPTION_MASK_ISA_64BIT, CODE_FOR_tbm_bextri_di, "__builtin_ia32_bextri_u64", IX86_BUILTIN_BEXTRI64, UNKNOWN, (int) UINT64_FTYPE_UINT64_UINT64 },
+
+ /* F16C */
+ { OPTION_MASK_ISA_F16C, CODE_FOR_vcvtph2ps, "__builtin_ia32_vcvtph2ps", IX86_BUILTIN_CVTPH2PS, UNKNOWN, (int) V4SF_FTYPE_V8HI },
+@@ -33739,11 +33778,11 @@
+
+ /* BMI2 */
+ { OPTION_MASK_ISA_BMI2, CODE_FOR_bmi2_bzhi_si3, "__builtin_ia32_bzhi_si", IX86_BUILTIN_BZHI32, UNKNOWN, (int) UINT_FTYPE_UINT_UINT },
+- { OPTION_MASK_ISA_BMI2, CODE_FOR_bmi2_bzhi_di3, "__builtin_ia32_bzhi_di", IX86_BUILTIN_BZHI64, UNKNOWN, (int) UINT64_FTYPE_UINT64_UINT64 },
++ { OPTION_MASK_ISA_BMI2 | OPTION_MASK_ISA_64BIT, CODE_FOR_bmi2_bzhi_di3, "__builtin_ia32_bzhi_di", IX86_BUILTIN_BZHI64, UNKNOWN, (int) UINT64_FTYPE_UINT64_UINT64 },
+ { OPTION_MASK_ISA_BMI2, CODE_FOR_bmi2_pdep_si3, "__builtin_ia32_pdep_si", IX86_BUILTIN_PDEP32, UNKNOWN, (int) UINT_FTYPE_UINT_UINT },
+- { OPTION_MASK_ISA_BMI2, CODE_FOR_bmi2_pdep_di3, "__builtin_ia32_pdep_di", IX86_BUILTIN_PDEP64, UNKNOWN, (int) UINT64_FTYPE_UINT64_UINT64 },
++ { OPTION_MASK_ISA_BMI2 | OPTION_MASK_ISA_64BIT, CODE_FOR_bmi2_pdep_di3, "__builtin_ia32_pdep_di", IX86_BUILTIN_PDEP64, UNKNOWN, (int) UINT64_FTYPE_UINT64_UINT64 },
+ { OPTION_MASK_ISA_BMI2, CODE_FOR_bmi2_pext_si3, "__builtin_ia32_pext_si", IX86_BUILTIN_PEXT32, UNKNOWN, (int) UINT_FTYPE_UINT_UINT },
+- { OPTION_MASK_ISA_BMI2, CODE_FOR_bmi2_pext_di3, "__builtin_ia32_pext_di", IX86_BUILTIN_PEXT64, UNKNOWN, (int) UINT64_FTYPE_UINT64_UINT64 },
++ { OPTION_MASK_ISA_BMI2 | OPTION_MASK_ISA_64BIT, CODE_FOR_bmi2_pext_di3, "__builtin_ia32_pext_di", IX86_BUILTIN_PEXT64, UNKNOWN, (int) UINT64_FTYPE_UINT64_UINT64 },
+
+ /* AVX512F */
+ { OPTION_MASK_ISA_AVX512F, CODE_FOR_avx512f_si512_256si, "__builtin_ia32_si512_256si", IX86_BUILTIN_SI512_SI256, UNKNOWN, (int) V16SI_FTYPE_V8SI },
+@@ -33948,6 +33987,17 @@
+ { OPTION_MASK_ISA_AVX512F, CODE_FOR_avx512f_sqrtv8df2, "__builtin_ia32_sqrtpd512", IX86_BUILTIN_SQRTPD512, UNKNOWN, (int) V8DF_FTYPE_V8DF },
+ { OPTION_MASK_ISA_AVX512F, CODE_FOR_sqrtv16sf2, "__builtin_ia32_sqrtps512", IX86_BUILTIN_SQRTPS_NR512, UNKNOWN, (int) V16SF_FTYPE_V16SF },
+ { OPTION_MASK_ISA_AVX512ER, CODE_FOR_avx512er_exp2v16sf, "__builtin_ia32_exp2ps", IX86_BUILTIN_EXP2PS, UNKNOWN, (int) V16SF_FTYPE_V16SF },
++ { OPTION_MASK_ISA_AVX512F, CODE_FOR_avx512f_roundps512, "__builtin_ia32_floorps512", IX86_BUILTIN_FLOORPS512, (enum rtx_code) ROUND_FLOOR, (int) V16SF_FTYPE_V16SF_ROUND },
++ { OPTION_MASK_ISA_AVX512F, CODE_FOR_avx512f_roundps512, "__builtin_ia32_ceilps512", IX86_BUILTIN_CEILPS512, (enum rtx_code) ROUND_CEIL, (int) V16SF_FTYPE_V16SF_ROUND },
++ { OPTION_MASK_ISA_AVX512F, CODE_FOR_avx512f_roundps512, "__builtin_ia32_truncps512", IX86_BUILTIN_TRUNCPS512, (enum rtx_code) ROUND_TRUNC, (int) V16SF_FTYPE_V16SF_ROUND },
++ { OPTION_MASK_ISA_AVX512F, CODE_FOR_avx512f_roundpd512, "__builtin_ia32_floorpd512", IX86_BUILTIN_FLOORPD512, (enum rtx_code) ROUND_FLOOR, (int) V8DF_FTYPE_V8DF_ROUND },
++ { OPTION_MASK_ISA_AVX512F, CODE_FOR_avx512f_roundpd512, "__builtin_ia32_ceilpd512", IX86_BUILTIN_CEILPD512, (enum rtx_code) ROUND_CEIL, (int) V8DF_FTYPE_V8DF_ROUND },
++ { OPTION_MASK_ISA_AVX512F, CODE_FOR_avx512f_roundpd512, "__builtin_ia32_truncpd512", IX86_BUILTIN_TRUNCPD512, (enum rtx_code) ROUND_TRUNC, (int) V8DF_FTYPE_V8DF_ROUND },
++ { OPTION_MASK_ISA_AVX512F, CODE_FOR_avx512f_fix_notruncv16sfv16si, "__builtin_ia32_cvtps2dq512", IX86_BUILTIN_CVTPS2DQ512, UNKNOWN, (int) V16SI_FTYPE_V16SF },
++ { OPTION_MASK_ISA_AVX512F, CODE_FOR_avx512f_vec_pack_sfix_v8df, "__builtin_ia32_vec_pack_sfix512", IX86_BUILTIN_VEC_PACK_SFIX512, UNKNOWN, (int) V16SI_FTYPE_V8DF_V8DF },
++ { OPTION_MASK_ISA_AVX512F, CODE_FOR_roundv16sf2_sfix, "__builtin_ia32_roundps_az_sfix512", IX86_BUILTIN_ROUNDPS_AZ_SFIX512, UNKNOWN, (int) V16SI_FTYPE_V16SF },
++ { OPTION_MASK_ISA_AVX512F, CODE_FOR_avx512f_roundps512_sfix, "__builtin_ia32_floorps_sfix512", IX86_BUILTIN_FLOORPS_SFIX512, (enum rtx_code) ROUND_FLOOR, (int) V16SI_FTYPE_V16SF_ROUND },
++ { OPTION_MASK_ISA_AVX512F, CODE_FOR_avx512f_roundps512_sfix, "__builtin_ia32_ceilps_sfix512", IX86_BUILTIN_CEILPS_SFIX512, (enum rtx_code) ROUND_CEIL, (int) V16SI_FTYPE_V16SF_ROUND },
+ { OPTION_MASK_ISA_AVX512F, CODE_FOR_roundv8df2_vec_pack_sfix, "__builtin_ia32_roundpd_az_vec_pack_sfix512", IX86_BUILTIN_ROUNDPD_AZ_VEC_PACK_SFIX512, UNKNOWN, (int) V16SI_FTYPE_V8DF_V8DF },
+ { OPTION_MASK_ISA_AVX512F, CODE_FOR_avx512f_roundpd_vec_pack_sfix512, "__builtin_ia32_floorpd_vec_pack_sfix512", IX86_BUILTIN_FLOORPD_VEC_PACK_SFIX512, (enum rtx_code) ROUND_FLOOR, (int) V16SI_FTYPE_V8DF_V8DF_ROUND },
+ { OPTION_MASK_ISA_AVX512F, CODE_FOR_avx512f_roundpd_vec_pack_sfix512, "__builtin_ia32_ceilpd_vec_pack_sfix512", IX86_BUILTIN_CEILPD_VEC_PACK_SFIX512, (enum rtx_code) ROUND_CEIL, (int) V16SI_FTYPE_V8DF_V8DF_ROUND },
+@@ -34864,7 +34914,7 @@
+ { OPTION_MASK_ISA_AVX512F, CODE_FOR_avx512f_cvtpd2ps512_mask_round, "__builtin_ia32_cvtpd2ps512_mask", IX86_BUILTIN_CVTPD2PS512, UNKNOWN, (int) V8SF_FTYPE_V8DF_V8SF_QI_INT },
+ { OPTION_MASK_ISA_AVX512F, CODE_FOR_ufix_notruncv8dfv8si2_mask_round, "__builtin_ia32_cvtpd2udq512_mask", IX86_BUILTIN_CVTPD2UDQ512, UNKNOWN, (int) V8SI_FTYPE_V8DF_V8SI_QI_INT },
+ { OPTION_MASK_ISA_AVX512F, CODE_FOR_avx512f_vcvtph2ps512_mask_round, "__builtin_ia32_vcvtph2ps512_mask", IX86_BUILTIN_CVTPH2PS512, UNKNOWN, (int) V16SF_FTYPE_V16HI_V16SF_HI_INT },
+- { OPTION_MASK_ISA_AVX512F, CODE_FOR_avx512f_fix_notruncv16sfv16si_mask_round, "__builtin_ia32_cvtps2dq512_mask", IX86_BUILTIN_CVTPS2DQ512, UNKNOWN, (int) V16SI_FTYPE_V16SF_V16SI_HI_INT },
++ { OPTION_MASK_ISA_AVX512F, CODE_FOR_avx512f_fix_notruncv16sfv16si_mask_round, "__builtin_ia32_cvtps2dq512_mask", IX86_BUILTIN_CVTPS2DQ512_MASK, UNKNOWN, (int) V16SI_FTYPE_V16SF_V16SI_HI_INT },
+ { OPTION_MASK_ISA_AVX512F, CODE_FOR_avx512f_cvtps2pd512_mask_round, "__builtin_ia32_cvtps2pd512_mask", IX86_BUILTIN_CVTPS2PD512, UNKNOWN, (int) V8DF_FTYPE_V8SF_V8DF_QI_INT },
+ { OPTION_MASK_ISA_AVX512F, CODE_FOR_avx512f_ufix_notruncv16sfv16si_mask_round, "__builtin_ia32_cvtps2udq512_mask", IX86_BUILTIN_CVTPS2UDQ512, UNKNOWN, (int) V16SI_FTYPE_V16SF_V16SI_HI_INT },
+ { OPTION_MASK_ISA_AVX512F, CODE_FOR_sse2_cvtsd2ss_round, "__builtin_ia32_cvtsd2ss_round", IX86_BUILTIN_CVTSD2SS_ROUND, UNKNOWN, (int) V4SF_FTYPE_V4SF_V2DF_INT },
+@@ -38441,10 +38491,13 @@
+ {
+ case V2DF_FTYPE_V2DF_ROUND:
+ case V4DF_FTYPE_V4DF_ROUND:
++ case V8DF_FTYPE_V8DF_ROUND:
+ case V4SF_FTYPE_V4SF_ROUND:
+ case V8SF_FTYPE_V8SF_ROUND:
++ case V16SF_FTYPE_V16SF_ROUND:
+ case V4SI_FTYPE_V4SF_ROUND:
+ case V8SI_FTYPE_V8SF_ROUND:
++ case V16SI_FTYPE_V16SF_ROUND:
+ return ix86_expand_sse_round (d, exp, target);
+ case V4SI_FTYPE_V2DF_V2DF_ROUND:
+ case V8SI_FTYPE_V4DF_V4DF_ROUND:
+@@ -38558,6 +38611,7 @@
+ case V16SI_FTYPE_V8SI:
+ case V16SF_FTYPE_V4SF:
+ case V16SI_FTYPE_V4SI:
++ case V16SI_FTYPE_V16SF:
+ case V16SF_FTYPE_V16SF:
+ case V8DI_FTYPE_UQI:
+ case V8DF_FTYPE_V4DF:
+@@ -42263,6 +42317,8 @@
+ return ix86_get_builtin (IX86_BUILTIN_FLOORPS_SFIX);
+ else if (out_n == 8 && in_n == 8)
+ return ix86_get_builtin (IX86_BUILTIN_FLOORPS_SFIX256);
++ else if (out_n == 16 && in_n == 16)
++ return ix86_get_builtin (IX86_BUILTIN_FLOORPS_SFIX512);
+ }
+ break;
+
+@@ -42288,6 +42344,8 @@
+ return ix86_get_builtin (IX86_BUILTIN_CEILPS_SFIX);
+ else if (out_n == 8 && in_n == 8)
+ return ix86_get_builtin (IX86_BUILTIN_CEILPS_SFIX256);
++ else if (out_n == 16 && in_n == 16)
++ return ix86_get_builtin (IX86_BUILTIN_CEILPS_SFIX512);
+ }
+ break;
+
+@@ -42300,6 +42358,8 @@
+ return ix86_get_builtin (IX86_BUILTIN_VEC_PACK_SFIX);
+ else if (out_n == 8 && in_n == 4)
+ return ix86_get_builtin (IX86_BUILTIN_VEC_PACK_SFIX256);
++ else if (out_n == 16 && in_n == 8)
++ return ix86_get_builtin (IX86_BUILTIN_VEC_PACK_SFIX512);
+ }
+ if (out_mode == SImode && in_mode == SFmode)
+ {
+@@ -42307,6 +42367,8 @@
+ return ix86_get_builtin (IX86_BUILTIN_CVTPS2DQ);
+ else if (out_n == 8 && in_n == 8)
+ return ix86_get_builtin (IX86_BUILTIN_CVTPS2DQ256);
++ else if (out_n == 16 && in_n == 16)
++ return ix86_get_builtin (IX86_BUILTIN_CVTPS2DQ512);
+ }
+ break;
+
+@@ -42332,6 +42394,8 @@
+ return ix86_get_builtin (IX86_BUILTIN_ROUNDPS_AZ_SFIX);
+ else if (out_n == 8 && in_n == 8)
+ return ix86_get_builtin (IX86_BUILTIN_ROUNDPS_AZ_SFIX256);
++ else if (out_n == 16 && in_n == 16)
++ return ix86_get_builtin (IX86_BUILTIN_ROUNDPS_AZ_SFIX512);
+ }
+ break;
+
+@@ -42346,6 +42410,8 @@
+ return ix86_get_builtin (IX86_BUILTIN_FLOORPD);
+ else if (out_n == 4 && in_n == 4)
+ return ix86_get_builtin (IX86_BUILTIN_FLOORPD256);
++ else if (out_n == 8 && in_n == 8)
++ return ix86_get_builtin (IX86_BUILTIN_FLOORPD512);
+ }
+ if (out_mode == SFmode && in_mode == SFmode)
+ {
+@@ -42353,6 +42419,8 @@
+ return ix86_get_builtin (IX86_BUILTIN_FLOORPS);
+ else if (out_n == 8 && in_n == 8)
+ return ix86_get_builtin (IX86_BUILTIN_FLOORPS256);
++ else if (out_n == 16 && in_n == 16)
++ return ix86_get_builtin (IX86_BUILTIN_FLOORPS512);
+ }
+ break;
+
+@@ -42367,6 +42435,8 @@
+ return ix86_get_builtin (IX86_BUILTIN_CEILPD);
+ else if (out_n == 4 && in_n == 4)
+ return ix86_get_builtin (IX86_BUILTIN_CEILPD256);
++ else if (out_n == 8 && in_n == 8)
++ return ix86_get_builtin (IX86_BUILTIN_CEILPD512);
+ }
+ if (out_mode == SFmode && in_mode == SFmode)
+ {
+@@ -42374,6 +42444,8 @@
+ return ix86_get_builtin (IX86_BUILTIN_CEILPS);
+ else if (out_n == 8 && in_n == 8)
+ return ix86_get_builtin (IX86_BUILTIN_CEILPS256);
++ else if (out_n == 16 && in_n == 16)
++ return ix86_get_builtin (IX86_BUILTIN_CEILPS512);
+ }
+ break;
+
+@@ -42388,6 +42460,8 @@
+ return ix86_get_builtin (IX86_BUILTIN_TRUNCPD);
+ else if (out_n == 4 && in_n == 4)
+ return ix86_get_builtin (IX86_BUILTIN_TRUNCPD256);
++ else if (out_n == 8 && in_n == 8)
++ return ix86_get_builtin (IX86_BUILTIN_TRUNCPD512);
+ }
+ if (out_mode == SFmode && in_mode == SFmode)
+ {
+@@ -42395,6 +42469,8 @@
+ return ix86_get_builtin (IX86_BUILTIN_TRUNCPS);
+ else if (out_n == 8 && in_n == 8)
+ return ix86_get_builtin (IX86_BUILTIN_TRUNCPS256);
++ else if (out_n == 16 && in_n == 16)
++ return ix86_get_builtin (IX86_BUILTIN_TRUNCPS512);
+ }
+ break;
+
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/config/i386/i386.h gcc-6-20160721/gcc/config/i386/i386.h
+--- gcc-6.1.0/gcc/config/i386/i386.h 2016-03-30 03:57:30.000000000 +0000
++++ gcc-6-20160721/gcc/config/i386/i386.h 2016-05-25 08:04:09.000000000 +0000
+@@ -465,6 +465,8 @@
+ ix86_tune_features[X86_TUNE_SLOW_PSHUFB]
+ #define TARGET_VECTOR_PARALLEL_EXECUTION \
+ ix86_tune_features[X86_TUNE_VECTOR_PARALLEL_EXECUTION]
++#define TARGET_AVOID_4BYTE_PREFIXES \
++ ix86_tune_features[X86_TUNE_AVOID_4BYTE_PREFIXES]
+ #define TARGET_FUSE_CMP_AND_BRANCH_32 \
+ ix86_tune_features[X86_TUNE_FUSE_CMP_AND_BRANCH_32]
+ #define TARGET_FUSE_CMP_AND_BRANCH_64 \
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/config/i386/i386.md gcc-6-20160721/gcc/config/i386/i386.md
+--- gcc-6.1.0/gcc/config/i386/i386.md 2016-04-15 13:35:12.000000000 +0000
++++ gcc-6-20160721/gcc/config/i386/i386.md 2016-06-16 09:29:24.000000000 +0000
+@@ -9332,7 +9332,7 @@
+ })
+
+ (define_split
+- [(set (match_operand:SF 0 "register_operand")
++ [(set (match_operand:SF 0 "general_reg_operand")
+ (match_operator:SF 1 "absneg_operator" [(match_dup 0)]))
+ (use (match_operand:V4SF 2))
+ (clobber (reg:CC FLAGS_REG))]
+@@ -9356,7 +9356,7 @@
+ })
+
+ (define_split
+- [(set (match_operand:DF 0 "register_operand")
++ [(set (match_operand:DF 0 "general_reg_operand")
+ (match_operator:DF 1 "absneg_operator" [(match_dup 0)]))
+ (use (match_operand 2))
+ (clobber (reg:CC FLAGS_REG))]
+@@ -9394,7 +9394,7 @@
+ })
+
+ (define_split
+- [(set (match_operand:XF 0 "register_operand")
++ [(set (match_operand:XF 0 "general_reg_operand")
+ (match_operator:XF 1 "absneg_operator" [(match_dup 0)]))
+ (use (match_operand 2))
+ (clobber (reg:CC FLAGS_REG))]
+@@ -11078,20 +11078,19 @@
+ (const_int 1))
+ (clobber (reg:CC FLAGS_REG))])]
+ "TARGET_64BIT && !TARGET_USE_BT"
+- [(const_int 0)]
++ [(parallel [(set (match_dup 0)
++ (ior:DI (match_dup 0) (match_dup 3)))
++ (clobber (reg:CC FLAGS_REG))])]
+ {
+ int i = INTVAL (operands[1]);
+
+- rtx op1 = gen_int_mode (HOST_WIDE_INT_1U << i, DImode);
++ operands[3] = gen_int_mode (HOST_WIDE_INT_1U << i, DImode);
+
+- if (i >= 31)
++ if (!x86_64_immediate_operand (operands[3], DImode))
+ {
+- emit_move_insn (operands[2], op1);
+- op1 = operands[2];
++ emit_move_insn (operands[2], operands[3]);
++ operands[3] = operands[2];
+ }
+-
+- emit_insn (gen_iordi3 (operands[0], operands[0], op1));
+- DONE;
+ })
+
+ (define_peephole2
+@@ -11103,20 +11102,19 @@
+ (const_int 0))
+ (clobber (reg:CC FLAGS_REG))])]
+ "TARGET_64BIT && !TARGET_USE_BT"
+- [(const_int 0)]
++ [(parallel [(set (match_dup 0)
++ (and:DI (match_dup 0) (match_dup 3)))
++ (clobber (reg:CC FLAGS_REG))])]
+ {
+ int i = INTVAL (operands[1]);
+
+- rtx op1 = gen_int_mode (HOST_WIDE_INT_1U << i, DImode);
++ operands[3] = gen_int_mode (~(HOST_WIDE_INT_1U << i), DImode);
+
+- if (i >= 32)
++ if (!x86_64_immediate_operand (operands[3], DImode))
+ {
+- emit_move_insn (operands[2], op1);
+- op1 = operands[2];
++ emit_move_insn (operands[2], operands[3]);
++ operands[3] = operands[2];
+ }
+-
+- emit_insn (gen_anddi3 (operands[0], operands[0], op1));
+- DONE;
+ })
+
+ (define_peephole2
+@@ -11129,20 +11127,19 @@
+ (match_dup 0) (const_int 1) (match_dup 1))))
+ (clobber (reg:CC FLAGS_REG))])]
+ "TARGET_64BIT && !TARGET_USE_BT"
+- [(const_int 0)]
++ [(parallel [(set (match_dup 0)
++ (xor:DI (match_dup 0) (match_dup 3)))
++ (clobber (reg:CC FLAGS_REG))])]
+ {
+ int i = INTVAL (operands[1]);
+
+- rtx op1 = gen_int_mode (HOST_WIDE_INT_1U << i, DImode);
++ operands[3] = gen_int_mode (HOST_WIDE_INT_1U << i, DImode);
+
+- if (i >= 31)
++ if (!x86_64_immediate_operand (operands[3], DImode))
+ {
+- emit_move_insn (operands[2], op1);
+- op1 = operands[2];
++ emit_move_insn (operands[2], operands[3]);
++ operands[3] = operands[2];
+ }
+-
+- emit_insn (gen_xordi3 (operands[0], operands[0], op1));
+- DONE;
+ })
+
+ (define_insn "*bt<mode>"
+@@ -11859,8 +11856,7 @@
+ "(peep2_reg_dead_p (3, operands[1])
+ || operands_match_p (operands[1], operands[3]))
+ && ! reg_overlap_mentioned_p (operands[3], operands[0])
+- && ! (GET_CODE (operands[4]) == CLOBBER
+- && reg_mentioned_p (operands[3], operands[4]))"
++ && ! reg_set_p (operands[3], operands[4])"
+ [(parallel [(set (match_dup 5) (match_dup 0))
+ (match_dup 4)])
+ (set (strict_low_part (match_dup 6))
+@@ -11904,8 +11900,7 @@
+ "(peep2_reg_dead_p (3, operands[1])
+ || operands_match_p (operands[1], operands[3]))
+ && ! reg_overlap_mentioned_p (operands[3], operands[0])
+- && ! (GET_CODE (operands[4]) == CLOBBER
+- && reg_mentioned_p (operands[3], operands[4]))"
++ && ! reg_set_p (operands[3], operands[4])"
+ [(parallel [(set (match_dup 5) (match_dup 0))
+ (match_dup 4)])
+ (set (strict_low_part (match_dup 6))
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/config/i386/predicates.md gcc-6-20160721/gcc/config/i386/predicates.md
+--- gcc-6.1.0/gcc/config/i386/predicates.md 2016-01-05 20:19:16.000000000 +0000
++++ gcc-6-20160721/gcc/config/i386/predicates.md 2016-04-27 13:35:03.000000000 +0000
+@@ -637,7 +637,7 @@
+ (op, mode == VOIDmode ? mode : Pmode)")
+ (match_operand 0 "call_register_no_elim_operand")
+ (ior (and (not (match_test "TARGET_X32"))
+- (match_operand 0 "sibcall_memory_operand"))
++ (match_operand 0 "memory_operand"))
+ (and (match_test "TARGET_X32 && Pmode == DImode")
+ (match_operand 0 "GOT_memory_operand")))))
+
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/config/i386/sse.md gcc-6-20160721/gcc/config/i386/sse.md
+--- gcc-6.1.0/gcc/config/i386/sse.md 2016-04-15 15:53:01.000000000 +0000
++++ gcc-6-20160721/gcc/config/i386/sse.md 2016-06-08 13:06:24.000000000 +0000
+@@ -4488,7 +4488,7 @@
+ (set_attr "prefix" "maybe_vex")
+ (set_attr "mode" "<sseinsnmode>")])
+
+-(define_insn "<mask_codefor>avx512f_fix_notruncv16sfv16si<mask_name><round_name>"
++(define_insn "avx512f_fix_notruncv16sfv16si<mask_name><round_name>"
+ [(set (match_operand:V16SI 0 "register_operand" "=v")
+ (unspec:V16SI
+ [(match_operand:V16SF 1 "<round_nimm_predicate>" "<round_constraint>")]
+@@ -5046,7 +5046,7 @@
+ (set_attr "ssememalign" "64")
+ (set_attr "mode" "V2DF")])
+
+-(define_insn "<mask_codefor>avx512f_cvtpd2dq512<mask_name><round_name>"
++(define_insn "avx512f_cvtpd2dq512<mask_name><round_name>"
+ [(set (match_operand:V8SI 0 "register_operand" "=v")
+ (unspec:V8SI
+ [(match_operand:V8DF 1 "<round_nimm_predicate>" "<round_constraint>")]
+@@ -6006,6 +6006,23 @@
+ DONE;
+ })
+
++(define_expand "avx512f_vec_pack_sfix_v8df"
++ [(match_operand:V16SI 0 "register_operand")
++ (match_operand:V8DF 1 "nonimmediate_operand")
++ (match_operand:V8DF 2 "nonimmediate_operand")]
++ "TARGET_AVX512F"
++{
++ rtx r1, r2;
++
++ r1 = gen_reg_rtx (V8SImode);
++ r2 = gen_reg_rtx (V8SImode);
++
++ emit_insn (gen_avx512f_cvtpd2dq512 (r1, operands[1]));
++ emit_insn (gen_avx512f_cvtpd2dq512 (r2, operands[2]));
++ emit_insn (gen_avx_vec_concatv16si (operands[0], r1, r2));
++ DONE;
++})
++
+ (define_expand "vec_pack_sfix_v4df"
+ [(match_operand:V8SI 0 "register_operand")
+ (match_operand:V4DF 1 "nonimmediate_operand")
+@@ -10566,22 +10583,23 @@
+ (set_attr "mode" "<sseinsnmode>")])
+
+ (define_insn "<shift_insn><mode>3<mask_name>"
+- [(set (match_operand:VI48_AVX2 0 "register_operand" "=x,v")
++ [(set (match_operand:VI48_AVX2 0 "register_operand" "=x,x,v")
+ (any_lshift:VI48_AVX2
+- (match_operand:VI48_AVX2 1 "register_operand" "0,v")
+- (match_operand:SI 2 "nonmemory_operand" "xN,vN")))]
++ (match_operand:VI48_AVX2 1 "register_operand" "0,x,v")
++ (match_operand:SI 2 "nonmemory_operand" "xN,xN,vN")))]
+ "TARGET_SSE2 && <mask_mode512bit_condition>"
+ "@
+ p<vshift><ssemodesuffix>\t{%2, %0|%0, %2}
+- vp<vshift><ssemodesuffix>\t{%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2}"
+- [(set_attr "isa" "noavx,avx")
++ vp<vshift><ssemodesuffix>\t{%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2}
++ vp<vshift><ssemodesuffix>\t{%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2}"
++ [(set_attr "isa" "noavx,avx,avx512bw")
+ (set_attr "type" "sseishft")
+ (set (attr "length_immediate")
+ (if_then_else (match_operand 2 "const_int_operand")
+ (const_string "1")
+ (const_string "0")))
+- (set_attr "prefix_data16" "1,*")
+- (set_attr "prefix" "orig,vex")
++ (set_attr "prefix_data16" "1,*,*")
++ (set_attr "prefix" "orig,vex,evex")
+ (set_attr "mode" "<sseinsnmode>")])
+
+ (define_insn "<shift_insn><mode>3<mask_name>"
+@@ -15246,13 +15264,25 @@
+ DONE;
+ })
+
+-(define_expand "avx512f_roundpd512"
+- [(match_operand:V8DF 0 "register_operand")
+- (match_operand:V8DF 1 "nonimmediate_operand")
++(define_expand "avx512f_round<castmode>512"
++ [(match_operand:VF_512 0 "register_operand")
++ (match_operand:VF_512 1 "nonimmediate_operand")
++ (match_operand:SI 2 "const_0_to_15_operand")]
++ "TARGET_AVX512F"
++{
++ emit_insn (gen_avx512f_rndscale<mode> (operands[0], operands[1], operands[2]));
++ DONE;
++})
++
++(define_expand "avx512f_roundps512_sfix"
++ [(match_operand:V16SI 0 "register_operand")
++ (match_operand:V16SF 1 "nonimmediate_operand")
+ (match_operand:SI 2 "const_0_to_15_operand")]
+ "TARGET_AVX512F"
+ {
+- emit_insn (gen_avx512f_rndscalev8df (operands[0], operands[1], operands[2]));
++ rtx tmp = gen_reg_rtx (V16SFmode);
++ emit_insn (gen_avx512f_rndscalev16sf (tmp, operands[1], operands[2]));
++ emit_insn (gen_fix_truncv16sfv16si2 (operands[0], tmp));
+ DONE;
+ })
+
+@@ -15352,7 +15382,7 @@
+
+ (define_expand "round<mode>2_sfix"
+ [(match_operand:<sseintvecmode> 0 "register_operand")
+- (match_operand:VF1_128_256 1 "register_operand")]
++ (match_operand:VF1 1 "register_operand")]
+ "TARGET_ROUND && !flag_trapping_math"
+ {
+ rtx tmp = gen_reg_rtx (<MODE>mode);
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/config/microblaze/rtems.h gcc-6-20160721/gcc/config/microblaze/rtems.h
+--- gcc-6.1.0/gcc/config/microblaze/rtems.h 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/gcc/config/microblaze/rtems.h 2016-05-10 07:00:22.000000000 +0000
+@@ -23,3 +23,10 @@
+ builtin_define( "__rtems__" ); \
+ builtin_assert( "system=rtems" ); \
+ } while (0)
++
++/* Redefine to include only items relevant for RTEMS */
++#undef LINK_SPEC
++#define LINK_SPEC "%{shared:-shared} -N -relax \
++ %{mbig-endian:-EB --oformat=elf32-microblaze} \
++ %{mlittle-endian:-EL --oformat=elf32-microblazeel} \
++ %{mxl-gp-opt:%{G*}} %{!mxl-gp-opt: -G 0}"
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/config/nvptx/nvptx.c gcc-6-20160721/gcc/config/nvptx/nvptx.c
+--- gcc-6.1.0/gcc/config/nvptx/nvptx.c 2016-03-21 15:31:50.000000000 +0000
++++ gcc-6-20160721/gcc/config/nvptx/nvptx.c 2016-05-17 16:08:37.000000000 +0000
+@@ -483,7 +483,7 @@
+ static rtx
+ nvptx_libcall_value (machine_mode mode, const_rtx)
+ {
+- if (!cfun->machine->doing_call)
++ if (!cfun || !cfun->machine->doing_call)
+ /* Pretend to return in a hard reg for early uses before pseudos can be
+ generated. */
+ return gen_rtx_REG (mode, NVPTX_RETURN_REGNUM);
+@@ -502,6 +502,7 @@
+
+ if (outgoing)
+ {
++ gcc_assert (cfun);
+ cfun->machine->return_mode = mode;
+ return gen_rtx_REG (mode, NVPTX_RETURN_REGNUM);
+ }
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/config/pa/pa.c gcc-6-20160721/gcc/config/pa/pa.c
+--- gcc-6.1.0/gcc/config/pa/pa.c 2016-01-12 01:35:23.000000000 +0000
++++ gcc-6-20160721/gcc/config/pa/pa.c 2016-07-20 22:35:50.000000000 +0000
+@@ -4541,63 +4541,78 @@
+ lcla2 and load_offset_label_address insn patterns. */
+ rtx reg = gen_reg_rtx (SImode);
+ rtx_code_label *label_rtx = gen_label_rtx ();
+- rtx begin_label_rtx;
++ rtx mcount = gen_rtx_MEM (Pmode, gen_rtx_SYMBOL_REF (Pmode, "_mcount"));
++ int reg_parm_stack_space = REG_PARM_STACK_SPACE (NULL_TREE);
++ rtx arg_bytes, begin_label_rtx;
+ rtx_insn *call_insn;
+ char begin_label_name[16];
++ bool use_mcount_pcrel_call;
++
++ /* If we can reach _mcount with a pc-relative call, we can optimize
++ loading the address of the current function. This requires linker
++ long branch stub support. */
++ if (!TARGET_PORTABLE_RUNTIME
++ && !TARGET_LONG_CALLS
++ && (TARGET_SOM || flag_function_sections))
++ use_mcount_pcrel_call = TRUE;
++ else
++ use_mcount_pcrel_call = FALSE;
+
+ ASM_GENERATE_INTERNAL_LABEL (begin_label_name, FUNC_BEGIN_PROLOG_LABEL,
+ label_no);
+ begin_label_rtx = gen_rtx_SYMBOL_REF (SImode, ggc_strdup (begin_label_name));
+
+- if (TARGET_64BIT)
+- emit_move_insn (arg_pointer_rtx,
+- gen_rtx_PLUS (word_mode, virtual_outgoing_args_rtx,
+- GEN_INT (64)));
+-
+ emit_move_insn (gen_rtx_REG (word_mode, 26), gen_rtx_REG (word_mode, 2));
+
+- /* The address of the function is loaded into %r25 with an instruction-
+- relative sequence that avoids the use of relocations. The sequence
+- is split so that the load_offset_label_address instruction can
+- occupy the delay slot of the call to _mcount. */
+- if (TARGET_PA_20)
+- emit_insn (gen_lcla2 (reg, label_rtx));
+- else
+- emit_insn (gen_lcla1 (reg, label_rtx));
+-
+- emit_insn (gen_load_offset_label_address (gen_rtx_REG (SImode, 25),
+- reg, begin_label_rtx, label_rtx));
+-
+-#if !NO_DEFERRED_PROFILE_COUNTERS
+- {
+- rtx count_label_rtx, addr, r24;
+- char count_label_name[16];
+-
+- funcdef_nos.safe_push (label_no);
+- ASM_GENERATE_INTERNAL_LABEL (count_label_name, "LP", label_no);
+- count_label_rtx = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (count_label_name));
+-
+- addr = force_reg (Pmode, count_label_rtx);
+- r24 = gen_rtx_REG (Pmode, 24);
+- emit_move_insn (r24, addr);
+-
+- call_insn =
+- emit_call_insn (gen_call (gen_rtx_MEM (Pmode,
+- gen_rtx_SYMBOL_REF (Pmode,
+- "_mcount")),
+- GEN_INT (TARGET_64BIT ? 24 : 12)));
+-
+- use_reg (&CALL_INSN_FUNCTION_USAGE (call_insn), r24);
+- }
+-#else
+-
+- call_insn =
+- emit_call_insn (gen_call (gen_rtx_MEM (Pmode,
+- gen_rtx_SYMBOL_REF (Pmode,
+- "_mcount")),
+- GEN_INT (TARGET_64BIT ? 16 : 8)));
++ if (!use_mcount_pcrel_call)
++ {
++ /* The address of the function is loaded into %r25 with an instruction-
++ relative sequence that avoids the use of relocations. The sequence
++ is split so that the load_offset_label_address instruction can
++ occupy the delay slot of the call to _mcount. */
++ if (TARGET_PA_20)
++ emit_insn (gen_lcla2 (reg, label_rtx));
++ else
++ emit_insn (gen_lcla1 (reg, label_rtx));
++
++ emit_insn (gen_load_offset_label_address (gen_rtx_REG (SImode, 25),
++ reg,
++ begin_label_rtx,
++ label_rtx));
++ }
++
++ if (!NO_DEFERRED_PROFILE_COUNTERS)
++ {
++ rtx count_label_rtx, addr, r24;
++ char count_label_name[16];
++
++ funcdef_nos.safe_push (label_no);
++ ASM_GENERATE_INTERNAL_LABEL (count_label_name, "LP", label_no);
++ count_label_rtx = gen_rtx_SYMBOL_REF (Pmode,
++ ggc_strdup (count_label_name));
++
++ addr = force_reg (Pmode, count_label_rtx);
++ r24 = gen_rtx_REG (Pmode, 24);
++ emit_move_insn (r24, addr);
++
++ arg_bytes = GEN_INT (TARGET_64BIT ? 24 : 12);
++ if (use_mcount_pcrel_call)
++ call_insn = emit_call_insn (gen_call_mcount (mcount, arg_bytes,
++ begin_label_rtx));
++ else
++ call_insn = emit_call_insn (gen_call (mcount, arg_bytes));
+
+-#endif
++ use_reg (&CALL_INSN_FUNCTION_USAGE (call_insn), r24);
++ }
++ else
++ {
++ arg_bytes = GEN_INT (TARGET_64BIT ? 16 : 8);
++ if (use_mcount_pcrel_call)
++ call_insn = emit_call_insn (gen_call_mcount (mcount, arg_bytes,
++ begin_label_rtx));
++ else
++ call_insn = emit_call_insn (gen_call (mcount, arg_bytes));
++ }
+
+ use_reg (&CALL_INSN_FUNCTION_USAGE (call_insn), gen_rtx_REG (SImode, 25));
+ use_reg (&CALL_INSN_FUNCTION_USAGE (call_insn), gen_rtx_REG (SImode, 26));
+@@ -4605,6 +4620,10 @@
+ /* Indicate the _mcount call cannot throw, nor will it execute a
+ non-local goto. */
+ make_reg_eh_region_note_nothrow_nononlocal (call_insn);
++
++ /* Allocate space for fixed arguments. */
++ if (reg_parm_stack_space > crtl->outgoing_args_size)
++ crtl->outgoing_args_size = reg_parm_stack_space;
+ }
+
+ /* Fetch the return address for the frame COUNT steps up from
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/config/pa/pa.md gcc-6-20160721/gcc/config/pa/pa.md
+--- gcc-6.1.0/gcc/config/pa/pa.md 2016-03-25 00:59:02.000000000 +0000
++++ gcc-6-20160721/gcc/config/pa/pa.md 2016-07-20 22:35:50.000000000 +0000
+@@ -8216,6 +8216,170 @@
+ (cond [(and (const_int 0) (eq (const_int 0) (pc))) (const_int 12)]
+ (symbol_ref "pa_attr_length_indirect_call (insn)")))])
+
++/* Expand special pc-relative call to _mcount. */
++
++(define_expand "call_mcount"
++ [(parallel [(call (match_operand:SI 0 "" "")
++ (match_operand 1 "" ""))
++ (set (reg:SI 25)
++ (plus:SI (reg:SI 2)
++ (minus:SI (match_operand 2 "" "")
++ (plus:SI (pc) (const_int 4)))))
++ (clobber (reg:SI 2))])]
++ "!TARGET_PORTABLE_RUNTIME"
++ "
++{
++ rtx op = XEXP (operands[0], 0);
++ rtx nb = operands[1];
++ rtx lab = operands[2];
++
++ if (TARGET_64BIT)
++ {
++ rtx r4 = gen_rtx_REG (word_mode, 4);
++ emit_move_insn (arg_pointer_rtx,
++ gen_rtx_PLUS (word_mode, virtual_outgoing_args_rtx,
++ GEN_INT (64)));
++ emit_call_insn (gen_call_mcount_64bit (op, nb, lab, r4));
++ }
++ else
++ {
++ if (flag_pic)
++ {
++ rtx r4 = gen_rtx_REG (word_mode, 4);
++ emit_call_insn (gen_call_mcount_pic (op, nb, lab, r4));
++ }
++ else
++ emit_call_insn (gen_call_mcount_nonpic (op, nb, lab));
++ }
++
++ DONE;
++}")
++
++(define_insn "call_mcount_nonpic"
++ [(call (mem:SI (match_operand 0 "call_operand_address" ""))
++ (match_operand 1 "" "i"))
++ (set (reg:SI 25)
++ (plus:SI (reg:SI 2)
++ (minus:SI (match_operand 2 "" "")
++ (plus:SI (pc) (const_int 4)))))
++ (clobber (reg:SI 2))]
++ "!TARGET_PORTABLE_RUNTIME && !TARGET_64BIT"
++ "*
++{
++ pa_output_arg_descriptor (insn);
++ return \"{bl|b,l} %0,%%r2\;ldo %2-.-4(%%r2),%%r25\";
++}"
++ [(set_attr "type" "multi")
++ (set_attr "length" "8")])
++
++(define_insn "call_mcount_pic"
++ [(call (mem:SI (match_operand 0 "call_operand_address" ""))
++ (match_operand 1 "" "i"))
++ (set (reg:SI 25)
++ (plus:SI (reg:SI 2)
++ (minus:SI (match_operand 2 "" "")
++ (plus:SI (pc) (const_int 4)))))
++ (clobber (reg:SI 2))
++ (clobber (match_operand 3))
++ (use (reg:SI 19))]
++ "!TARGET_PORTABLE_RUNTIME && !TARGET_64BIT"
++ "#")
++
++(define_split
++ [(parallel [(call (mem:SI (match_operand 0 "call_operand_address" ""))
++ (match_operand 1 "" ""))
++ (set (reg:SI 25)
++ (plus:SI (reg:SI 2)
++ (minus:SI (match_operand 2 "" "")
++ (plus:SI (pc) (const_int 4)))))
++ (clobber (reg:SI 2))
++ (clobber (match_operand 3))
++ (use (reg:SI 19))])]
++ "!TARGET_PORTABLE_RUNTIME && !TARGET_64BIT && reload_completed"
++ [(set (match_dup 3) (reg:SI 19))
++ (parallel [(call (mem:SI (match_dup 0))
++ (match_dup 1))
++ (set (reg:SI 25)
++ (plus:SI (reg:SI 2)
++ (minus:SI (match_dup 2)
++ (plus:SI (pc) (const_int 4)))))
++ (clobber (reg:SI 2))
++ (use (reg:SI 19))])
++ (set (reg:SI 19) (match_dup 3))]
++ "")
++
++(define_insn "*call_mcount_pic_post_reload"
++ [(call (mem:SI (match_operand 0 "call_operand_address" ""))
++ (match_operand 1 "" "i"))
++ (set (reg:SI 25)
++ (plus:SI (reg:SI 2)
++ (minus:SI (match_operand 2 "" "")
++ (plus:SI (pc) (const_int 4)))))
++ (clobber (reg:SI 2))
++ (use (reg:SI 19))]
++ "!TARGET_PORTABLE_RUNTIME && !TARGET_64BIT"
++ "*
++{
++ pa_output_arg_descriptor (insn);
++ return \"{bl|b,l} %0,%%r2\;ldo %2-.-4(%%r2),%%r25\";
++}"
++ [(set_attr "type" "multi")
++ (set_attr "length" "8")])
++
++(define_insn "call_mcount_64bit"
++ [(call (mem:SI (match_operand 0 "call_operand_address" ""))
++ (match_operand 1 "" "i"))
++ (set (reg:SI 25)
++ (plus:SI (reg:SI 2)
++ (minus:SI (match_operand 2 "" "")
++ (plus:SI (pc) (const_int 4)))))
++ (clobber (reg:DI 2))
++ (clobber (match_operand 3))
++ (use (reg:DI 27))
++ (use (reg:DI 29))]
++ "TARGET_64BIT"
++ "#")
++
++(define_split
++ [(parallel [(call (mem:SI (match_operand 0 "call_operand_address" ""))
++ (match_operand 1 "" ""))
++ (set (reg:SI 25)
++ (plus:SI (reg:SI 2)
++ (minus:SI (match_operand 2 "" "")
++ (plus:SI (pc) (const_int 4)))))
++ (clobber (reg:DI 2))
++ (clobber (match_operand 3))
++ (use (reg:DI 27))
++ (use (reg:DI 29))])]
++ "TARGET_64BIT && reload_completed"
++ [(set (match_dup 3) (reg:DI 27))
++ (parallel [(call (mem:SI (match_dup 0))
++ (match_dup 1))
++ (set (reg:SI 25)
++ (plus:SI (reg:SI 2)
++ (minus:SI (match_dup 2)
++ (plus:SI (pc) (const_int 4)))))
++ (clobber (reg:DI 2))
++ (use (reg:DI 27))
++ (use (reg:DI 29))])
++ (set (reg:DI 27) (match_dup 3))]
++ "")
++
++(define_insn "*call_mcount_64bit_post_reload"
++ [(call (mem:SI (match_operand 0 "call_operand_address" ""))
++ (match_operand 1 "" "i"))
++ (set (reg:SI 25)
++ (plus:SI (reg:SI 2)
++ (minus:SI (match_operand 2 "" "")
++ (plus:SI (pc) (const_int 4)))))
++ (clobber (reg:DI 2))
++ (use (reg:DI 27))
++ (use (reg:DI 29))]
++ "TARGET_64BIT"
++ "{bl|b,l} %0,%%r2\;ldo %2-.-4(%%r2),%%r25"
++ [(set_attr "type" "multi")
++ (set_attr "length" "8")])
++
+ ;; Call subroutine returning any type.
+
+ (define_expand "untyped_call"
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/config/rs6000/40x.md gcc-6-20160721/gcc/config/rs6000/40x.md
+--- gcc-6.1.0/gcc/config/rs6000/40x.md 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/gcc/config/rs6000/40x.md 2016-07-05 19:19:42.000000000 +0000
+@@ -119,6 +119,6 @@
+ "bpu_40x")
+
+ (define_insn_reservation "ppc405-float" 11
+- (and (eq_attr "type" "fpload,fpstore,fpcompare,fp,dmul,sdiv,ddiv")
++ (and (eq_attr "type" "fpload,fpstore,fpcompare,fp,fpsimple,dmul,sdiv,ddiv")
+ (eq_attr "cpu" "ppc405"))
+ "fpu_405*10")
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/config/rs6000/440.md gcc-6-20160721/gcc/config/rs6000/440.md
+--- gcc-6.1.0/gcc/config/rs6000/440.md 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/gcc/config/rs6000/440.md 2016-07-05 19:19:42.000000000 +0000
+@@ -107,7 +107,7 @@
+ "ppc440_issue,ppc440_f_pipe+ppc440_i_pipe")
+
+ (define_insn_reservation "ppc440-fp" 5
+- (and (eq_attr "type" "fp,dmul")
++ (and (eq_attr "type" "fp,fpsimple,dmul")
+ (eq_attr "cpu" "ppc440"))
+ "ppc440_issue,ppc440_f_pipe")
+
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/config/rs6000/476.md gcc-6-20160721/gcc/config/rs6000/476.md
+--- gcc-6.1.0/gcc/config/rs6000/476.md 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/gcc/config/rs6000/476.md 2016-07-05 19:19:42.000000000 +0000
+@@ -124,7 +124,7 @@
+ ppc476_f_pipe+ppc476_i_pipe")
+
+ (define_insn_reservation "ppc476-fp" 6
+- (and (eq_attr "type" "fp,dmul")
++ (and (eq_attr "type" "fp,fpsimple,dmul")
+ (eq_attr "cpu" "ppc476"))
+ "ppc476_issue_fp,\
+ ppc476_f_pipe")
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/config/rs6000/601.md gcc-6-20160721/gcc/config/rs6000/601.md
+--- gcc-6.1.0/gcc/config/rs6000/601.md 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/gcc/config/rs6000/601.md 2016-07-05 19:19:42.000000000 +0000
+@@ -86,7 +86,7 @@
+ "(fpu_ppc601+iu_ppc601*2),nothing*2,bpu_ppc601")
+
+ (define_insn_reservation "ppc601-fp" 4
+- (and (eq_attr "type" "fp")
++ (and (eq_attr "type" "fp,fpsimple")
+ (eq_attr "cpu" "ppc601"))
+ "fpu_ppc601")
+
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/config/rs6000/603.md gcc-6-20160721/gcc/config/rs6000/603.md
+--- gcc-6.1.0/gcc/config/rs6000/603.md 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/gcc/config/rs6000/603.md 2016-07-05 19:19:42.000000000 +0000
+@@ -105,7 +105,7 @@
+ "(fpu_603+iu_603*2),bpu_603")
+
+ (define_insn_reservation "ppc603-fp" 3
+- (and (eq_attr "type" "fp")
++ (and (eq_attr "type" "fp,fpsimple")
+ (eq_attr "cpu" "ppc603"))
+ "fpu_603")
+
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/config/rs6000/6xx.md gcc-6-20160721/gcc/config/rs6000/6xx.md
+--- gcc-6.1.0/gcc/config/rs6000/6xx.md 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/gcc/config/rs6000/6xx.md 2016-07-05 19:19:42.000000000 +0000
+@@ -160,7 +160,7 @@
+ "fpu_6xx")
+
+ (define_insn_reservation "ppc604-fp" 3
+- (and (eq_attr "type" "fp")
++ (and (eq_attr "type" "fp,fpsimple")
+ (eq_attr "cpu" "ppc604,ppc604e,ppc620"))
+ "fpu_6xx")
+
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/config/rs6000/7450.md gcc-6-20160721/gcc/config/rs6000/7450.md
+--- gcc-6.1.0/gcc/config/rs6000/7450.md 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/gcc/config/rs6000/7450.md 2016-07-05 19:19:42.000000000 +0000
+@@ -120,7 +120,7 @@
+ "ppc7450_du,fpu_7450")
+
+ (define_insn_reservation "ppc7450-fp" 5
+- (and (eq_attr "type" "fp,dmul")
++ (and (eq_attr "type" "fp,fpsimple,dmul")
+ (eq_attr "cpu" "ppc7450"))
+ "ppc7450_du,fpu_7450")
+
+@@ -162,7 +162,7 @@
+
+ ;; Altivec
+ (define_insn_reservation "ppc7450-vecsimple" 1
+- (and (eq_attr "type" "vecsimple")
++ (and (eq_attr "type" "vecsimple,veclogical,vecmove")
+ (eq_attr "cpu" "ppc7450"))
+ "ppc7450_du,ppc7450_vec_du,vecsmpl_7450")
+
+@@ -172,7 +172,7 @@
+ "ppc7450_du,ppc7450_vec_du,veccmplx_7450")
+
+ (define_insn_reservation "ppc7450-veccmp" 2
+- (and (eq_attr "type" "veccmp")
++ (and (eq_attr "type" "veccmp,veccmpfx")
+ (eq_attr "cpu" "ppc7450"))
+ "ppc7450_du,ppc7450_vec_du,veccmplx_7450")
+
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/config/rs6000/7xx.md gcc-6-20160721/gcc/config/rs6000/7xx.md
+--- gcc-6.1.0/gcc/config/rs6000/7xx.md 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/gcc/config/rs6000/7xx.md 2016-07-05 19:19:42.000000000 +0000
+@@ -113,7 +113,7 @@
+ "ppc750_du,fpu_7xx")
+
+ (define_insn_reservation "ppc750-fp" 3
+- (and (eq_attr "type" "fp")
++ (and (eq_attr "type" "fp,fpsimple")
+ (eq_attr "cpu" "ppc750,ppc7400"))
+ "ppc750_du,fpu_7xx")
+
+@@ -165,7 +165,7 @@
+
+ ;; Altivec
+ (define_insn_reservation "ppc7400-vecsimple" 1
+- (and (eq_attr "type" "vecsimple,veccmp")
++ (and (eq_attr "type" "vecsimple,veclogical,vecmove,veccmp,veccmpfx")
+ (eq_attr "cpu" "ppc7400"))
+ "ppc750_du,ppc7400_vec_du,veccmplx_7xx")
+
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/config/rs6000/8540.md gcc-6-20160721/gcc/config/rs6000/8540.md
+--- gcc-6.1.0/gcc/config/rs6000/8540.md 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/gcc/config/rs6000/8540.md 2016-07-05 19:19:42.000000000 +0000
+@@ -190,7 +190,7 @@
+
+ ;; Simple vector
+ (define_insn_reservation "ppc8540_simple_vector" 1
+- (and (eq_attr "type" "vecsimple")
++ (and (eq_attr "type" "vecsimple,veclogical,vecmove")
+ (eq_attr "cpu" "ppc8540,ppc8548"))
+ "ppc8540_decode,ppc8540_issue+ppc8540_su1_stage0+ppc8540_retire")
+
+@@ -202,7 +202,7 @@
+
+ ;; Vector compare
+ (define_insn_reservation "ppc8540_vector_compare" 1
+- (and (eq_attr "type" "veccmp")
++ (and (eq_attr "type" "veccmp,veccmpfx")
+ (eq_attr "cpu" "ppc8540,ppc8548"))
+ "ppc8540_decode,ppc8540_issue+ppc8540_su1_stage0+ppc8540_retire")
+
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/config/rs6000/a2.md gcc-6-20160721/gcc/config/rs6000/a2.md
+--- gcc-6.1.0/gcc/config/rs6000/a2.md 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/gcc/config/rs6000/a2.md 2016-07-05 19:19:42.000000000 +0000
+@@ -81,7 +81,7 @@
+
+ ;; D.8.1
+ (define_insn_reservation "ppca2-fp" 6
+- (and (eq_attr "type" "fp") ;; Ignore fpsimple insn types (SPE only).
++ (and (eq_attr "type" "fp,fpsimple")
+ (eq_attr "cpu" "ppca2"))
+ "axu")
+
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/config/rs6000/altivec.h gcc-6-20160721/gcc/config/rs6000/altivec.h
+--- gcc-6.1.0/gcc/config/rs6000/altivec.h 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/gcc/config/rs6000/altivec.h 2016-07-01 15:08:18.000000000 +0000
+@@ -327,8 +327,8 @@
+ #define vec_sqrt __builtin_vec_sqrt
+ #define vec_vsx_ld __builtin_vec_vsx_ld
+ #define vec_vsx_st __builtin_vec_vsx_st
+-#define vec_xl __builtin_vec_vsx_ld
+-#define vec_xst __builtin_vec_vsx_st
++#define vec_xl __builtin_vec_xl
++#define vec_xst __builtin_vec_xst
+
+ /* Note, xxsldi and xxpermdi were added as __builtin_vsx_<xxx> functions
+ instead of __builtin_vec_<xxx> */
+@@ -384,6 +384,31 @@
+ #define vec_vupklsw __builtin_vec_vupklsw
+ #endif
+
++#ifdef _ARCH_PWR9
++/* Vector additions added in ISA 3.0. */
++#define vec_vctz __builtin_vec_vctz
++#define vec_cntlz __builtin_vec_vctz
++#define vec_vctzb __builtin_vec_vctzb
++#define vec_vctzd __builtin_vec_vctzd
++#define vec_vctzh __builtin_vec_vctzh
++#define vec_vctzw __builtin_vec_vctzw
++#define vec_vprtyb __builtin_vec_vprtyb
++#define vec_vprtybd __builtin_vec_vprtybd
++#define vec_vprtybw __builtin_vec_vprtybw
++
++#ifdef _ARCH_PPC64
++#define vec_vprtybq __builtin_vec_vprtybq
++#endif
++
++#define vec_slv __builtin_vec_vslv
++#define vec_srv __builtin_vec_vsrv
++
++#define vec_absd __builtin_vec_vadu
++#define vec_absdb __builtin_vec_vadub
++#define vec_absdh __builtin_vec_vaduh
++#define vec_absdw __builtin_vec_vaduw
++#endif
++
+ /* Predicates.
+ For C++, we use templates in order to allow non-parenthesized arguments.
+ For C, instead, we use macros since non-parenthesized arguments were
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/config/rs6000/altivec.md gcc-6-20160721/gcc/config/rs6000/altivec.md
+--- gcc-6.1.0/gcc/config/rs6000/altivec.md 2016-02-17 16:23:55.000000000 +0000
++++ gcc-6-20160721/gcc/config/rs6000/altivec.md 2016-07-12 18:12:11.000000000 +0000
+@@ -58,6 +58,7 @@
+ UNSPEC_VSUM2SWS
+ UNSPEC_VSUMSWS
+ UNSPEC_VPERM
++ UNSPEC_VPERMR
+ UNSPEC_VPERM_UNS
+ UNSPEC_VRFIN
+ UNSPEC_VCFUX
+@@ -73,6 +74,9 @@
+ UNSPEC_VUNPACK_LO_SIGN_DIRECT
+ UNSPEC_VUPKHPX
+ UNSPEC_VUPKLPX
++ UNSPEC_DARN
++ UNSPEC_DARN_32
++ UNSPEC_DARN_RAW
+ UNSPEC_DST
+ UNSPEC_DSTT
+ UNSPEC_DSTST
+@@ -110,6 +114,9 @@
+ UNSPEC_STVLXL
+ UNSPEC_STVRX
+ UNSPEC_STVRXL
++ UNSPEC_VSLV
++ UNSPEC_VSRV
++ UNSPEC_VADU
+ UNSPEC_VMULWHUB
+ UNSPEC_VMULWLUB
+ UNSPEC_VMULWHSB
+@@ -189,6 +196,13 @@
+ (KF "FLOAT128_VECTOR_P (KFmode)")
+ (TF "FLOAT128_VECTOR_P (TFmode)")])
+
++;; Specific iterator for parity which does not have a byte/half-word form, but
++;; does have a quad word form
++(define_mode_iterator VParity [V4SI
++ V2DI
++ V1TI
++ (TI "TARGET_VSX_TIMODE")])
++
+ (define_mode_attr VI_char [(V2DI "d") (V4SI "w") (V8HI "h") (V16QI "b")])
+ (define_mode_attr VI_scalar [(V2DI "DI") (V4SI "SI") (V8HI "HI") (V16QI "QI")])
+ (define_mode_attr VI_unit [(V16QI "VECTOR_UNIT_ALTIVEC_P (V16QImode)")
+@@ -203,6 +217,9 @@
+ (define_mode_attr VP_small_lc [(V2DI "v4si") (V4SI "v8hi") (V8HI "v16qi")])
+ (define_mode_attr VU_char [(V2DI "w") (V4SI "h") (V8HI "b")])
+
++;; Vector negate
++(define_mode_iterator VNEG [V4SI V2DI])
++
+ ;; Vector move instructions.
+ (define_insn "*altivec_mov<mode>"
+ [(set (match_operand:VM2 0 "nonimmediate_operand" "=Z,v,v,*Y,*r,*r,v,v,*r")
+@@ -225,7 +242,7 @@
+ default: gcc_unreachable ();
+ }
+ }
+- [(set_attr "type" "vecstore,vecload,vecsimple,store,load,*,vecsimple,*,*")
++ [(set_attr "type" "vecstore,vecload,veclogical,store,load,*,veclogical,*,*")
+ (set_attr "length" "4,4,4,20,20,20,4,8,32")])
+
+ ;; Unlike other altivec moves, allow the GPRs, since a normal use of TImode
+@@ -251,7 +268,7 @@
+ default: gcc_unreachable ();
+ }
+ }
+- [(set_attr "type" "vecstore,vecload,vecsimple,store,load,*,vecsimple,*")])
++ [(set_attr "type" "vecstore,vecload,veclogical,store,load,*,veclogical,*")])
+
+ ;; Load up a vector with the most significant bit set by loading up -1 and
+ ;; doing a shift left
+@@ -586,7 +603,7 @@
+ (match_operand:VI2 2 "altivec_register_operand" "v")))]
+ "<VI_unit>"
+ "vcmpequ<VI_char> %0,%1,%2"
+- [(set_attr "type" "veccmp")])
++ [(set_attr "type" "veccmpfx")])
+
+ (define_insn "*altivec_gt<mode>"
+ [(set (match_operand:VI2 0 "altivec_register_operand" "=v")
+@@ -594,7 +611,7 @@
+ (match_operand:VI2 2 "altivec_register_operand" "v")))]
+ "<VI_unit>"
+ "vcmpgts<VI_char> %0,%1,%2"
+- [(set_attr "type" "veccmp")])
++ [(set_attr "type" "veccmpfx")])
+
+ (define_insn "*altivec_gtu<mode>"
+ [(set (match_operand:VI2 0 "altivec_register_operand" "=v")
+@@ -602,7 +619,7 @@
+ (match_operand:VI2 2 "altivec_register_operand" "v")))]
+ "<VI_unit>"
+ "vcmpgtu<VI_char> %0,%1,%2"
+- [(set_attr "type" "veccmp")])
++ [(set_attr "type" "veccmpfx")])
+
+ (define_insn "*altivec_eqv4sf"
+ [(set (match_operand:V4SF 0 "altivec_register_operand" "=v")
+@@ -637,7 +654,7 @@
+ (match_operand:VM 3 "altivec_register_operand" "v")))]
+ "VECTOR_MEM_ALTIVEC_P (<MODE>mode)"
+ "vsel %0,%3,%2,%1"
+- [(set_attr "type" "vecperm")])
++ [(set_attr "type" "vecmove")])
+
+ (define_insn "*altivec_vsel<mode>_uns"
+ [(set (match_operand:VM 0 "altivec_register_operand" "=v")
+@@ -648,7 +665,7 @@
+ (match_operand:VM 3 "altivec_register_operand" "v")))]
+ "VECTOR_MEM_ALTIVEC_P (<MODE>mode)"
+ "vsel %0,%3,%2,%1"
+- [(set_attr "type" "vecperm")])
++ [(set_attr "type" "vecmove")])
+
+ ;; Fused multiply add.
+
+@@ -1617,6 +1634,24 @@
+ "vslo %0,%1,%2"
+ [(set_attr "type" "vecperm")])
+
++(define_insn "vslv"
++ [(set (match_operand:V16QI 0 "register_operand" "=v")
++ (unspec:V16QI [(match_operand:V16QI 1 "register_operand" "v")
++ (match_operand:V16QI 2 "register_operand" "v")]
++ UNSPEC_VSLV))]
++ "TARGET_P9_VECTOR"
++ "vslv %0,%1,%2"
++ [(set_attr "type" "vecsimple")])
++
++(define_insn "vsrv"
++ [(set (match_operand:V16QI 0 "register_operand" "=v")
++ (unspec:V16QI [(match_operand:V16QI 1 "register_operand" "v")
++ (match_operand:V16QI 2 "register_operand" "v")]
++ UNSPEC_VSRV))]
++ "TARGET_P9_VECTOR"
++ "vsrv %0,%1,%2"
++ [(set_attr "type" "vecsimple")])
++
+ (define_insn "*altivec_vsl<VI_char>"
+ [(set (match_operand:VI2 0 "register_operand" "=v")
+ (ashift:VI2 (match_operand:VI2 1 "register_operand" "v")
+@@ -1949,32 +1984,30 @@
+
+ ;; Slightly prefer vperm, since the target does not overlap the source
+ (define_insn "*altivec_vperm_<mode>_internal"
+- [(set (match_operand:VM 0 "register_operand" "=v,?wo,?&wo")
+- (unspec:VM [(match_operand:VM 1 "register_operand" "v,0,wo")
+- (match_operand:VM 2 "register_operand" "v,wo,wo")
+- (match_operand:V16QI 3 "register_operand" "v,wo,wo")]
++ [(set (match_operand:VM 0 "register_operand" "=v,?wo")
++ (unspec:VM [(match_operand:VM 1 "register_operand" "v,wo")
++ (match_operand:VM 2 "register_operand" "v,0")
++ (match_operand:V16QI 3 "register_operand" "v,wo")]
+ UNSPEC_VPERM))]
+ "TARGET_ALTIVEC"
+ "@
+ vperm %0,%1,%2,%3
+- xxperm %x0,%x2,%x3
+- xxlor %x0,%x1,%x1\t\t# xxperm fusion\;xxperm %x0,%x2,%x3"
++ xxperm %x0,%x1,%x3"
+ [(set_attr "type" "vecperm")
+- (set_attr "length" "4,4,8")])
++ (set_attr "length" "4")])
+
+ (define_insn "altivec_vperm_v8hiv16qi"
+- [(set (match_operand:V16QI 0 "register_operand" "=v,?wo,?&wo")
+- (unspec:V16QI [(match_operand:V8HI 1 "register_operand" "v,0,wo")
+- (match_operand:V8HI 2 "register_operand" "v,wo,wo")
+- (match_operand:V16QI 3 "register_operand" "v,wo,wo")]
++ [(set (match_operand:V16QI 0 "register_operand" "=v,?wo")
++ (unspec:V16QI [(match_operand:V8HI 1 "register_operand" "v,wo")
++ (match_operand:V8HI 2 "register_operand" "v,0")
++ (match_operand:V16QI 3 "register_operand" "v,wo")]
+ UNSPEC_VPERM))]
+ "TARGET_ALTIVEC"
+ "@
+ vperm %0,%1,%2,%3
+- xxperm %x0,%x2,%x3
+- xxlor %x0,%x1,%x1\t\t# xxperm fusion\;xxperm %x0,%x2,%x3"
++ xxperm %x0,%x1,%x3"
+ [(set_attr "type" "vecperm")
+- (set_attr "length" "4,4,8")])
++ (set_attr "length" "4")])
+
+ (define_expand "altivec_vperm_<mode>_uns"
+ [(set (match_operand:VM 0 "register_operand" "")
+@@ -1992,18 +2025,17 @@
+ })
+
+ (define_insn "*altivec_vperm_<mode>_uns_internal"
+- [(set (match_operand:VM 0 "register_operand" "=v,?wo,?&wo")
+- (unspec:VM [(match_operand:VM 1 "register_operand" "v,0,wo")
+- (match_operand:VM 2 "register_operand" "v,wo,wo")
+- (match_operand:V16QI 3 "register_operand" "v,wo,wo")]
++ [(set (match_operand:VM 0 "register_operand" "=v,?wo")
++ (unspec:VM [(match_operand:VM 1 "register_operand" "v,wo")
++ (match_operand:VM 2 "register_operand" "v,0")
++ (match_operand:V16QI 3 "register_operand" "v,wo")]
+ UNSPEC_VPERM_UNS))]
+ "TARGET_ALTIVEC"
+ "@
+ vperm %0,%1,%2,%3
+- xxperm %x0,%x2,%x3
+- xxlor %x0,%x1,%x1\t\t# xxperm fusion\;xxperm %x0,%x2,%x3"
++ xxperm %x0,%x1,%x3"
+ [(set_attr "type" "vecperm")
+- (set_attr "length" "4,4,8")])
++ (set_attr "length" "4")])
+
+ (define_expand "vec_permv16qi"
+ [(set (match_operand:V16QI 0 "register_operand" "")
+@@ -2032,6 +2064,19 @@
+ FAIL;
+ })
+
++(define_insn "*altivec_vpermr_<mode>_internal"
++ [(set (match_operand:VM 0 "register_operand" "=v,?wo")
++ (unspec:VM [(match_operand:VM 1 "register_operand" "v,wo")
++ (match_operand:VM 2 "register_operand" "v,0")
++ (match_operand:V16QI 3 "register_operand" "v,wo")]
++ UNSPEC_VPERMR))]
++ "TARGET_P9_VECTOR"
++ "@
++ vpermr %0,%2,%1,%3
++ xxpermr %x0,%x1,%x3"
++ [(set_attr "type" "vecperm")
++ (set_attr "length" "4")])
++
+ (define_insn "altivec_vrfip" ; ceil
+ [(set (match_operand:V4SF 0 "register_operand" "=v")
+ (unspec:V4SF [(match_operand:V4SF 1 "register_operand" "v")]
+@@ -2238,7 +2283,7 @@
+ (match_dup 2)))]
+ "<VI_unit>"
+ "vcmpequ<VI_char>. %0,%1,%2"
+- [(set_attr "type" "veccmp")])
++ [(set_attr "type" "veccmpfx")])
+
+ (define_insn "*altivec_vcmpgts<VI_char>_p"
+ [(set (reg:CC 74)
+@@ -2250,7 +2295,7 @@
+ (match_dup 2)))]
+ "<VI_unit>"
+ "vcmpgts<VI_char>. %0,%1,%2"
+- [(set_attr "type" "veccmp")])
++ [(set_attr "type" "veccmpfx")])
+
+ (define_insn "*altivec_vcmpgtu<VI_char>_p"
+ [(set (reg:CC 74)
+@@ -2262,7 +2307,7 @@
+ (match_dup 2)))]
+ "<VI_unit>"
+ "vcmpgtu<VI_char>. %0,%1,%2"
+- [(set_attr "type" "veccmp")])
++ [(set_attr "type" "veccmpfx")])
+
+ (define_insn "*altivec_vcmpeqfp_p"
+ [(set (reg:CC 74)
+@@ -2690,20 +2735,28 @@
+ DONE;
+ })
+
++(define_insn "*p9_neg<mode>2"
++ [(set (match_operand:VNEG 0 "altivec_register_operand" "=v")
++ (neg:VNEG (match_operand:VNEG 1 "altivec_register_operand" "v")))]
++ "TARGET_P9_VECTOR"
++ "vneg<VI_char> %0,%1"
++ [(set_attr "type" "vecsimple")])
++
+ (define_expand "neg<mode>2"
+- [(use (match_operand:VI 0 "register_operand" ""))
+- (use (match_operand:VI 1 "register_operand" ""))]
+- "TARGET_ALTIVEC"
+- "
++ [(set (match_operand:VI2 0 "register_operand" "")
++ (neg:VI2 (match_operand:VI2 1 "register_operand" "")))]
++ "<VI_unit>"
+ {
+- rtx vzero;
++ if (!TARGET_P9_VECTOR || (<MODE>mode != V4SImode && <MODE>mode != V2DImode))
++ {
++ rtx vzero;
+
+- vzero = gen_reg_rtx (GET_MODE (operands[0]));
+- emit_insn (gen_altivec_vspltis<VI_char> (vzero, const0_rtx));
+- emit_insn (gen_sub<mode>3 (operands[0], vzero, operands[1]));
+-
+- DONE;
+-}")
++ vzero = gen_reg_rtx (GET_MODE (operands[0]));
++ emit_move_insn (vzero, CONST0_RTX (<MODE>mode));
++ emit_insn (gen_sub<mode>3 (operands[0], vzero, operands[1]));
++ DONE;
++ }
++})
+
+ (define_expand "udot_prod<mode>"
+ [(set (match_operand:V4SI 0 "register_operand" "=v")
+@@ -2791,32 +2844,30 @@
+ "")
+
+ (define_insn "vperm_v8hiv4si"
+- [(set (match_operand:V4SI 0 "register_operand" "=v,?wo,?&wo")
+- (unspec:V4SI [(match_operand:V8HI 1 "register_operand" "v,0,wo")
+- (match_operand:V4SI 2 "register_operand" "v,wo,wo")
+- (match_operand:V16QI 3 "register_operand" "v,wo,wo")]
++ [(set (match_operand:V4SI 0 "register_operand" "=v,?wo")
++ (unspec:V4SI [(match_operand:V8HI 1 "register_operand" "v,wo")
++ (match_operand:V4SI 2 "register_operand" "v,0")
++ (match_operand:V16QI 3 "register_operand" "v,wo")]
+ UNSPEC_VPERMSI))]
+ "TARGET_ALTIVEC"
+ "@
+ vperm %0,%1,%2,%3
+- xxperm %x0,%x2,%x3
+- xxlor %x0,%x1,%x1\t\t# xxperm fusion\;xxperm %x0,%x2,%x3"
++ xxperm %x0,%x1,%x3"
+ [(set_attr "type" "vecperm")
+- (set_attr "length" "4,4,8")])
++ (set_attr "length" "4")])
+
+ (define_insn "vperm_v16qiv8hi"
+- [(set (match_operand:V8HI 0 "register_operand" "=v,?wo,?&wo")
+- (unspec:V8HI [(match_operand:V16QI 1 "register_operand" "v,0,wo")
+- (match_operand:V8HI 2 "register_operand" "v,wo,wo")
+- (match_operand:V16QI 3 "register_operand" "v,wo,wo")]
++ [(set (match_operand:V8HI 0 "register_operand" "=v,?wo")
++ (unspec:V8HI [(match_operand:V16QI 1 "register_operand" "v,wo")
++ (match_operand:V8HI 2 "register_operand" "v,0")
++ (match_operand:V16QI 3 "register_operand" "v,wo")]
+ UNSPEC_VPERMHI))]
+ "TARGET_ALTIVEC"
+ "@
+ vperm %0,%1,%2,%3
+- xxperm %x0,%x2,%x3
+- xxlor %x0,%x1,%x1\t\t# xxperm fusion\;xxperm %x0,%x2,%x3"
++ xxperm %x0,%x1,%x3"
+ [(set_attr "type" "vecperm")
+- (set_attr "length" "4,4,8")])
++ (set_attr "length" "4")])
+
+
+ (define_expand "vec_unpacku_hi_v16qi"
+@@ -3353,7 +3404,7 @@
+ }")
+
+
+-;; Power8 vector instructions encoded as Altivec instructions
++;; Power8/power9 vector instructions encoded as Altivec instructions
+
+ ;; Vector count leading zeros
+ (define_insn "*p8v_clz<mode>2"
+@@ -3364,6 +3415,33 @@
+ [(set_attr "length" "4")
+ (set_attr "type" "vecsimple")])
+
++;; Vector absolute difference unsigned
++(define_expand "vadu<mode>3"
++ [(set (match_operand:VI 0 "register_operand")
++ (unspec:VI [(match_operand:VI 1 "register_operand")
++ (match_operand:VI 2 "register_operand")]
++ UNSPEC_VADU))]
++ "TARGET_P9_VECTOR")
++
++;; Vector absolute difference unsigned
++(define_insn "*p9_vadu<mode>3"
++ [(set (match_operand:VI 0 "register_operand" "=v")
++ (unspec:VI [(match_operand:VI 1 "register_operand" "v")
++ (match_operand:VI 2 "register_operand" "v")]
++ UNSPEC_VADU))]
++ "TARGET_P9_VECTOR"
++ "vabsdu<wd> %0,%1,%2"
++ [(set_attr "type" "vecsimple")])
++
++;; Vector count trailing zeros
++(define_insn "*p9v_ctz<mode>2"
++ [(set (match_operand:VI2 0 "register_operand" "=v")
++ (ctz:VI2 (match_operand:VI2 1 "register_operand" "v")))]
++ "TARGET_P9_VECTOR"
++ "vctz<wd> %0,%1"
++ [(set_attr "length" "4")
++ (set_attr "type" "vecsimple")])
++
+ ;; Vector population count
+ (define_insn "*p8v_popcount<mode>2"
+ [(set (match_operand:VI2 0 "register_operand" "=v")
+@@ -3373,6 +3451,15 @@
+ [(set_attr "length" "4")
+ (set_attr "type" "vecsimple")])
+
++;; Vector parity
++(define_insn "*p9v_parity<mode>2"
++ [(set (match_operand:VParity 0 "register_operand" "=v")
++ (parity:VParity (match_operand:VParity 1 "register_operand" "v")))]
++ "TARGET_P9_VECTOR"
++ "vprtyb<wd> %0,%1"
++ [(set_attr "length" "4")
++ (set_attr "type" "vecsimple")])
++
+ ;; Vector Gather Bits by Bytes by Doubleword
+ (define_insn "p8v_vgbbd"
+ [(set (match_operand:V16QI 0 "register_operand" "=v")
+@@ -3540,6 +3627,27 @@
+ [(set_attr "length" "4")
+ (set_attr "type" "vecsimple")])
+
++(define_insn "darn_32"
++ [(set (match_operand:SI 0 "register_operand" "=r")
++ (unspec:SI [(const_int 0)] UNSPEC_DARN_32))]
++ "TARGET_P9_MISC"
++ "darn %0,0"
++ [(set_attr "type" "integer")])
++
++(define_insn "darn_raw"
++ [(set (match_operand:DI 0 "register_operand" "=r")
++ (unspec:DI [(const_int 0)] UNSPEC_DARN_RAW))]
++ "TARGET_P9_MISC && TARGET_64BIT"
++ "darn %0,2"
++ [(set_attr "type" "integer")])
++
++(define_insn "darn"
++ [(set (match_operand:DI 0 "register_operand" "=r")
++ (unspec:DI [(const_int 0)] UNSPEC_DARN))]
++ "TARGET_P9_MISC && TARGET_64BIT"
++ "darn %0,1"
++ [(set_attr "type" "integer")])
++
+ (define_expand "bcd<bcd_add_sub>_<code>"
+ [(parallel [(set (reg:CCFP 74)
+ (compare:CCFP
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/config/rs6000/cell.md gcc-6-20160721/gcc/config/rs6000/cell.md
+--- gcc-6.1.0/gcc/config/rs6000/cell.md 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/gcc/config/rs6000/cell.md 2016-07-05 19:19:42.000000000 +0000
+@@ -306,7 +306,7 @@
+
+ ; Basic FP latency is 10 cycles, thoughput is 1/cycle
+ (define_insn_reservation "cell-fp" 10
+- (and (eq_attr "type" "fp,dmul")
++ (and (eq_attr "type" "fp,fpsimple,dmul")
+ (eq_attr "cpu" "cell"))
+ "slot01,vsu1_cell,vsu1_cell*8")
+
+@@ -329,7 +329,7 @@
+
+ ; VMX
+ (define_insn_reservation "cell-vecsimple" 4
+- (and (eq_attr "type" "vecsimple")
++ (and (eq_attr "type" "vecsimple,veclogical,vecmove")
+ (eq_attr "cpu" "cell"))
+ "slot01,vsu1_cell,vsu1_cell*2")
+
+@@ -341,7 +341,7 @@
+
+ ;; TODO: add support for recording instructions
+ (define_insn_reservation "cell-veccmp" 4
+- (and (eq_attr "type" "veccmp")
++ (and (eq_attr "type" "veccmp,veccmpfx")
+ (eq_attr "cpu" "cell"))
+ "slot01,vsu1_cell,vsu1_cell*2")
+
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/config/rs6000/constraints.md gcc-6-20160721/gcc/config/rs6000/constraints.md
+--- gcc-6.1.0/gcc/config/rs6000/constraints.md 2016-03-25 09:10:03.000000000 +0000
++++ gcc-6-20160721/gcc/config/rs6000/constraints.md 2016-06-09 23:28:23.000000000 +0000
+@@ -140,6 +140,10 @@
+ (and (match_code "const_int")
+ (match_test "TARGET_VSX && (ival == VECTOR_ELEMENT_SCALAR_64BIT)")))
+
++(define_constraint "wE"
++ "Vector constant that can be loaded with the XXSPLTIB instruction."
++ (match_test "xxspltib_constant_nosplit (op, mode)"))
++
+ ;; Extended fusion store
+ (define_memory_constraint "wF"
+ "Memory operand suitable for power9 fusion load/stores"
+@@ -156,11 +160,26 @@
+ (and (match_test "TARGET_DIRECT_MOVE_128")
+ (match_test "(ival == VECTOR_ELEMENT_MFVSRLD_64BIT)"))))
+
++;; Generate the XXORC instruction to set a register to all 1's
++(define_constraint "wM"
++ "Match vector constant with all 1's if the XXLORC instruction is available"
++ (and (match_test "TARGET_P8_VECTOR")
++ (match_operand 0 "all_ones_constant")))
++
++;; ISA 3.0 vector d-form addresses
++(define_memory_constraint "wO"
++ "Memory operand suitable for the ISA 3.0 vector d-form instructions."
++ (match_operand 0 "vsx_quad_dform_memory_operand"))
++
+ ;; Lq/stq validates the address for load/store quad
+ (define_memory_constraint "wQ"
+ "Memory operand suitable for the load/store quad instructions"
+ (match_operand 0 "quad_memory_operand"))
+
++(define_constraint "wS"
++ "Vector constant that can be loaded with XXSPLTIB & sign extension."
++ (match_test "xxspltib_constant_split (op, mode)"))
++
+ ;; Altivec style load/store that ignores the bottom bits of the address
+ (define_memory_constraint "wZ"
+ "Indexed or indirect memory operand, ignoring the bottom 4 bits"
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/config/rs6000/crypto.md gcc-6-20160721/gcc/config/rs6000/crypto.md
+--- gcc-6.1.0/gcc/config/rs6000/crypto.md 2016-02-05 15:25:39.000000000 +0000
++++ gcc-6-20160721/gcc/config/rs6000/crypto.md 2016-07-06 02:31:08.000000000 +0000
+@@ -107,4 +107,4 @@
+ UNSPEC_VSHASIGMA))]
+ "TARGET_CRYPTO"
+ "vshasigma<CR_char> %0,%1,%2,%3"
+- [(set_attr "type" "crypto")])
++ [(set_attr "type" "vecsimple")])
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/config/rs6000/dfp.md gcc-6-20160721/gcc/config/rs6000/dfp.md
+--- gcc-6.1.0/gcc/config/rs6000/dfp.md 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/gcc/config/rs6000/dfp.md 2016-07-07 19:42:07.000000000 +0000
+@@ -58,7 +58,7 @@
+ (float_extend:DD (match_operand:SD 1 "gpc_reg_operand" "f")))]
+ "TARGET_DFP"
+ "dctdp %0,%1"
+- [(set_attr "type" "fp")])
++ [(set_attr "type" "dfp")])
+
+ (define_expand "extendsdtd2"
+ [(set (match_operand:TD 0 "gpc_reg_operand" "=d")
+@@ -76,7 +76,7 @@
+ (float_truncate:SD (match_operand:DD 1 "gpc_reg_operand" "d")))]
+ "TARGET_DFP"
+ "drsp %0,%1"
+- [(set_attr "type" "fp")])
++ [(set_attr "type" "dfp")])
+
+ (define_expand "negdd2"
+ [(set (match_operand:DD 0 "gpc_reg_operand" "")
+@@ -89,7 +89,7 @@
+ (neg:DD (match_operand:DD 1 "gpc_reg_operand" "d")))]
+ "TARGET_HARD_FLOAT && TARGET_FPRS"
+ "fneg %0,%1"
+- [(set_attr "type" "fp")])
++ [(set_attr "type" "fpsimple")])
+
+ (define_expand "absdd2"
+ [(set (match_operand:DD 0 "gpc_reg_operand" "")
+@@ -102,14 +102,14 @@
+ (abs:DD (match_operand:DD 1 "gpc_reg_operand" "d")))]
+ "TARGET_HARD_FLOAT && TARGET_FPRS"
+ "fabs %0,%1"
+- [(set_attr "type" "fp")])
++ [(set_attr "type" "fpsimple")])
+
+ (define_insn "*nabsdd2_fpr"
+ [(set (match_operand:DD 0 "gpc_reg_operand" "=d")
+ (neg:DD (abs:DD (match_operand:DD 1 "gpc_reg_operand" "d"))))]
+ "TARGET_HARD_FLOAT && TARGET_FPRS"
+ "fnabs %0,%1"
+- [(set_attr "type" "fp")])
++ [(set_attr "type" "fpsimple")])
+
+ (define_expand "negtd2"
+ [(set (match_operand:TD 0 "gpc_reg_operand" "")
+@@ -124,7 +124,7 @@
+ "@
+ fneg %0,%1
+ fneg %0,%1\;fmr %L0,%L1"
+- [(set_attr "type" "fp")
++ [(set_attr "type" "fpsimple")
+ (set_attr "length" "4,8")])
+
+ (define_expand "abstd2"
+@@ -140,7 +140,7 @@
+ "@
+ fabs %0,%1
+ fabs %0,%1\;fmr %L0,%L1"
+- [(set_attr "type" "fp")
++ [(set_attr "type" "fpsimple")
+ (set_attr "length" "4,8")])
+
+ (define_insn "*nabstd2_fpr"
+@@ -150,7 +150,7 @@
+ "@
+ fnabs %0,%1
+ fnabs %0,%1\;fmr %L0,%L1"
+- [(set_attr "type" "fp")
++ [(set_attr "type" "fpsimple")
+ (set_attr "length" "4,8")])
+
+ ;; Hardware support for decimal floating point operations.
+@@ -160,7 +160,7 @@
+ (float_extend:TD (match_operand:DD 1 "gpc_reg_operand" "d")))]
+ "TARGET_DFP"
+ "dctqpq %0,%1"
+- [(set_attr "type" "fp")])
++ [(set_attr "type" "dfp")])
+
+ ;; The result of drdpq is an even/odd register pair with the converted
+ ;; value in the even register and zero in the odd register.
+@@ -173,7 +173,7 @@
+ (clobber (match_scratch:TD 2 "=d"))]
+ "TARGET_DFP"
+ "drdpq %2,%1\;fmr %0,%2"
+- [(set_attr "type" "fp")])
++ [(set_attr "type" "dfp")])
+
+ (define_insn "adddd3"
+ [(set (match_operand:DD 0 "gpc_reg_operand" "=d")
+@@ -181,7 +181,7 @@
+ (match_operand:DD 2 "gpc_reg_operand" "d")))]
+ "TARGET_DFP"
+ "dadd %0,%1,%2"
+- [(set_attr "type" "fp")])
++ [(set_attr "type" "dfp")])
+
+ (define_insn "addtd3"
+ [(set (match_operand:TD 0 "gpc_reg_operand" "=d")
+@@ -189,7 +189,7 @@
+ (match_operand:TD 2 "gpc_reg_operand" "d")))]
+ "TARGET_DFP"
+ "daddq %0,%1,%2"
+- [(set_attr "type" "fp")])
++ [(set_attr "type" "dfp")])
+
+ (define_insn "subdd3"
+ [(set (match_operand:DD 0 "gpc_reg_operand" "=d")
+@@ -197,7 +197,7 @@
+ (match_operand:DD 2 "gpc_reg_operand" "d")))]
+ "TARGET_DFP"
+ "dsub %0,%1,%2"
+- [(set_attr "type" "fp")])
++ [(set_attr "type" "dfp")])
+
+ (define_insn "subtd3"
+ [(set (match_operand:TD 0 "gpc_reg_operand" "=d")
+@@ -205,7 +205,7 @@
+ (match_operand:TD 2 "gpc_reg_operand" "d")))]
+ "TARGET_DFP"
+ "dsubq %0,%1,%2"
+- [(set_attr "type" "fp")])
++ [(set_attr "type" "dfp")])
+
+ (define_insn "muldd3"
+ [(set (match_operand:DD 0 "gpc_reg_operand" "=d")
+@@ -213,7 +213,7 @@
+ (match_operand:DD 2 "gpc_reg_operand" "d")))]
+ "TARGET_DFP"
+ "dmul %0,%1,%2"
+- [(set_attr "type" "fp")])
++ [(set_attr "type" "dfp")])
+
+ (define_insn "multd3"
+ [(set (match_operand:TD 0 "gpc_reg_operand" "=d")
+@@ -221,7 +221,7 @@
+ (match_operand:TD 2 "gpc_reg_operand" "d")))]
+ "TARGET_DFP"
+ "dmulq %0,%1,%2"
+- [(set_attr "type" "fp")])
++ [(set_attr "type" "dfp")])
+
+ (define_insn "divdd3"
+ [(set (match_operand:DD 0 "gpc_reg_operand" "=d")
+@@ -229,7 +229,7 @@
+ (match_operand:DD 2 "gpc_reg_operand" "d")))]
+ "TARGET_DFP"
+ "ddiv %0,%1,%2"
+- [(set_attr "type" "fp")])
++ [(set_attr "type" "dfp")])
+
+ (define_insn "divtd3"
+ [(set (match_operand:TD 0 "gpc_reg_operand" "=d")
+@@ -237,7 +237,7 @@
+ (match_operand:TD 2 "gpc_reg_operand" "d")))]
+ "TARGET_DFP"
+ "ddivq %0,%1,%2"
+- [(set_attr "type" "fp")])
++ [(set_attr "type" "dfp")])
+
+ (define_insn "*cmpdd_internal1"
+ [(set (match_operand:CCFP 0 "cc_reg_operand" "=y")
+@@ -245,7 +245,7 @@
+ (match_operand:DD 2 "gpc_reg_operand" "d")))]
+ "TARGET_DFP"
+ "dcmpu %0,%1,%2"
+- [(set_attr "type" "fpcompare")])
++ [(set_attr "type" "dfp")])
+
+ (define_insn "*cmptd_internal1"
+ [(set (match_operand:CCFP 0 "cc_reg_operand" "=y")
+@@ -253,21 +253,21 @@
+ (match_operand:TD 2 "gpc_reg_operand" "d")))]
+ "TARGET_DFP"
+ "dcmpuq %0,%1,%2"
+- [(set_attr "type" "fpcompare")])
++ [(set_attr "type" "dfp")])
+
+ (define_insn "floatdidd2"
+ [(set (match_operand:DD 0 "gpc_reg_operand" "=d")
+ (float:DD (match_operand:DI 1 "gpc_reg_operand" "d")))]
+ "TARGET_DFP && TARGET_POPCNTD"
+ "dcffix %0,%1"
+- [(set_attr "type" "fp")])
++ [(set_attr "type" "dfp")])
+
+ (define_insn "floatditd2"
+ [(set (match_operand:TD 0 "gpc_reg_operand" "=d")
+ (float:TD (match_operand:DI 1 "gpc_reg_operand" "d")))]
+ "TARGET_DFP"
+ "dcffixq %0,%1"
+- [(set_attr "type" "fp")])
++ [(set_attr "type" "dfp")])
+
+ ;; Convert a decimal64 to a decimal64 whose value is an integer.
+ ;; This is the first stage of converting it to an integer type.
+@@ -277,7 +277,7 @@
+ (fix:DD (match_operand:DD 1 "gpc_reg_operand" "d")))]
+ "TARGET_DFP"
+ "drintn. 0,%0,%1,1"
+- [(set_attr "type" "fp")])
++ [(set_attr "type" "dfp")])
+
+ ;; Convert a decimal64 whose value is an integer to an actual integer.
+ ;; This is the second stage of converting decimal float to integer type.
+@@ -287,7 +287,7 @@
+ (fix:DI (match_operand:DD 1 "gpc_reg_operand" "d")))]
+ "TARGET_DFP"
+ "dctfix %0,%1"
+- [(set_attr "type" "fp")])
++ [(set_attr "type" "dfp")])
+
+ ;; Convert a decimal128 to a decimal128 whose value is an integer.
+ ;; This is the first stage of converting it to an integer type.
+@@ -297,7 +297,7 @@
+ (fix:TD (match_operand:TD 1 "gpc_reg_operand" "d")))]
+ "TARGET_DFP"
+ "drintnq. 0,%0,%1,1"
+- [(set_attr "type" "fp")])
++ [(set_attr "type" "dfp")])
+
+ ;; Convert a decimal128 whose value is an integer to an actual integer.
+ ;; This is the second stage of converting decimal float to integer type.
+@@ -307,7 +307,7 @@
+ (fix:DI (match_operand:TD 1 "gpc_reg_operand" "d")))]
+ "TARGET_DFP"
+ "dctfixq %0,%1"
+- [(set_attr "type" "fp")])
++ [(set_attr "type" "dfp")])
+
+
+ ;; Decimal builtin support
+@@ -318,8 +318,11 @@
+ UNSPEC_DXEX
+ UNSPEC_DIEX
+ UNSPEC_DSCLI
++ UNSPEC_DTSTSFI
+ UNSPEC_DSCRI])
+
++(define_code_iterator DFP_TEST [eq lt gt unordered])
++
+ (define_mode_iterator D64_D128 [DD TD])
+
+ (define_mode_attr dfp_suffix [(DD "")
+@@ -332,7 +335,7 @@
+ UNSPEC_DDEDPD))]
+ "TARGET_DFP"
+ "ddedpd<dfp_suffix> %1,%0,%2"
+- [(set_attr "type" "fp")])
++ [(set_attr "type" "dfp")])
+
+ (define_insn "dfp_denbcd_<mode>"
+ [(set (match_operand:D64_D128 0 "gpc_reg_operand" "=d")
+@@ -341,7 +344,7 @@
+ UNSPEC_DENBCD))]
+ "TARGET_DFP"
+ "denbcd<dfp_suffix> %1,%0,%2"
+- [(set_attr "type" "fp")])
++ [(set_attr "type" "dfp")])
+
+ (define_insn "dfp_dxex_<mode>"
+ [(set (match_operand:D64_D128 0 "gpc_reg_operand" "=d")
+@@ -349,7 +352,7 @@
+ UNSPEC_DXEX))]
+ "TARGET_DFP"
+ "dxex<dfp_suffix> %0,%1"
+- [(set_attr "type" "fp")])
++ [(set_attr "type" "dfp")])
+
+ (define_insn "dfp_diex_<mode>"
+ [(set (match_operand:D64_D128 0 "gpc_reg_operand" "=d")
+@@ -358,6 +361,42 @@
+ UNSPEC_DXEX))]
+ "TARGET_DFP"
+ "diex<dfp_suffix> %0,%1,%2"
++ [(set_attr "type" "dfp")])
++
++(define_expand "dfptstsfi_<code>_<mode>"
++ [(set (match_dup 3)
++ (compare:CCFP
++ (unspec:D64_D128
++ [(match_operand:SI 1 "const_int_operand" "n")
++ (match_operand:D64_D128 2 "gpc_reg_operand" "d")]
++ UNSPEC_DTSTSFI)
++ (match_dup 4)))
++ (set (match_operand:SI 0 "register_operand" "")
++ (DFP_TEST:SI (match_dup 3)
++ (const_int 0)))
++ ]
++ "TARGET_P9_MISC"
++{
++ operands[3] = gen_reg_rtx (CCFPmode);
++ operands[4] = const0_rtx;
++})
++
++(define_insn "*dfp_sgnfcnc_<mode>"
++ [(set (match_operand:CCFP 0 "" "=y")
++ (compare:CCFP
++ (unspec:D64_D128 [(match_operand:SI 1 "const_int_operand" "n")
++ (match_operand:D64_D128 2 "gpc_reg_operand" "d")]
++ UNSPEC_DTSTSFI)
++ (match_operand:SI 3 "zero_constant" "j")))]
++ "TARGET_P9_MISC"
++{
++ /* If immediate operand is greater than 63, it will behave as if
++ the value had been 63. The code generator does not support
++ immediate operand values greater than 63. */
++ if (!(IN_RANGE (INTVAL (operands[1]), 0, 63)))
++ operands[1] = GEN_INT (63);
++ return "dtstsfi<dfp_suffix> %0,%1,%2";
++}
+ [(set_attr "type" "fp")])
+
+ (define_insn "dfp_dscli_<mode>"
+@@ -367,7 +406,7 @@
+ UNSPEC_DSCLI))]
+ "TARGET_DFP"
+ "dscli<dfp_suffix> %0,%1,%2"
+- [(set_attr "type" "fp")])
++ [(set_attr "type" "dfp")])
+
+ (define_insn "dfp_dscri_<mode>"
+ [(set (match_operand:D64_D128 0 "gpc_reg_operand" "=d")
+@@ -376,4 +415,4 @@
+ UNSPEC_DSCRI))]
+ "TARGET_DFP"
+ "dscri<dfp_suffix> %0,%1,%2"
+- [(set_attr "type" "fp")])
++ [(set_attr "type" "dfp")])
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/config/rs6000/e300c2c3.md gcc-6-20160721/gcc/config/rs6000/e300c2c3.md
+--- gcc-6.1.0/gcc/config/rs6000/e300c2c3.md 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/gcc/config/rs6000/e300c2c3.md 2016-07-05 19:19:42.000000000 +0000
+@@ -150,7 +150,7 @@
+ "ppce300c3_decode,ppce300c3_issue+ppce300c3_fpu,nothing,ppce300c3_retire")
+
+ (define_insn_reservation "ppce300c3_fp" 3
+- (and (eq_attr "type" "fp")
++ (and (eq_attr "type" "fp,fpsimple")
+ (eq_attr "cpu" "ppce300c3"))
+ "ppce300c3_decode,ppce300c3_issue+ppce300c3_fpu,nothing,ppce300c3_retire")
+
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/config/rs6000/e6500.md gcc-6-20160721/gcc/config/rs6000/e6500.md
+--- gcc-6.1.0/gcc/config/rs6000/e6500.md 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/gcc/config/rs6000/e6500.md 2016-07-05 19:19:42.000000000 +0000
+@@ -205,7 +205,7 @@
+
+ ;; VSFX.
+ (define_insn_reservation "e6500_vecsimple" 1
+- (and (eq_attr "type" "vecsimple,veccmp")
++ (and (eq_attr "type" "vecsimple,veclogical,vecmove,veccmp,veccmpfx")
+ (eq_attr "cpu" "ppce6500"))
+ "e6500_decode,e6500_vec")
+
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/config/rs6000/htm.md gcc-6-20160721/gcc/config/rs6000/htm.md
+--- gcc-6.1.0/gcc/config/rs6000/htm.md 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/gcc/config/rs6000/htm.md 2016-07-06 02:31:08.000000000 +0000
+@@ -72,7 +72,7 @@
+ (set (match_operand:BLK 2) (unspec:BLK [(match_dup 2)] UNSPEC_HTM_FENCE))]
+ "TARGET_HTM"
+ "tabort. %0"
+- [(set_attr "type" "htm")
++ [(set_attr "type" "htmsimple")
+ (set_attr "length" "4")])
+
+ (define_expand "tabort<wd>c"
+@@ -98,7 +98,7 @@
+ (set (match_operand:BLK 4) (unspec:BLK [(match_dup 4)] UNSPEC_HTM_FENCE))]
+ "TARGET_HTM"
+ "tabort<wd>c. %0,%1,%2"
+- [(set_attr "type" "htm")
++ [(set_attr "type" "htmsimple")
+ (set_attr "length" "4")])
+
+ (define_expand "tabort<wd>ci"
+@@ -124,7 +124,7 @@
+ (set (match_operand:BLK 4) (unspec:BLK [(match_dup 4)] UNSPEC_HTM_FENCE))]
+ "TARGET_HTM"
+ "tabort<wd>ci. %0,%1,%2"
+- [(set_attr "type" "htm")
++ [(set_attr "type" "htmsimple")
+ (set_attr "length" "4")])
+
+ (define_expand "tbegin"
+@@ -208,7 +208,7 @@
+ (set (match_operand:BLK 1) (unspec:BLK [(match_dup 1)] UNSPEC_HTM_FENCE))]
+ "TARGET_HTM"
+ "trechkpt."
+- [(set_attr "type" "htm")
++ [(set_attr "type" "htmsimple")
+ (set_attr "length" "4")])
+
+ (define_expand "treclaim"
+@@ -230,7 +230,7 @@
+ (set (match_operand:BLK 2) (unspec:BLK [(match_dup 2)] UNSPEC_HTM_FENCE))]
+ "TARGET_HTM"
+ "treclaim. %0"
+- [(set_attr "type" "htm")
++ [(set_attr "type" "htmsimple")
+ (set_attr "length" "4")])
+
+ (define_expand "tsr"
+@@ -252,7 +252,7 @@
+ (set (match_operand:BLK 2) (unspec:BLK [(match_dup 2)] UNSPEC_HTM_FENCE))]
+ "TARGET_HTM"
+ "tsr. %0"
+- [(set_attr "type" "htm")
++ [(set_attr "type" "htmsimple")
+ (set_attr "length" "4")])
+
+ (define_expand "ttest"
+@@ -272,7 +272,7 @@
+ (set (match_operand:BLK 1) (unspec:BLK [(match_dup 1)] UNSPEC_HTM_FENCE))]
+ "TARGET_HTM"
+ "tabortwci. 0,1,0"
+- [(set_attr "type" "htm")
++ [(set_attr "type" "htmsimple")
+ (set_attr "length" "4")])
+
+ (define_insn "htm_mfspr_<mode>"
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/config/rs6000/mpc.md gcc-6-20160721/gcc/config/rs6000/mpc.md
+--- gcc-6.1.0/gcc/config/rs6000/mpc.md 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/gcc/config/rs6000/mpc.md 2016-07-05 19:19:42.000000000 +0000
+@@ -81,7 +81,7 @@
+ "fpu_mpc,bpu_mpc")
+
+ (define_insn_reservation "mpccore-fp" 4
+- (and (eq_attr "type" "fp")
++ (and (eq_attr "type" "fp,fpsimple")
+ (eq_attr "cpu" "mpccore"))
+ "fpu_mpc*2")
+
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/config/rs6000/power4.md gcc-6-20160721/gcc/config/rs6000/power4.md
+--- gcc-6.1.0/gcc/config/rs6000/power4.md 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/gcc/config/rs6000/power4.md 2016-07-05 19:19:42.000000000 +0000
+@@ -381,7 +381,7 @@
+
+ ; Basic FP latency is 6 cycles
+ (define_insn_reservation "power4-fp" 6
+- (and (eq_attr "type" "fp,dmul")
++ (and (eq_attr "type" "fp,fpsimple,dmul")
+ (eq_attr "cpu" "power4"))
+ "fpq_power4")
+
+@@ -410,7 +410,7 @@
+
+ ; VMX
+ (define_insn_reservation "power4-vecsimple" 2
+- (and (eq_attr "type" "vecsimple")
++ (and (eq_attr "type" "vecsimple,veclogical,vecmove")
+ (eq_attr "cpu" "power4"))
+ "vq_power4")
+
+@@ -421,7 +421,7 @@
+
+ ; vecfp compare
+ (define_insn_reservation "power4-veccmp" 8
+- (and (eq_attr "type" "veccmp")
++ (and (eq_attr "type" "veccmp,veccmpfx")
+ (eq_attr "cpu" "power4"))
+ "vq_power4")
+
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/config/rs6000/power5.md gcc-6-20160721/gcc/config/rs6000/power5.md
+--- gcc-6.1.0/gcc/config/rs6000/power5.md 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/gcc/config/rs6000/power5.md 2016-07-05 19:19:42.000000000 +0000
+@@ -322,7 +322,7 @@
+
+ ; Basic FP latency is 6 cycles
+ (define_insn_reservation "power5-fp" 6
+- (and (eq_attr "type" "fp,dmul")
++ (and (eq_attr "type" "fp,fpsimple,dmul")
+ (eq_attr "cpu" "power5"))
+ "fpq_power5")
+
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/config/rs6000/power6.md gcc-6-20160721/gcc/config/rs6000/power6.md
+--- gcc-6.1.0/gcc/config/rs6000/power6.md 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/gcc/config/rs6000/power6.md 2016-07-06 02:31:08.000000000 +0000
+@@ -500,7 +500,7 @@
+ (define_bypass 9 "power6-mtcr" "power6-branch")
+
+ (define_insn_reservation "power6-fp" 6
+- (and (eq_attr "type" "fp,dmul")
++ (and (eq_attr "type" "fp,fpsimple,dmul,dfp")
+ (eq_attr "cpu" "power6"))
+ "FPU_power6")
+
+@@ -556,7 +556,7 @@
+ "LSF_power6")
+
+ (define_insn_reservation "power6-vecsimple" 3
+- (and (eq_attr "type" "vecsimple")
++ (and (eq_attr "type" "vecsimple,veclogical,vecmove")
+ (eq_attr "cpu" "power6"))
+ "FPU_power6")
+
+@@ -568,7 +568,7 @@
+ (define_bypass 4 "power6-vecsimple" "power6-vecstore" )
+
+ (define_insn_reservation "power6-veccmp" 1
+- (and (eq_attr "type" "veccmp")
++ (and (eq_attr "type" "veccmp,veccmpfx")
+ (eq_attr "cpu" "power6"))
+ "FPU_power6")
+
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/config/rs6000/power7.md gcc-6-20160721/gcc/config/rs6000/power7.md
+--- gcc-6.1.0/gcc/config/rs6000/power7.md 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/gcc/config/rs6000/power7.md 2016-07-06 02:31:08.000000000 +0000
+@@ -292,7 +292,7 @@
+
+ ; VS Unit (includes FP/VSX/VMX/DFP)
+ (define_insn_reservation "power7-fp" 6
+- (and (eq_attr "type" "fp,dmul")
++ (and (eq_attr "type" "fp,fpsimple,dmul,dfp")
+ (eq_attr "cpu" "power7"))
+ "DU_power7,VSU_power7")
+
+@@ -324,7 +324,7 @@
+ "DU_power7,VSU_power7")
+
+ (define_insn_reservation "power7-vecsimple" 2
+- (and (eq_attr "type" "vecsimple,veccmp")
++ (and (eq_attr "type" "vecsimple,veclogical,vecmove,veccmp,veccmpfx")
+ (eq_attr "cpu" "power7"))
+ "DU_power7,vsu1_power7")
+
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/config/rs6000/power8.md gcc-6-20160721/gcc/config/rs6000/power8.md
+--- gcc-6.1.0/gcc/config/rs6000/power8.md 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/gcc/config/rs6000/power8.md 2016-07-06 02:31:08.000000000 +0000
+@@ -317,7 +317,7 @@
+
+ ; VS Unit (includes FP/VSX/VMX/DFP/Crypto)
+ (define_insn_reservation "power8-fp" 6
+- (and (eq_attr "type" "fp,dmul")
++ (and (eq_attr "type" "fp,fpsimple,dmul,dfp")
+ (eq_attr "cpu" "power8"))
+ "DU_any_power8,VSU_power8")
+
+@@ -350,7 +350,8 @@
+ "DU_any_power8,VSU_power8")
+
+ (define_insn_reservation "power8-vecsimple" 2
+- (and (eq_attr "type" "vecperm,vecsimple,veccmp")
++ (and (eq_attr "type" "vecperm,vecsimple,veclogical,vecmove,veccmp,
++ veccmpfx")
+ (eq_attr "cpu" "power8"))
+ "DU_any_power8,VSU_power8")
+
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/config/rs6000/power9.md gcc-6-20160721/gcc/config/rs6000/power9.md
+--- gcc-6.1.0/gcc/config/rs6000/power9.md 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/config/rs6000/power9.md 2016-07-06 02:31:08.000000000 +0000
+@@ -0,0 +1,477 @@
++;; Scheduling description for IBM POWER9 processor.
++;; Copyright (C) 2016 Free Software Foundation, Inc.
++;;
++;; Contributed by Pat Haugen (pthaugen@us.ibm.com).
++
++;; This file is part of GCC.
++;;
++;; GCC is free software; you can redistribute it and/or modify it
++;; under the terms of the GNU General Public License as published
++;; by the Free Software Foundation; either version 3, or (at your
++;; option) any later version.
++;;
++;; GCC is distributed in the hope that it will be useful, but WITHOUT
++;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
++;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
++;; License for more details.
++;;
++;; You should have received a copy of the GNU General Public License
++;; along with GCC; see the file COPYING3. If not see
++;; <http://www.gnu.org/licenses/>.
++
++(define_automaton "power9dsp,power9lsu,power9vsu,power9misc")
++
++(define_cpu_unit "lsu0_power9,lsu1_power9,lsu2_power9,lsu3_power9" "power9lsu")
++(define_cpu_unit "vsu0_power9,vsu1_power9,vsu2_power9,vsu3_power9" "power9vsu")
++; Two vector permute units, part of vsu
++(define_cpu_unit "prm0_power9,prm1_power9" "power9vsu")
++; Two fixed point divide units, not pipelined
++(define_cpu_unit "fx_div0_power9,fx_div1_power9" "power9misc")
++(define_cpu_unit "bru_power9,cryptu_power9,dfu_power9" "power9misc")
++
++(define_cpu_unit "x0_power9,x1_power9,xa0_power9,xa1_power9,
++ x2_power9,x3_power9,xb0_power9,xb1_power9,
++ br0_power9,br1_power9" "power9dsp")
++
++
++; Dispatch port reservations
++;
++; Power9 can dispatch a maximum of 6 iops per cycle with the following
++; general restrictions (other restrictions also apply):
++; 1) At most 2 iops per execution slice
++; 2) At most 2 iops to the branch unit
++; Note that insn position in a dispatch group of 6 insns does not infer which
++; execution slice the insn is routed to. The units are used to infer the
++; conflicts that exist (i.e. an 'even' requirement will preclude dispatch
++; with 2 insns with 'superslice' requirement).
++
++; The xa0/xa1 units really represent the 3rd dispatch port for a superslice but
++; are listed as separate units to allow those insns that preclude its use to
++; still be scheduled two to a superslice while reserving the 3rd slot. The
++; same applies for xb0/xb1.
++(define_reservation "DU_xa_power9" "xa0_power9+xa1_power9")
++(define_reservation "DU_xb_power9" "xb0_power9+xb1_power9")
++
++; Any execution slice dispatch
++(define_reservation "DU_any_power9"
++ "x0_power9|x1_power9|DU_xa_power9|x2_power9|x3_power9|
++ DU_xb_power9")
++
++; Even slice, actually takes even/odd slots
++(define_reservation "DU_even_power9" "x0_power9+x1_power9|x2_power9+x3_power9")
++
++; Slice plus 3rd slot
++(define_reservation "DU_slice_3_power9"
++ "x0_power9+xa0_power9|x1_power9+xa1_power9|
++ x2_power9+xb0_power9|x3_power9+xb1_power9")
++
++; Superslice
++(define_reservation "DU_super_power9"
++ "x0_power9+x1_power9|x2_power9+x3_power9")
++
++; 2-way cracked
++(define_reservation "DU_C2_power9" "x0_power9+x1_power9|
++ x1_power9+DU_xa_power9|
++ x1_power9+x2_power9|
++ DU_xa_power9+x2_power9|
++ x2_power9+x3_power9|
++ x3_power9+DU_xb_power9")
++
++; 2-way cracked plus 3rd slot
++(define_reservation "DU_C2_3_power9" "x0_power9+x1_power9+xa0_power9|
++ x1_power9+x2_power9+xa0_power9|
++ x1_power9+x2_power9+xb0_power9|
++ x2_power9+x3_power9+xb0_power9")
++
++; 3-way cracked (consumes whole decode/dispatch cycle)
++(define_reservation "DU_C3_power9"
++ "x0_power9+x1_power9+xa0_power9+xa1_power9+x2_power9+
++ x3_power9+xb0_power9+xb1_power9+br0_power9+br1_power9")
++
++; Branch ports
++(define_reservation "DU_branch_power9" "br0_power9|br1_power9")
++
++
++; Execution unit reservations
++(define_reservation "LSU_power9"
++ "lsu0_power9|lsu1_power9|lsu2_power9|lsu3_power9")
++
++(define_reservation "LSU_pair_power9"
++ "lsu0_power9+lsu1_power9|lsu1_power9+lsu2_power9|
++ lsu2_power9+lsu3_power9|lsu3_power9+lsu0_power9")
++
++(define_reservation "VSU_power9"
++ "vsu0_power9|vsu1_power9|vsu2_power9|vsu3_power9")
++
++(define_reservation "VSU_super_power9"
++ "vsu0_power9+vsu1_power9|vsu2_power9+vsu3_power9")
++
++(define_reservation "VSU_PRM_power9" "prm0_power9|prm1_power9")
++
++
++; LS Unit
++(define_insn_reservation "power9-load" 4
++ (and (eq_attr "type" "load")
++ (eq_attr "sign_extend" "no")
++ (eq_attr "update" "no")
++ (eq_attr "cpu" "power9"))
++ "DU_any_power9,LSU_power9")
++
++(define_insn_reservation "power9-load-update" 4
++ (and (eq_attr "type" "load")
++ (eq_attr "sign_extend" "no")
++ (eq_attr "update" "yes")
++ (eq_attr "cpu" "power9"))
++ "DU_C2_power9,LSU_power9+VSU_power9")
++
++(define_insn_reservation "power9-load-ext" 6
++ (and (eq_attr "type" "load")
++ (eq_attr "sign_extend" "yes")
++ (eq_attr "update" "no")
++ (eq_attr "cpu" "power9"))
++ "DU_C2_power9,LSU_power9")
++
++(define_insn_reservation "power9-load-ext-update" 6
++ (and (eq_attr "type" "load")
++ (eq_attr "sign_extend" "yes")
++ (eq_attr "update" "yes")
++ (eq_attr "cpu" "power9"))
++ "DU_C3_power9,LSU_power9+VSU_power9")
++
++(define_insn_reservation "power9-fpload-double" 4
++ (and (eq_attr "type" "fpload")
++ (eq_attr "update" "no")
++ (eq_attr "size" "64")
++ (eq_attr "cpu" "power9"))
++ "DU_slice_3_power9,LSU_power9")
++
++(define_insn_reservation "power9-fpload-update-double" 4
++ (and (eq_attr "type" "fpload")
++ (eq_attr "update" "yes")
++ (eq_attr "size" "64")
++ (eq_attr "cpu" "power9"))
++ "DU_C2_3_power9,LSU_power9+VSU_power9")
++
++; SFmode loads are cracked and have additional 2 cycles over DFmode
++(define_insn_reservation "power9-fpload-single" 6
++ (and (eq_attr "type" "fpload")
++ (eq_attr "update" "no")
++ (eq_attr "size" "32")
++ (eq_attr "cpu" "power9"))
++ "DU_C2_3_power9,LSU_power9")
++
++(define_insn_reservation "power9-fpload-update-single" 6
++ (and (eq_attr "type" "fpload")
++ (eq_attr "update" "yes")
++ (eq_attr "size" "32")
++ (eq_attr "cpu" "power9"))
++ "DU_C3_power9,LSU_power9+VSU_power9")
++
++(define_insn_reservation "power9-vecload" 5
++ (and (eq_attr "type" "vecload")
++ (eq_attr "cpu" "power9"))
++ "DU_any_power9,LSU_pair_power9")
++
++; Store data can issue 2 cycles after AGEN issue, 3 cycles for vector store
++(define_insn_reservation "power9-store" 0
++ (and (eq_attr "type" "store")
++ (eq_attr "update" "no")
++ (eq_attr "indexed" "no")
++ (eq_attr "cpu" "power9"))
++ "DU_slice_3_power9,LSU_power9")
++
++(define_insn_reservation "power9-store-indexed" 0
++ (and (eq_attr "type" "store")
++ (eq_attr "update" "no")
++ (eq_attr "indexed" "yes")
++ (eq_attr "cpu" "power9"))
++ "DU_slice_3_power9,LSU_power9")
++
++; Update forms have 2 cycle latency for updated addr reg
++(define_insn_reservation "power9-store-update" 2
++ (and (eq_attr "type" "store")
++ (eq_attr "update" "yes")
++ (eq_attr "indexed" "no")
++ (eq_attr "cpu" "power9"))
++ "DU_C2_3_power9,LSU_power9+VSU_power9")
++
++; Update forms have 2 cycle latency for updated addr reg
++(define_insn_reservation "power9-store-update-indexed" 2
++ (and (eq_attr "type" "store")
++ (eq_attr "update" "yes")
++ (eq_attr "indexed" "yes")
++ (eq_attr "cpu" "power9"))
++ "DU_C2_3_power9,LSU_power9+VSU_power9")
++
++(define_insn_reservation "power9-fpstore" 0
++ (and (eq_attr "type" "fpstore")
++ (eq_attr "update" "no")
++ (eq_attr "cpu" "power9"))
++ "DU_slice_3_power9,LSU_power9")
++
++; Update forms have 2 cycle latency for updated addr reg
++(define_insn_reservation "power9-fpstore-update" 2
++ (and (eq_attr "type" "fpstore")
++ (eq_attr "update" "yes")
++ (eq_attr "cpu" "power9"))
++ "DU_C2_3_power9,LSU_power9+VSU_power9")
++
++(define_insn_reservation "power9-vecstore" 0
++ (and (eq_attr "type" "vecstore")
++ (eq_attr "cpu" "power9"))
++ "DU_super_power9,LSU_pair_power9")
++
++(define_insn_reservation "power9-larx" 4
++ (and (eq_attr "type" "load_l")
++ (eq_attr "cpu" "power9"))
++ "DU_any_power9,LSU_power9")
++
++(define_insn_reservation "power9-stcx" 2
++ (and (eq_attr "type" "store_c")
++ (eq_attr "cpu" "power9"))
++ "DU_C2_3_power9,LSU_power9+VSU_power9")
++
++(define_insn_reservation "power9-sync" 4
++ (and (eq_attr "type" "sync,isync")
++ (eq_attr "cpu" "power9"))
++ "DU_any_power9,LSU_power9")
++
++
++; VSU Execution Unit
++
++; Fixed point ops
++
++; Most ALU insns are simple 2 cycle, including record form
++(define_insn_reservation "power9-alu" 2
++ (and (ior (eq_attr "type" "add,cmp,exts,integer,logical,isel")
++ (and (eq_attr "type" "insert,shift")
++ (eq_attr "dot" "no")))
++ (eq_attr "cpu" "power9"))
++ "DU_any_power9,VSU_power9")
++
++; Record form rotate/shift are cracked
++(define_insn_reservation "power9-cracked-alu" 2
++ (and (eq_attr "type" "insert,shift")
++ (eq_attr "dot" "yes")
++ (eq_attr "cpu" "power9"))
++ "DU_C2_power9,VSU_power9")
++; 4 cycle CR latency
++(define_bypass 4 "power9-cracked-alu"
++ "power9-crlogical,power9-mfcr,power9-mfcrf,power9-branch")
++
++(define_insn_reservation "power9-alu2" 3
++ (and (eq_attr "type" "cntlz,popcnt,trap")
++ (eq_attr "cpu" "power9"))
++ "DU_any_power9,VSU_power9")
++
++; Treat 'two' and 'three' types as 2 or 3 way cracked
++(define_insn_reservation "power9-two" 4
++ (and (eq_attr "type" "two")
++ (eq_attr "cpu" "power9"))
++ "DU_C2_power9,VSU_power9")
++
++(define_insn_reservation "power9-three" 6
++ (and (eq_attr "type" "three")
++ (eq_attr "cpu" "power9"))
++ "DU_C3_power9,VSU_power9")
++
++(define_insn_reservation "power9-mul" 4
++ (and (eq_attr "type" "mul")
++ (eq_attr "dot" "no")
++ (eq_attr "cpu" "power9"))
++ "DU_any_power9,VSU_power9")
++
++(define_insn_reservation "power9-mul-compare" 4
++ (and (eq_attr "type" "mul")
++ (eq_attr "dot" "yes")
++ (eq_attr "cpu" "power9"))
++ "DU_C2_power9,VSU_power9")
++; 6 cycle CR latency
++(define_bypass 6 "power9-mul-compare"
++ "power9-crlogical,power9-mfcr,power9-mfcrf,power9-branch")
++
++; Fixed point divides reserve the divide units for a minimum of 8 cycles
++(define_insn_reservation "power9-idiv" 16
++ (and (eq_attr "type" "div")
++ (eq_attr "size" "32")
++ (eq_attr "cpu" "power9"))
++ "DU_even_power9,fx_div0_power9*8|fx_div1_power9*8")
++
++(define_insn_reservation "power9-ldiv" 24
++ (and (eq_attr "type" "div")
++ (eq_attr "size" "64")
++ (eq_attr "cpu" "power9"))
++ "DU_even_power9,fx_div0_power9*8|fx_div1_power9*8")
++
++(define_insn_reservation "power9-crlogical" 2
++ (and (eq_attr "type" "cr_logical,delayed_cr")
++ (eq_attr "cpu" "power9"))
++ "DU_any_power9,VSU_power9")
++
++(define_insn_reservation "power9-mfcrf" 2
++ (and (eq_attr "type" "mfcrf")
++ (eq_attr "cpu" "power9"))
++ "DU_any_power9,VSU_power9")
++
++(define_insn_reservation "power9-mfcr" 6
++ (and (eq_attr "type" "mfcr")
++ (eq_attr "cpu" "power9"))
++ "DU_C3_power9,VSU_power9")
++
++; Should differentiate between 1 cr field and > 1 since target of > 1 cr
++; is cracked
++(define_insn_reservation "power9-mtcr" 2
++ (and (eq_attr "type" "mtcr")
++ (eq_attr "cpu" "power9"))
++ "DU_any_power9,VSU_power9")
++
++; Move to LR/CTR are executed in VSU
++(define_insn_reservation "power9-mtjmpr" 5
++ (and (eq_attr "type" "mtjmpr")
++ (eq_attr "cpu" "power9"))
++ "DU_any_power9,VSU_power9")
++
++; Floating point/Vector ops
++(define_insn_reservation "power9-fpsimple" 2
++ (and (eq_attr "type" "fpsimple")
++ (eq_attr "cpu" "power9"))
++ "DU_slice_3_power9,VSU_power9")
++
++(define_insn_reservation "power9-fp" 7
++ (and (eq_attr "type" "fp,dmul")
++ (eq_attr "cpu" "power9"))
++ "DU_slice_3_power9,VSU_power9")
++
++(define_insn_reservation "power9-fpcompare" 3
++ (and (eq_attr "type" "fpcompare")
++ (eq_attr "cpu" "power9"))
++ "DU_slice_3_power9,VSU_power9")
++
++; FP div/sqrt are executed in the VSU slices. They are not pipelined wrt other
++; divide insns, but for the most part do not block pipelined ops.
++(define_insn_reservation "power9-sdiv" 22
++ (and (eq_attr "type" "sdiv")
++ (eq_attr "cpu" "power9"))
++ "DU_slice_3_power9,VSU_power9")
++
++(define_insn_reservation "power9-ddiv" 33
++ (and (eq_attr "type" "ddiv")
++ (eq_attr "cpu" "power9"))
++ "DU_slice_3_power9,VSU_power9")
++
++(define_insn_reservation "power9-sqrt" 26
++ (and (eq_attr "type" "ssqrt")
++ (eq_attr "cpu" "power9"))
++ "DU_slice_3_power9,VSU_power9")
++
++(define_insn_reservation "power9-dsqrt" 36
++ (and (eq_attr "type" "dsqrt")
++ (eq_attr "cpu" "power9"))
++ "DU_slice_3_power9,VSU_power9")
++
++(define_insn_reservation "power9-vec-2cyc" 2
++ (and (eq_attr "type" "vecmove,veclogical,vecexts,veccmpfx")
++ (eq_attr "cpu" "power9"))
++ "DU_super_power9,VSU_super_power9")
++
++(define_insn_reservation "power9-veccmp" 3
++ (and (eq_attr "type" "veccmp")
++ (eq_attr "cpu" "power9"))
++ "DU_super_power9,VSU_super_power9")
++
++(define_insn_reservation "power9-vecsimple" 3
++ (and (eq_attr "type" "vecsimple")
++ (eq_attr "cpu" "power9"))
++ "DU_super_power9,VSU_super_power9")
++
++(define_insn_reservation "power9-vecnormal" 7
++ (and (eq_attr "type" "vecfloat,vecdouble")
++ (eq_attr "size" "!128")
++ (eq_attr "cpu" "power9"))
++ "DU_super_power9,VSU_super_power9")
++
++; Quad-precision FP ops, execute in DFU
++(define_insn_reservation "power9-qp" 12
++ (and (eq_attr "type" "vecfloat,vecdouble")
++ (eq_attr "size" "128")
++ (eq_attr "cpu" "power9"))
++ "DU_super_power9,dfu_power9")
++
++(define_insn_reservation "power9-vecperm" 3
++ (and (eq_attr "type" "vecperm")
++ (eq_attr "cpu" "power9"))
++ "DU_super_power9,VSU_PRM_power9")
++
++(define_insn_reservation "power9-veccomplex" 7
++ (and (eq_attr "type" "veccomplex")
++ (eq_attr "cpu" "power9"))
++ "DU_super_power9,VSU_super_power9")
++
++(define_insn_reservation "power9-vecfdiv" 28
++ (and (eq_attr "type" "vecfdiv")
++ (eq_attr "cpu" "power9"))
++ "DU_super_power9,VSU_super_power9")
++
++(define_insn_reservation "power9-vecdiv" 32
++ (and (eq_attr "type" "vecdiv")
++ (eq_attr "size" "!128")
++ (eq_attr "cpu" "power9"))
++ "DU_super_power9,VSU_super_power9")
++
++(define_insn_reservation "power9-qpdiv" 56
++ (and (eq_attr "type" "vecdiv")
++ (eq_attr "size" "128")
++ (eq_attr "cpu" "power9"))
++ "DU_super_power9,dfu_power9")
++
++(define_insn_reservation "power9-mffgpr" 2
++ (and (eq_attr "type" "mffgpr")
++ (eq_attr "cpu" "power9"))
++ "DU_slice_3_power9,VSU_power9")
++
++(define_insn_reservation "power9-mftgpr" 2
++ (and (eq_attr "type" "mftgpr")
++ (eq_attr "cpu" "power9"))
++ "DU_slice_3_power9,VSU_power9")
++
++
++; Branch Unit
++; Move from LR/CTR are executed in BRU but consume a writeback port from an
++; execution slice.
++(define_insn_reservation "power9-mfjmpr" 6
++ (and (eq_attr "type" "mfjmpr")
++ (eq_attr "cpu" "power9"))
++ "DU_branch_power9,bru_power9+VSU_power9")
++
++; Branch is 2 cycles
++(define_insn_reservation "power9-branch" 2
++ (and (eq_attr "type" "jmpreg,branch")
++ (eq_attr "cpu" "power9"))
++ "DU_branch_power9,bru_power9")
++
++
++; Crypto Unit
++(define_insn_reservation "power9-crypto" 6
++ (and (eq_attr "type" "crypto")
++ (eq_attr "cpu" "power9"))
++ "DU_super_power9,cryptu_power9")
++
++
++; HTM Unit
++(define_insn_reservation "power9-htm" 4
++ (and (eq_attr "type" "htm")
++ (eq_attr "cpu" "power9"))
++ "DU_C2_power9,LSU_power9")
++
++(define_insn_reservation "power9-htm-simple" 2
++ (and (eq_attr "type" "htmsimple")
++ (eq_attr "cpu" "power9"))
++ "DU_any_power9,VSU_power9")
++
++
++; DFP Unit
++(define_insn_reservation "power9-dfp" 12
++ (and (eq_attr "type" "dfp")
++ (eq_attr "cpu" "power9"))
++ "DU_even_power9,dfu_power9")
++
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/config/rs6000/predicates.md gcc-6-20160721/gcc/config/rs6000/predicates.md
+--- gcc-6.1.0/gcc/config/rs6000/predicates.md 2016-03-25 09:10:03.000000000 +0000
++++ gcc-6-20160721/gcc/config/rs6000/predicates.md 2016-07-01 17:56:54.000000000 +0000
+@@ -572,6 +572,38 @@
+ }
+ })
+
++;; Return 1 if the operand is a CONST_VECTOR or VEC_DUPLICATE of a constant
++;; that can loaded with a XXSPLTIB instruction and then a VUPKHSB, VECSB2W or
++;; VECSB2D instruction.
++
++(define_predicate "xxspltib_constant_split"
++ (match_code "const_vector,vec_duplicate,const_int")
++{
++ int value = 256;
++ int num_insns = -1;
++
++ if (!xxspltib_constant_p (op, mode, &num_insns, &value))
++ return false;
++
++ return num_insns > 1;
++})
++
++
++;; Return 1 if the operand is a CONST_VECTOR that can loaded directly with a
++;; XXSPLTIB instruction.
++
++(define_predicate "xxspltib_constant_nosplit"
++ (match_code "const_vector,vec_duplicate,const_int")
++{
++ int value = 256;
++ int num_insns = -1;
++
++ if (!xxspltib_constant_p (op, mode, &num_insns, &value))
++ return false;
++
++ return num_insns == 1;
++})
++
+ ;; Return 1 if the operand is a CONST_VECTOR and can be loaded into a
+ ;; vector register without using memory.
+ (define_predicate "easy_vector_constant"
+@@ -590,7 +622,14 @@
+
+ if (VECTOR_MEM_ALTIVEC_OR_VSX_P (mode))
+ {
+- if (zero_constant (op, mode))
++ int value = 256;
++ int num_insns = -1;
++
++ if (zero_constant (op, mode) || all_ones_constant (op, mode))
++ return true;
++
++ if (TARGET_P9_VECTOR
++ && xxspltib_constant_p (op, mode, &num_insns, &value))
+ return true;
+
+ return easy_altivec_constant (op, mode);
+@@ -669,6 +708,11 @@
+ (and (match_code "const_int,const_double,const_wide_int,const_vector")
+ (match_test "op == CONST0_RTX (mode)")))
+
++;; Return 1 if operand is constant -1 (scalars and vectors).
++(define_predicate "all_ones_constant"
++ (and (match_code "const_int,const_double,const_wide_int,const_vector")
++ (match_test "op == CONSTM1_RTX (mode) && !FLOAT_MODE_P (mode)")))
++
+ ;; Return 1 if operand is 0.0.
+ (define_predicate "zero_fp_constant"
+ (and (match_code "const_double")
+@@ -698,48 +742,25 @@
+ (define_predicate "quad_memory_operand"
+ (match_code "mem")
+ {
+- rtx addr, op0, op1;
+- int ret;
+-
+ if (!TARGET_QUAD_MEMORY && !TARGET_SYNC_TI)
+- ret = 0;
+-
+- else if (!memory_operand (op, mode))
+- ret = 0;
+-
+- else if (GET_MODE_SIZE (GET_MODE (op)) != 16)
+- ret = 0;
+-
+- else if (MEM_ALIGN (op) < 128)
+- ret = 0;
+-
+- else
+- {
+- addr = XEXP (op, 0);
+- if (int_reg_operand (addr, Pmode))
+- ret = 1;
++ return false;
+
+- else if (GET_CODE (addr) != PLUS)
+- ret = 0;
++ if (GET_MODE_SIZE (mode) != 16 || !MEM_P (op) || MEM_ALIGN (op) < 128)
++ return false;
+
+- else
+- {
+- op0 = XEXP (addr, 0);
+- op1 = XEXP (addr, 1);
+- ret = (int_reg_operand (op0, Pmode)
+- && GET_CODE (op1) == CONST_INT
+- && IN_RANGE (INTVAL (op1), -32768, 32767)
+- && (INTVAL (op1) & 15) == 0);
+- }
+- }
++ return quad_address_p (XEXP (op, 0), mode, false);
++})
+
+- if (TARGET_DEBUG_ADDR)
+- {
+- fprintf (stderr, "\nquad_memory_operand, ret = %s\n", ret ? "true" : "false");
+- debug_rtx (op);
+- }
++;; Return 1 if the operand is suitable for load/store to vector registers with
++;; d-form addressing (register+offset), which was added in ISA 3.0.
++;; Unlike quad_memory_operand, we do not have to check for alignment.
++(define_predicate "vsx_quad_dform_memory_operand"
++ (match_code "mem")
++{
++ if (!TARGET_P9_DFORM_VECTOR || !MEM_P (op) || GET_MODE_SIZE (mode) != 16)
++ return false;
+
+- return ret;
++ return quad_address_p (XEXP (op, 0), mode, false);
+ })
+
+ ;; Return 1 if the operand is an indexed or indirect memory operand.
+@@ -1054,6 +1075,10 @@
+ mode = V2DFmode;
+ else if (mode == DImode)
+ mode = V2DImode;
++ else if (mode == SImode && TARGET_P9_VECTOR)
++ mode = V4SImode;
++ else if (mode == SFmode && TARGET_P9_VECTOR)
++ mode = V4SFmode;
+ else
+ gcc_unreachable ();
+ return memory_address_addr_space_p (mode, XEXP (op, 0),
+@@ -1091,10 +1116,6 @@
+ (define_special_predicate "equality_operator"
+ (match_code "eq,ne"))
+
+-;; Return true if operand is MIN or MAX operator.
+-(define_predicate "min_max_operator"
+- (match_code "smin,smax,umin,umax"))
+-
+ ;; Return 1 if OP is a comparison operation that is valid for a branch
+ ;; instruction. We check the opcode against the mode of the CC value.
+ ;; validate_condition_mode is an assertion.
+@@ -1137,6 +1158,11 @@
+ (and (match_operand 0 "branch_comparison_operator")
+ (match_code "ne,le,ge,leu,geu,ordered")))
+
++;; Return 1 if OP is a comparison operator suitable for vector/scalar
++;; comparisons that generate a -1/0 mask.
++(define_predicate "fpmask_comparison_operator"
++ (match_code "eq,gt,ge"))
++
+ ;; Return 1 if OP is a comparison operation that is valid for a branch
+ ;; insn, which is true if the corresponding bit in the CC register is set.
+ (define_predicate "branch_positive_comparison_operator"
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/config/rs6000/rs6000-builtin.def gcc-6-20160721/gcc/config/rs6000/rs6000-builtin.def
+--- gcc-6.1.0/gcc/config/rs6000/rs6000-builtin.def 2016-01-20 20:30:24.000000000 +0000
++++ gcc-6-20160721/gcc/config/rs6000/rs6000-builtin.def 2016-07-08 18:06:16.000000000 +0000
+@@ -24,6 +24,7 @@
+ <http://www.gnu.org/licenses/>. */
+
+ /* Before including this file, some macros must be defined:
++ RS6000_BUILTIN_0 -- 0 arg builtins
+ RS6000_BUILTIN_1 -- 1 arg builtins
+ RS6000_BUILTIN_2 -- 2 arg builtins
+ RS6000_BUILTIN_3 -- 3 arg builtins
+@@ -43,6 +44,10 @@
+ ATTR builtin attribute information.
+ ICODE Insn code of the function that implents the builtin. */
+
++#ifndef RS6000_BUILTIN_0
++ #error "RS6000_BUILTIN_0 is not defined."
++#endif
++
+ #ifndef RS6000_BUILTIN_1
+ #error "RS6000_BUILTIN_1 is not defined."
+ #endif
+@@ -637,6 +642,91 @@
+ | RS6000_BTC_TERNARY), \
+ CODE_FOR_ ## ICODE) /* ICODE */
+
++/* Miscellaneous builtins for instructions added in ISA 3.0. These
++ instructions don't require either the DFP or VSX options, just the basic
++ ISA 3.0 enablement since they operate on general purpose registers. */
++#define BU_P9_MISC_0(ENUM, NAME, ATTR, ICODE) \
++ RS6000_BUILTIN_0 (MISC_BUILTIN_ ## ENUM, /* ENUM */ \
++ "__builtin_" NAME, /* NAME */ \
++ RS6000_BTM_P9_MISC, /* MASK */ \
++ (RS6000_BTC_ ## ATTR /* ATTR */ \
++ | RS6000_BTC_SPECIAL), \
++ CODE_FOR_ ## ICODE) /* ICODE */
++
++#define BU_P9_MISC_1(ENUM, NAME, ATTR, ICODE) \
++ RS6000_BUILTIN_1 (MISC_BUILTIN_ ## ENUM, /* ENUM */ \
++ "__builtin_" NAME, /* NAME */ \
++ RS6000_BTM_P9_MISC, /* MASK */ \
++ (RS6000_BTC_ ## ATTR /* ATTR */ \
++ | RS6000_BTC_UNARY), \
++ CODE_FOR_ ## ICODE) /* ICODE */
++
++/* Miscellaneous builtins for instructions added in ISA 3.0. These
++ instructions don't require either the DFP or VSX options, just the basic
++ ISA 3.0 enablement since they operate on general purpose registers,
++ and they require 64-bit addressing. */
++#define BU_P9_64BIT_MISC_0(ENUM, NAME, ATTR, ICODE) \
++ RS6000_BUILTIN_0 (MISC_BUILTIN_ ## ENUM, /* ENUM */ \
++ "__builtin_" NAME, /* NAME */ \
++ RS6000_BTM_P9_MISC \
++ | RS6000_BTM_64BIT, /* MASK */ \
++ (RS6000_BTC_ ## ATTR /* ATTR */ \
++ | RS6000_BTC_SPECIAL), \
++ CODE_FOR_ ## ICODE) /* ICODE */
++
++/* Miscellaneous builtins for decimal floating point instructions
++ added in ISA 3.0. These instructions don't require the VSX
++ options, just the basic ISA 3.0 enablement since they operate on
++ general purpose registers. */
++#define BU_P9_DFP_MISC_0(ENUM, NAME, ATTR, ICODE) \
++ RS6000_BUILTIN_0 (MISC_BUILTIN_ ## ENUM, /* ENUM */ \
++ "__builtin_" NAME, /* NAME */ \
++ RS6000_BTM_P9_MISC, /* MASK */ \
++ (RS6000_BTC_ ## ATTR /* ATTR */ \
++ | RS6000_BTC_SPECIAL), \
++ CODE_FOR_ ## ICODE) /* ICODE */
++
++#define BU_P9_DFP_MISC_1(ENUM, NAME, ATTR, ICODE) \
++ RS6000_BUILTIN_1 (MISC_BUILTIN_ ## ENUM, /* ENUM */ \
++ "__builtin_" NAME, /* NAME */ \
++ RS6000_BTM_P9_MISC, /* MASK */ \
++ (RS6000_BTC_ ## ATTR /* ATTR */ \
++ | RS6000_BTC_SPECIAL), \
++ CODE_FOR_ ## ICODE) /* ICODE */
++
++#define BU_P9_DFP_MISC_2(ENUM, NAME, ATTR, ICODE) \
++ RS6000_BUILTIN_2 (MISC_BUILTIN_ ## ENUM, /* ENUM */ \
++ "__builtin_" NAME, /* NAME */ \
++ RS6000_BTM_P9_MISC, /* MASK */ \
++ (RS6000_BTC_ ## ATTR /* ATTR */ \
++ | RS6000_BTC_SPECIAL), \
++ CODE_FOR_ ## ICODE) /* ICODE */
++
++/* Decimal floating point overloaded functions added in ISA 3.0 */
++#define BU_P9_DFP_OVERLOAD_1(ENUM, NAME) \
++ RS6000_BUILTIN_1 (P9_BUILTIN_DFP_ ## ENUM, /* ENUM */ \
++ "__builtin_dfp_" NAME, /* NAME */ \
++ RS6000_BTM_P9_MISC, /* MASK */ \
++ (RS6000_BTC_OVERLOADED /* ATTR */ \
++ | RS6000_BTC_UNARY), \
++ CODE_FOR_nothing) /* ICODE */
++
++#define BU_P9_DFP_OVERLOAD_2(ENUM, NAME) \
++ RS6000_BUILTIN_2 (P9_BUILTIN_DFP_ ## ENUM, /* ENUM */ \
++ "__builtin_dfp_" NAME, /* NAME */ \
++ RS6000_BTM_P9_MISC, /* MASK */ \
++ (RS6000_BTC_OVERLOADED /* ATTR */ \
++ | RS6000_BTC_BINARY), \
++ CODE_FOR_nothing) /* ICODE */
++
++#define BU_P9_DFP_OVERLOAD_3(ENUM, NAME) \
++ RS6000_BUILTIN_3 (P9_BUILTIN_DFP_ ## ENUM, /* ENUM */ \
++ "__builtin_dfp_" NAME, /* NAME */ \
++ RS6000_BTM_P9_MISC, /* MASK */ \
++ (RS6000_BTC_OVERLOADED /* ATTR */ \
++ | RS6000_BTC_TERNARY), \
++ CODE_FOR_nothing) /* ICODE */
++
+ /* 128-bit long double floating point builtins. */
+ #define BU_LDBL128_2(ENUM, NAME, ATTR, ICODE) \
+ RS6000_BUILTIN_2 (MISC_BUILTIN_ ## ENUM, /* ENUM */ \
+@@ -647,8 +737,94 @@
+ | RS6000_BTC_BINARY), \
+ CODE_FOR_ ## ICODE) /* ICODE */
+
++/* IEEE 128-bit floating-point builtins. */
++#define BU_FLOAT128_2(ENUM, NAME, ATTR, ICODE) \
++ RS6000_BUILTIN_2 (MISC_BUILTIN_ ## ENUM, /* ENUM */ \
++ "__builtin_" NAME, /* NAME */ \
++ RS6000_BTM_FLOAT128, /* MASK */ \
++ (RS6000_BTC_ ## ATTR /* ATTR */ \
++ | RS6000_BTC_BINARY), \
++ CODE_FOR_ ## ICODE) /* ICODE */
++
++#define BU_FLOAT128_1(ENUM, NAME, ATTR, ICODE) \
++ RS6000_BUILTIN_1 (MISC_BUILTIN_ ## ENUM, /* ENUM */ \
++ "__builtin_" NAME, /* NAME */ \
++ RS6000_BTM_FLOAT128, /* MASK */ \
++ (RS6000_BTC_ ## ATTR /* ATTR */ \
++ | RS6000_BTC_UNARY), \
++ CODE_FOR_ ## ICODE) /* ICODE */
++
++/* ISA 3.0 (power9) vector convenience macros. */
++/* For the instructions that are encoded as altivec instructions use
++ __builtin_altivec_ as the builtin name. */
++#define BU_P9V_AV_1(ENUM, NAME, ATTR, ICODE) \
++ RS6000_BUILTIN_1 (P9V_BUILTIN_ ## ENUM, /* ENUM */ \
++ "__builtin_altivec_" NAME, /* NAME */ \
++ RS6000_BTM_P9_VECTOR, /* MASK */ \
++ (RS6000_BTC_ ## ATTR /* ATTR */ \
++ | RS6000_BTC_UNARY), \
++ CODE_FOR_ ## ICODE) /* ICODE */
++
++#define BU_P9V_AV_2(ENUM, NAME, ATTR, ICODE) \
++ RS6000_BUILTIN_2 (P9V_BUILTIN_ ## ENUM, /* ENUM */ \
++ "__builtin_altivec_" NAME, /* NAME */ \
++ RS6000_BTM_P9_VECTOR, /* MASK */ \
++ (RS6000_BTC_ ## ATTR /* ATTR */ \
++ | RS6000_BTC_BINARY), \
++ CODE_FOR_ ## ICODE) /* ICODE */
++
++#define BU_P9V_AV_3(ENUM, NAME, ATTR, ICODE) \
++ RS6000_BUILTIN_3 (P9V_BUILTIN_ ## ENUM, /* ENUM */ \
++ "__builtin_altivec_" NAME, /* NAME */ \
++ RS6000_BTM_P9_VECTOR, /* MASK */ \
++ (RS6000_BTC_ ## ATTR /* ATTR */ \
++ | RS6000_BTC_TERNARY), \
++ CODE_FOR_ ## ICODE) /* ICODE */
++
++#define BU_P9V_AV_P(ENUM, NAME, ATTR, ICODE) \
++ RS6000_BUILTIN_P (P9V_BUILTIN_ ## ENUM, /* ENUM */ \
++ "__builtin_altivec_" NAME, /* NAME */ \
++ RS6000_BTM_P9_VECTOR, /* MASK */ \
++ (RS6000_BTC_ ## ATTR /* ATTR */ \
++ | RS6000_BTC_PREDICATE), \
++ CODE_FOR_ ## ICODE) /* ICODE */
++
++/* For the instructions encoded as VSX instructions use __builtin_vsx as the
++ builtin name. */
++#define BU_P9V_VSX_1(ENUM, NAME, ATTR, ICODE) \
++ RS6000_BUILTIN_1 (P9V_BUILTIN_ ## ENUM, /* ENUM */ \
++ "__builtin_vsx_" NAME, /* NAME */ \
++ RS6000_BTM_P9_VECTOR, /* MASK */ \
++ (RS6000_BTC_ ## ATTR /* ATTR */ \
++ | RS6000_BTC_UNARY), \
++ CODE_FOR_ ## ICODE) /* ICODE */
++
++#define BU_P9V_OVERLOAD_1(ENUM, NAME) \
++ RS6000_BUILTIN_1 (P9V_BUILTIN_VEC_ ## ENUM, /* ENUM */ \
++ "__builtin_vec_" NAME, /* NAME */ \
++ RS6000_BTM_P9_VECTOR, /* MASK */ \
++ (RS6000_BTC_OVERLOADED /* ATTR */ \
++ | RS6000_BTC_UNARY), \
++ CODE_FOR_nothing) /* ICODE */
++
++#define BU_P9V_OVERLOAD_2(ENUM, NAME) \
++ RS6000_BUILTIN_2 (P9V_BUILTIN_VEC_ ## ENUM, /* ENUM */ \
++ "__builtin_vec_" NAME, /* NAME */ \
++ RS6000_BTM_P9_VECTOR, /* MASK */ \
++ (RS6000_BTC_OVERLOADED /* ATTR */ \
++ | RS6000_BTC_BINARY), \
++ CODE_FOR_nothing) /* ICODE */
++
++#define BU_P9V_OVERLOAD_3(ENUM, NAME) \
++ RS6000_BUILTIN_3 (P9V_BUILTIN_VEC_ ## ENUM, /* ENUM */ \
++ "__builtin_vec_" NAME, /* NAME */ \
++ RS6000_BTM_P9_VECTOR, /* MASK */ \
++ (RS6000_BTC_OVERLOADED /* ATTR */ \
++ | RS6000_BTC_TERNARY), \
++ CODE_FOR_nothing) /* ICODE */
+ #endif
+
++
+ /* Insure 0 is not a legitimate index. */
+ BU_SPECIAL_X (RS6000_BUILTIN_NONE, NULL, 0, RS6000_BTC_MISC)
+
+@@ -1391,13 +1567,25 @@
+ BU_VSX_X (LXVW4X_V8HI, "lxvw4x_v8hi", MEM)
+ BU_VSX_X (LXVW4X_V16QI, "lxvw4x_v16qi", MEM)
+ BU_VSX_X (STXSDX, "stxsdx", MEM)
+-BU_VSX_X (STXVD2X_V1TI, "stxsdx_v1ti", MEM)
+-BU_VSX_X (STXVD2X_V2DF, "stxsdx_v2df", MEM)
+-BU_VSX_X (STXVD2X_V2DI, "stxsdx_v2di", MEM)
+-BU_VSX_X (STXVW4X_V4SF, "stxsdx_v4sf", MEM)
+-BU_VSX_X (STXVW4X_V4SI, "stxsdx_v4si", MEM)
+-BU_VSX_X (STXVW4X_V8HI, "stxsdx_v8hi", MEM)
+-BU_VSX_X (STXVW4X_V16QI, "stxsdx_v16qi", MEM)
++BU_VSX_X (STXVD2X_V1TI, "stxvd2x_v1ti", MEM)
++BU_VSX_X (STXVD2X_V2DF, "stxvd2x_v2df", MEM)
++BU_VSX_X (STXVD2X_V2DI, "stxvd2x_v2di", MEM)
++BU_VSX_X (STXVW4X_V4SF, "stxvw4x_v4sf", MEM)
++BU_VSX_X (STXVW4X_V4SI, "stxvw4x_v4si", MEM)
++BU_VSX_X (STXVW4X_V8HI, "stxvw4x_v8hi", MEM)
++BU_VSX_X (STXVW4X_V16QI, "stxvw4x_v16qi", MEM)
++BU_VSX_X (LD_ELEMREV_V2DF, "ld_elemrev_v2df", MEM)
++BU_VSX_X (LD_ELEMREV_V2DI, "ld_elemrev_v2di", MEM)
++BU_VSX_X (LD_ELEMREV_V4SF, "ld_elemrev_v4sf", MEM)
++BU_VSX_X (LD_ELEMREV_V4SI, "ld_elemrev_v4si", MEM)
++BU_VSX_X (LD_ELEMREV_V8HI, "ld_elemrev_v8hi", MEM)
++BU_VSX_X (LD_ELEMREV_V16QI, "ld_elemrev_v16qi", MEM)
++BU_VSX_X (ST_ELEMREV_V2DF, "st_elemrev_v2df", MEM)
++BU_VSX_X (ST_ELEMREV_V2DI, "st_elemrev_v2di", MEM)
++BU_VSX_X (ST_ELEMREV_V4SF, "st_elemrev_v4sf", MEM)
++BU_VSX_X (ST_ELEMREV_V4SI, "st_elemrev_v4si", MEM)
++BU_VSX_X (ST_ELEMREV_V8HI, "st_elemrev_v8hi", MEM)
++BU_VSX_X (ST_ELEMREV_V16QI, "st_elemrev_v16qi", MEM)
+ BU_VSX_X (XSABSDP, "xsabsdp", CONST)
+ BU_VSX_X (XSADDDP, "xsadddp", FP)
+ BU_VSX_X (XSCMPODP, "xscmpodp", FP)
+@@ -1455,6 +1643,8 @@
+ /* VSX builtins that are handled as special cases. */
+ BU_VSX_OVERLOAD_X (LD, "ld")
+ BU_VSX_OVERLOAD_X (ST, "st")
++BU_VSX_OVERLOAD_X (XL, "xl")
++BU_VSX_OVERLOAD_X (XST, "xst")
+
+ /* 1 argument VSX instructions added in ISA 2.07. */
+ BU_P8V_VSX_1 (XSCVSPDPN, "xscvspdpn", CONST, vsx_xscvspdpn)
+@@ -1589,6 +1779,25 @@
+ BU_P8V_OVERLOAD_3 (VSUBECUQ, "vsubecuq")
+ BU_P8V_OVERLOAD_3 (VSUBEUQM, "vsubeuqm")
+
++/* ISA 3.0 vector overloaded 2-argument functions. */
++BU_P9V_AV_2 (VSLV, "vslv", CONST, vslv)
++BU_P9V_AV_2 (VSRV, "vsrv", CONST, vsrv)
++
++/* ISA 3.0 vector overloaded 2-argument functions. */
++BU_P9V_OVERLOAD_2 (VSLV, "vslv")
++BU_P9V_OVERLOAD_2 (VSRV, "vsrv")
++
++/* 2 argument vector functions added in ISA 3.0 (power9). */
++BU_P9V_AV_2 (VADUB, "vadub", CONST, vaduv16qi3)
++BU_P9V_AV_2 (VADUH, "vaduh", CONST, vaduv8hi3)
++BU_P9V_AV_2 (VADUW, "vaduw", CONST, vaduv4si3)
++
++/* ISA 3.0 vector overloaded 2 argument functions. */
++BU_P9V_OVERLOAD_2 (VADU, "vadu")
++BU_P9V_OVERLOAD_2 (VADUB, "vadub")
++BU_P9V_OVERLOAD_2 (VADUH, "vaduh")
++BU_P9V_OVERLOAD_2 (VADUW, "vaduw")
++
+
+ /* 2 argument extended divide functions added in ISA 2.06. */
+ BU_P7_MISC_2 (DIVWE, "divwe", CONST, dive_si)
+@@ -1639,12 +1848,72 @@
+ BU_DFP_MISC_2 (PACK_TD, "pack_dec128", CONST, packtd)
+ BU_DFP_MISC_2 (UNPACK_TD, "unpack_dec128", CONST, unpacktd)
+
++/* 0 argument general-purpose register functions added in ISA 3.0 (power9). */
++BU_P9_MISC_0 (DARN_32, "darn_32", MISC, darn_32)
++BU_P9_64BIT_MISC_0 (DARN_RAW, "darn_raw", MISC, darn_raw)
++BU_P9_64BIT_MISC_0 (DARN, "darn", MISC, darn)
++
+ BU_LDBL128_2 (PACK_TF, "pack_longdouble", CONST, packtf)
+ BU_LDBL128_2 (UNPACK_TF, "unpack_longdouble", CONST, unpacktf)
+
+ BU_P7_MISC_2 (PACK_V1TI, "pack_vector_int128", CONST, packv1ti)
+ BU_P7_MISC_2 (UNPACK_V1TI, "unpack_vector_int128", CONST, unpackv1ti)
+
++/* 2 argument DFP (Decimal Floating Point) functions added in ISA 3.0. */
++BU_P9_DFP_MISC_2 (TSTSFI_LT_DD, "dtstsfi_lt_dd", CONST, dfptstsfi_lt_dd)
++BU_P9_DFP_MISC_2 (TSTSFI_LT_TD, "dtstsfi_lt_td", CONST, dfptstsfi_lt_td)
++
++BU_P9_DFP_MISC_2 (TSTSFI_EQ_DD, "dtstsfi_eq_dd", CONST, dfptstsfi_eq_dd)
++BU_P9_DFP_MISC_2 (TSTSFI_EQ_TD, "dtstsfi_eq_td", CONST, dfptstsfi_eq_td)
++
++BU_P9_DFP_MISC_2 (TSTSFI_GT_DD, "dtstsfi_gt_dd", CONST, dfptstsfi_gt_dd)
++BU_P9_DFP_MISC_2 (TSTSFI_GT_TD, "dtstsfi_gt_td", CONST, dfptstsfi_gt_td)
++
++BU_P9_DFP_MISC_2 (TSTSFI_OV_DD, "dtstsfi_ov_dd", CONST, dfptstsfi_unordered_dd)
++BU_P9_DFP_MISC_2 (TSTSFI_OV_TD, "dtstsfi_ov_td", CONST, dfptstsfi_unordered_td)
++
++/* 2 argument overloaded DFP functions added in ISA 3.0. */
++BU_P9_DFP_OVERLOAD_2 (TSTSFI_LT, "dtstsfi_lt")
++BU_P9_DFP_OVERLOAD_2 (TSTSFI_LT_DD, "dtstsfi_lt_dd")
++BU_P9_DFP_OVERLOAD_2 (TSTSFI_LT_TD, "dtstsfi_lt_td")
++
++BU_P9_DFP_OVERLOAD_2 (TSTSFI_EQ, "dtstsfi_eq")
++BU_P9_DFP_OVERLOAD_2 (TSTSFI_EQ_DD, "dtstsfi_eq_dd")
++BU_P9_DFP_OVERLOAD_2 (TSTSFI_EQ_TD, "dtstsfi_eq_td")
++
++BU_P9_DFP_OVERLOAD_2 (TSTSFI_GT, "dtstsfi_gt")
++BU_P9_DFP_OVERLOAD_2 (TSTSFI_GT_DD, "dtstsfi_gt_dd")
++BU_P9_DFP_OVERLOAD_2 (TSTSFI_GT_TD, "dtstsfi_gt_td")
++
++BU_P9_DFP_OVERLOAD_2 (TSTSFI_OV, "dtstsfi_ov")
++BU_P9_DFP_OVERLOAD_2 (TSTSFI_OV_DD, "dtstsfi_ov_dd")
++BU_P9_DFP_OVERLOAD_2 (TSTSFI_OV_TD, "dtstsfi_ov_td")
++
++/* 1 argument vector functions added in ISA 3.0 (power9). */
++BU_P9V_AV_1 (VCTZB, "vctzb", CONST, ctzv16qi2)
++BU_P9V_AV_1 (VCTZH, "vctzh", CONST, ctzv8hi2)
++BU_P9V_AV_1 (VCTZW, "vctzw", CONST, ctzv4si2)
++BU_P9V_AV_1 (VCTZD, "vctzd", CONST, ctzv2di2)
++BU_P9V_AV_1 (VPRTYBD, "vprtybd", CONST, parityv2di2)
++BU_P9V_AV_1 (VPRTYBQ, "vprtybq", CONST, parityv1ti2)
++BU_P9V_AV_1 (VPRTYBW, "vprtybw", CONST, parityv4si2)
++
++/* ISA 3.0 vector overloaded 1 argument functions. */
++BU_P9V_OVERLOAD_1 (VCTZ, "vctz")
++BU_P9V_OVERLOAD_1 (VCTZB, "vctzb")
++BU_P9V_OVERLOAD_1 (VCTZH, "vctzh")
++BU_P9V_OVERLOAD_1 (VCTZW, "vctzw")
++BU_P9V_OVERLOAD_1 (VCTZD, "vctzd")
++BU_P9V_OVERLOAD_1 (VPRTYB, "vprtyb")
++BU_P9V_OVERLOAD_1 (VPRTYBD, "vprtybd")
++BU_P9V_OVERLOAD_1 (VPRTYBQ, "vprtybq")
++BU_P9V_OVERLOAD_1 (VPRTYBW, "vprtybw")
++
++/* 1 argument IEEE 128-bit floating-point functions. */
++BU_FLOAT128_1 (FABSQ, "fabsq", CONST, abskf2)
++
++/* 2 argument IEEE 128-bit floating-point functions. */
++BU_FLOAT128_2 (COPYSIGNQ, "copysignq", CONST, copysignkf3)
+
+ /* 1 argument crypto functions. */
+ BU_CRYPTO_1 (VSBOX, "vsbox", CONST, crypto_vsbox)
+@@ -2022,6 +2291,18 @@
+ BU_SPECIAL_X (RS6000_BUILTIN_CPU_SUPPORTS, "__builtin_cpu_supports",
+ RS6000_BTM_ALWAYS, RS6000_BTC_MISC)
+
++BU_SPECIAL_X (RS6000_BUILTIN_NANQ, "__builtin_nanq",
++ RS6000_BTM_FLOAT128, RS6000_BTC_CONST)
++
++BU_SPECIAL_X (RS6000_BUILTIN_NANSQ, "__builtin_nansq",
++ RS6000_BTM_FLOAT128, RS6000_BTC_CONST)
++
++BU_SPECIAL_X (RS6000_BUILTIN_INFQ, "__builtin_infq",
++ RS6000_BTM_FLOAT128, RS6000_BTC_CONST)
++
++BU_SPECIAL_X (RS6000_BUILTIN_HUGE_VALQ, "__builtin_huge_valq",
++ RS6000_BTM_FLOAT128, RS6000_BTC_CONST)
++
+ /* Darwin CfString builtin. */
+ BU_SPECIAL_X (RS6000_BUILTIN_CFSTRING, "__builtin_cfstring", RS6000_BTM_ALWAYS,
+ RS6000_BTC_MISC)
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/config/rs6000/rs6000-c.c gcc-6-20160721/gcc/config/rs6000/rs6000-c.c
+--- gcc-6.1.0/gcc/config/rs6000/rs6000-c.c 2016-03-21 15:41:13.000000000 +0000
++++ gcc-6-20160721/gcc/config/rs6000/rs6000-c.c 2016-07-07 19:42:07.000000000 +0000
+@@ -2726,6 +2726,49 @@
+ RS6000_BTI_V4SI, RS6000_BTI_V4SI, RS6000_BTI_V4SI, 0 },
+ { ALTIVEC_BUILTIN_VEC_SUMS, ALTIVEC_BUILTIN_VSUMSWS,
+ RS6000_BTI_V4SI, RS6000_BTI_V4SI, RS6000_BTI_V4SI, 0 },
++ { VSX_BUILTIN_VEC_XL, VSX_BUILTIN_LD_ELEMREV_V2DF,
++ RS6000_BTI_V2DF, RS6000_BTI_INTSI, ~RS6000_BTI_V2DF, 0 },
++ { VSX_BUILTIN_VEC_XL, VSX_BUILTIN_LD_ELEMREV_V2DF,
++ RS6000_BTI_V2DF, RS6000_BTI_INTSI, ~RS6000_BTI_double, 0 },
++ { VSX_BUILTIN_VEC_XL, VSX_BUILTIN_LD_ELEMREV_V2DI,
++ RS6000_BTI_V2DI, RS6000_BTI_INTSI, ~RS6000_BTI_V2DI, 0 },
++ { VSX_BUILTIN_VEC_XL, VSX_BUILTIN_LD_ELEMREV_V2DI,
++ RS6000_BTI_V2DI, RS6000_BTI_INTSI, ~RS6000_BTI_long_long, 0 },
++ { VSX_BUILTIN_VEC_XL, VSX_BUILTIN_LD_ELEMREV_V2DI,
++ RS6000_BTI_unsigned_V2DI, RS6000_BTI_INTSI,
++ ~RS6000_BTI_unsigned_V2DI, 0 },
++ { VSX_BUILTIN_VEC_XL, VSX_BUILTIN_LD_ELEMREV_V2DI,
++ RS6000_BTI_unsigned_V2DI, RS6000_BTI_INTSI,
++ ~RS6000_BTI_unsigned_long_long, 0 },
++ { VSX_BUILTIN_VEC_XL, VSX_BUILTIN_LD_ELEMREV_V4SF,
++ RS6000_BTI_V4SF, RS6000_BTI_INTSI, ~RS6000_BTI_V4SF, 0 },
++ { VSX_BUILTIN_VEC_XL, VSX_BUILTIN_LD_ELEMREV_V4SF,
++ RS6000_BTI_V4SF, RS6000_BTI_INTSI, ~RS6000_BTI_float, 0 },
++ { VSX_BUILTIN_VEC_XL, VSX_BUILTIN_LD_ELEMREV_V4SI,
++ RS6000_BTI_V4SI, RS6000_BTI_INTSI, ~RS6000_BTI_V4SI, 0 },
++ { VSX_BUILTIN_VEC_XL, VSX_BUILTIN_LD_ELEMREV_V4SI,
++ RS6000_BTI_V4SI, RS6000_BTI_INTSI, ~RS6000_BTI_INTSI, 0 },
++ { VSX_BUILTIN_VEC_XL, VSX_BUILTIN_LD_ELEMREV_V4SI,
++ RS6000_BTI_unsigned_V4SI, RS6000_BTI_INTSI, ~RS6000_BTI_unsigned_V4SI, 0 },
++ { VSX_BUILTIN_VEC_XL, VSX_BUILTIN_LD_ELEMREV_V4SI,
++ RS6000_BTI_unsigned_V4SI, RS6000_BTI_INTSI, ~RS6000_BTI_UINTSI, 0 },
++ { VSX_BUILTIN_VEC_XL, VSX_BUILTIN_LD_ELEMREV_V8HI,
++ RS6000_BTI_V8HI, RS6000_BTI_INTSI, ~RS6000_BTI_V8HI, 0 },
++ { VSX_BUILTIN_VEC_XL, VSX_BUILTIN_LD_ELEMREV_V8HI,
++ RS6000_BTI_V8HI, RS6000_BTI_INTSI, ~RS6000_BTI_INTHI, 0 },
++ { VSX_BUILTIN_VEC_XL, VSX_BUILTIN_LD_ELEMREV_V8HI,
++ RS6000_BTI_unsigned_V8HI, RS6000_BTI_INTSI, ~RS6000_BTI_unsigned_V8HI, 0 },
++ { VSX_BUILTIN_VEC_XL, VSX_BUILTIN_LD_ELEMREV_V8HI,
++ RS6000_BTI_unsigned_V8HI, RS6000_BTI_INTSI, ~RS6000_BTI_UINTHI, 0 },
++ { VSX_BUILTIN_VEC_XL, VSX_BUILTIN_LD_ELEMREV_V16QI,
++ RS6000_BTI_V16QI, RS6000_BTI_INTSI, ~RS6000_BTI_V16QI, 0 },
++ { VSX_BUILTIN_VEC_XL, VSX_BUILTIN_LD_ELEMREV_V16QI,
++ RS6000_BTI_V16QI, RS6000_BTI_INTSI, ~RS6000_BTI_INTQI, 0 },
++ { VSX_BUILTIN_VEC_XL, VSX_BUILTIN_LD_ELEMREV_V16QI,
++ RS6000_BTI_unsigned_V16QI, RS6000_BTI_INTSI,
++ ~RS6000_BTI_unsigned_V16QI, 0 },
++ { VSX_BUILTIN_VEC_XL, VSX_BUILTIN_LD_ELEMREV_V16QI,
++ RS6000_BTI_unsigned_V16QI, RS6000_BTI_INTSI, ~RS6000_BTI_UINTQI, 0 },
+ { ALTIVEC_BUILTIN_VEC_XOR, ALTIVEC_BUILTIN_VXOR,
+ RS6000_BTI_V4SF, RS6000_BTI_V4SF, RS6000_BTI_V4SF, 0 },
+ { ALTIVEC_BUILTIN_VEC_XOR, ALTIVEC_BUILTIN_VXOR,
+@@ -3475,6 +3518,55 @@
+ RS6000_BTI_void, RS6000_BTI_unsigned_V16QI, RS6000_BTI_INTSI, ~RS6000_BTI_unsigned_V16QI },
+ { ALTIVEC_BUILTIN_VEC_STVRXL, ALTIVEC_BUILTIN_STVRXL,
+ RS6000_BTI_void, RS6000_BTI_unsigned_V16QI, RS6000_BTI_INTSI, ~RS6000_BTI_UINTQI },
++ { VSX_BUILTIN_VEC_XST, VSX_BUILTIN_ST_ELEMREV_V2DF,
++ RS6000_BTI_void, RS6000_BTI_V2DF, RS6000_BTI_INTSI, ~RS6000_BTI_V2DF },
++ { VSX_BUILTIN_VEC_XST, VSX_BUILTIN_ST_ELEMREV_V2DF,
++ RS6000_BTI_void, RS6000_BTI_V2DF, RS6000_BTI_INTSI, ~RS6000_BTI_double },
++ { VSX_BUILTIN_VEC_XST, VSX_BUILTIN_ST_ELEMREV_V2DI,
++ RS6000_BTI_void, RS6000_BTI_V2DI, RS6000_BTI_INTSI, ~RS6000_BTI_V2DI },
++ { VSX_BUILTIN_VEC_XST, VSX_BUILTIN_ST_ELEMREV_V2DI,
++ RS6000_BTI_void, RS6000_BTI_V2DI, RS6000_BTI_INTSI,
++ ~RS6000_BTI_long_long },
++ { VSX_BUILTIN_VEC_XST, VSX_BUILTIN_ST_ELEMREV_V2DI,
++ RS6000_BTI_void, RS6000_BTI_unsigned_V2DI, RS6000_BTI_INTSI,
++ ~RS6000_BTI_unsigned_V2DI },
++ { VSX_BUILTIN_VEC_XST, VSX_BUILTIN_ST_ELEMREV_V2DI,
++ RS6000_BTI_void, RS6000_BTI_unsigned_V2DI, RS6000_BTI_INTSI,
++ ~RS6000_BTI_unsigned_long_long },
++ { VSX_BUILTIN_VEC_XST, VSX_BUILTIN_ST_ELEMREV_V4SF,
++ RS6000_BTI_void, RS6000_BTI_V4SF, RS6000_BTI_INTSI, ~RS6000_BTI_V4SF },
++ { VSX_BUILTIN_VEC_XST, VSX_BUILTIN_ST_ELEMREV_V4SF,
++ RS6000_BTI_void, RS6000_BTI_V4SF, RS6000_BTI_INTSI, ~RS6000_BTI_float },
++ { VSX_BUILTIN_VEC_XST, VSX_BUILTIN_ST_ELEMREV_V4SI,
++ RS6000_BTI_void, RS6000_BTI_V4SI, RS6000_BTI_INTSI, ~RS6000_BTI_V4SI },
++ { VSX_BUILTIN_VEC_XST, VSX_BUILTIN_ST_ELEMREV_V4SI,
++ RS6000_BTI_void, RS6000_BTI_V4SI, RS6000_BTI_INTSI, ~RS6000_BTI_INTSI },
++ { VSX_BUILTIN_VEC_XST, VSX_BUILTIN_ST_ELEMREV_V4SI,
++ RS6000_BTI_void, RS6000_BTI_unsigned_V4SI, RS6000_BTI_INTSI,
++ ~RS6000_BTI_unsigned_V4SI },
++ { VSX_BUILTIN_VEC_XST, VSX_BUILTIN_ST_ELEMREV_V4SI,
++ RS6000_BTI_void, RS6000_BTI_unsigned_V4SI, RS6000_BTI_INTSI,
++ ~RS6000_BTI_UINTSI },
++ { VSX_BUILTIN_VEC_XST, VSX_BUILTIN_ST_ELEMREV_V8HI,
++ RS6000_BTI_void, RS6000_BTI_V8HI, RS6000_BTI_INTSI, ~RS6000_BTI_V8HI },
++ { VSX_BUILTIN_VEC_XST, VSX_BUILTIN_ST_ELEMREV_V8HI,
++ RS6000_BTI_void, RS6000_BTI_V8HI, RS6000_BTI_INTSI, ~RS6000_BTI_INTHI },
++ { VSX_BUILTIN_VEC_XST, VSX_BUILTIN_ST_ELEMREV_V8HI,
++ RS6000_BTI_void, RS6000_BTI_unsigned_V8HI, RS6000_BTI_INTSI,
++ ~RS6000_BTI_unsigned_V8HI },
++ { VSX_BUILTIN_VEC_XST, VSX_BUILTIN_ST_ELEMREV_V8HI,
++ RS6000_BTI_void, RS6000_BTI_unsigned_V8HI, RS6000_BTI_INTSI,
++ ~RS6000_BTI_UINTHI },
++ { VSX_BUILTIN_VEC_XST, VSX_BUILTIN_ST_ELEMREV_V16QI,
++ RS6000_BTI_void, RS6000_BTI_V16QI, RS6000_BTI_INTSI, ~RS6000_BTI_V16QI },
++ { VSX_BUILTIN_VEC_XST, VSX_BUILTIN_ST_ELEMREV_V16QI,
++ RS6000_BTI_void, RS6000_BTI_V16QI, RS6000_BTI_INTSI, ~RS6000_BTI_INTQI },
++ { VSX_BUILTIN_VEC_XST, VSX_BUILTIN_ST_ELEMREV_V16QI,
++ RS6000_BTI_void, RS6000_BTI_unsigned_V16QI, RS6000_BTI_INTSI,
++ ~RS6000_BTI_unsigned_V16QI },
++ { VSX_BUILTIN_VEC_XST, VSX_BUILTIN_ST_ELEMREV_V16QI,
++ RS6000_BTI_void, RS6000_BTI_unsigned_V16QI, RS6000_BTI_INTSI,
++ ~RS6000_BTI_UINTQI },
+ { VSX_BUILTIN_VEC_XXSLDWI, VSX_BUILTIN_XXSLDWI_16QI,
+ RS6000_BTI_V16QI, RS6000_BTI_V16QI, RS6000_BTI_V16QI, RS6000_BTI_NOT_OPAQUE },
+ { VSX_BUILTIN_VEC_XXSLDWI, VSX_BUILTIN_XXSLDWI_16QI,
+@@ -4123,6 +4215,105 @@
+ { P8V_BUILTIN_VEC_VCLZD, P8V_BUILTIN_VCLZD,
+ RS6000_BTI_unsigned_V2DI, RS6000_BTI_unsigned_V2DI, 0, 0 },
+
++ { P9_BUILTIN_DFP_TSTSFI_LT, MISC_BUILTIN_TSTSFI_LT_TD,
++ RS6000_BTI_INTSI, RS6000_BTI_UINTSI, RS6000_BTI_dfloat128, 0 },
++ { P9_BUILTIN_DFP_TSTSFI_LT, MISC_BUILTIN_TSTSFI_LT_DD,
++ RS6000_BTI_INTSI, RS6000_BTI_UINTSI, RS6000_BTI_dfloat64, 0 },
++
++ { P9_BUILTIN_DFP_TSTSFI_LT_TD, MISC_BUILTIN_TSTSFI_LT_TD,
++ RS6000_BTI_INTSI, RS6000_BTI_UINTSI, RS6000_BTI_dfloat128, 0 },
++ { P9_BUILTIN_DFP_TSTSFI_LT_DD, MISC_BUILTIN_TSTSFI_LT_DD,
++ RS6000_BTI_INTSI, RS6000_BTI_UINTSI, RS6000_BTI_dfloat64, 0 },
++
++ { P9_BUILTIN_DFP_TSTSFI_EQ, MISC_BUILTIN_TSTSFI_EQ_TD,
++ RS6000_BTI_INTSI, RS6000_BTI_UINTSI, RS6000_BTI_dfloat128, 0 },
++ { P9_BUILTIN_DFP_TSTSFI_EQ, MISC_BUILTIN_TSTSFI_EQ_DD,
++ RS6000_BTI_INTSI, RS6000_BTI_UINTSI, RS6000_BTI_dfloat64, 0 },
++
++ { P9_BUILTIN_DFP_TSTSFI_EQ_TD, MISC_BUILTIN_TSTSFI_EQ_TD,
++ RS6000_BTI_INTSI, RS6000_BTI_UINTSI, RS6000_BTI_dfloat128, 0 },
++ { P9_BUILTIN_DFP_TSTSFI_EQ_DD, MISC_BUILTIN_TSTSFI_EQ_DD,
++ RS6000_BTI_INTSI, RS6000_BTI_UINTSI, RS6000_BTI_dfloat64, 0 },
++
++ { P9_BUILTIN_DFP_TSTSFI_GT, MISC_BUILTIN_TSTSFI_GT_TD,
++ RS6000_BTI_INTSI, RS6000_BTI_UINTSI, RS6000_BTI_dfloat128, 0 },
++ { P9_BUILTIN_DFP_TSTSFI_GT, MISC_BUILTIN_TSTSFI_GT_DD,
++ RS6000_BTI_INTSI, RS6000_BTI_UINTSI, RS6000_BTI_dfloat64, 0 },
++
++ { P9_BUILTIN_DFP_TSTSFI_GT_TD, MISC_BUILTIN_TSTSFI_GT_TD,
++ RS6000_BTI_INTSI, RS6000_BTI_UINTSI, RS6000_BTI_dfloat128, 0 },
++ { P9_BUILTIN_DFP_TSTSFI_GT_DD, MISC_BUILTIN_TSTSFI_GT_DD,
++ RS6000_BTI_INTSI, RS6000_BTI_UINTSI, RS6000_BTI_dfloat64, 0 },
++
++ { P9_BUILTIN_DFP_TSTSFI_OV, MISC_BUILTIN_TSTSFI_OV_TD,
++ RS6000_BTI_INTSI, RS6000_BTI_UINTSI, RS6000_BTI_dfloat128, 0 },
++ { P9_BUILTIN_DFP_TSTSFI_OV, MISC_BUILTIN_TSTSFI_OV_DD,
++ RS6000_BTI_INTSI, RS6000_BTI_UINTSI, RS6000_BTI_dfloat64, 0 },
++
++ { P9_BUILTIN_DFP_TSTSFI_OV_TD, MISC_BUILTIN_TSTSFI_OV_TD,
++ RS6000_BTI_INTSI, RS6000_BTI_UINTSI, RS6000_BTI_dfloat128, 0 },
++ { P9_BUILTIN_DFP_TSTSFI_OV_DD, MISC_BUILTIN_TSTSFI_OV_DD,
++ RS6000_BTI_INTSI, RS6000_BTI_UINTSI, RS6000_BTI_dfloat64, 0 },
++
++ { P9V_BUILTIN_VEC_VCTZ, P9V_BUILTIN_VCTZB,
++ RS6000_BTI_V16QI, RS6000_BTI_V16QI, 0, 0 },
++ { P9V_BUILTIN_VEC_VCTZ, P9V_BUILTIN_VCTZB,
++ RS6000_BTI_unsigned_V16QI, RS6000_BTI_unsigned_V16QI, 0, 0 },
++ { P9V_BUILTIN_VEC_VCTZ, P9V_BUILTIN_VCTZH,
++ RS6000_BTI_V8HI, RS6000_BTI_V8HI, 0, 0 },
++ { P9V_BUILTIN_VEC_VCTZ, P9V_BUILTIN_VCTZH,
++ RS6000_BTI_unsigned_V8HI, RS6000_BTI_unsigned_V8HI, 0, 0 },
++ { P9V_BUILTIN_VEC_VCTZ, P9V_BUILTIN_VCTZW,
++ RS6000_BTI_V4SI, RS6000_BTI_V4SI, 0, 0 },
++ { P9V_BUILTIN_VEC_VCTZ, P9V_BUILTIN_VCTZW,
++ RS6000_BTI_unsigned_V4SI, RS6000_BTI_unsigned_V4SI, 0, 0 },
++ { P9V_BUILTIN_VEC_VCTZ, P9V_BUILTIN_VCTZD,
++ RS6000_BTI_V2DI, RS6000_BTI_V2DI, 0, 0 },
++ { P9V_BUILTIN_VEC_VCTZ, P9V_BUILTIN_VCTZD,
++ RS6000_BTI_unsigned_V2DI, RS6000_BTI_unsigned_V2DI, 0, 0 },
++
++ { P9V_BUILTIN_VEC_VCTZB, P9V_BUILTIN_VCTZB,
++ RS6000_BTI_V16QI, RS6000_BTI_V16QI, 0, 0 },
++ { P9V_BUILTIN_VEC_VCTZB, P9V_BUILTIN_VCTZB,
++ RS6000_BTI_unsigned_V16QI, RS6000_BTI_unsigned_V16QI, 0, 0 },
++
++ { P9V_BUILTIN_VEC_VCTZH, P9V_BUILTIN_VCTZH,
++ RS6000_BTI_V8HI, RS6000_BTI_V8HI, 0, 0 },
++ { P9V_BUILTIN_VEC_VCTZH, P9V_BUILTIN_VCTZH,
++ RS6000_BTI_unsigned_V8HI, RS6000_BTI_unsigned_V8HI, 0, 0 },
++
++ { P9V_BUILTIN_VEC_VCTZW, P9V_BUILTIN_VCTZW,
++ RS6000_BTI_V4SI, RS6000_BTI_V4SI, 0, 0 },
++ { P9V_BUILTIN_VEC_VCTZW, P9V_BUILTIN_VCTZW,
++ RS6000_BTI_unsigned_V4SI, RS6000_BTI_unsigned_V4SI, 0, 0 },
++
++ { P9V_BUILTIN_VEC_VCTZD, P9V_BUILTIN_VCTZD,
++ RS6000_BTI_V2DI, RS6000_BTI_V2DI, 0, 0 },
++ { P9V_BUILTIN_VEC_VCTZD, P9V_BUILTIN_VCTZD,
++ RS6000_BTI_unsigned_V2DI, RS6000_BTI_unsigned_V2DI, 0, 0 },
++
++ { P9V_BUILTIN_VEC_VADU, P9V_BUILTIN_VADUB,
++ RS6000_BTI_unsigned_V16QI, RS6000_BTI_unsigned_V16QI,
++ RS6000_BTI_unsigned_V16QI, 0 },
++ { P9V_BUILTIN_VEC_VADU, P9V_BUILTIN_VADUH,
++ RS6000_BTI_unsigned_V8HI, RS6000_BTI_unsigned_V8HI,
++ RS6000_BTI_unsigned_V8HI, 0 },
++ { P9V_BUILTIN_VEC_VADU, P9V_BUILTIN_VADUW,
++ RS6000_BTI_unsigned_V4SI, RS6000_BTI_unsigned_V4SI,
++ RS6000_BTI_unsigned_V4SI, 0 },
++
++ { P9V_BUILTIN_VEC_VADUB, P9V_BUILTIN_VADUB,
++ RS6000_BTI_unsigned_V16QI, RS6000_BTI_unsigned_V16QI,
++ RS6000_BTI_unsigned_V16QI, 0 },
++
++ { P9V_BUILTIN_VEC_VADUH, P9V_BUILTIN_VADUH,
++ RS6000_BTI_unsigned_V8HI, RS6000_BTI_unsigned_V8HI,
++ RS6000_BTI_unsigned_V8HI, 0 },
++
++ { P9V_BUILTIN_VEC_VADUW, P9V_BUILTIN_VADUW,
++ RS6000_BTI_unsigned_V4SI, RS6000_BTI_unsigned_V4SI,
++ RS6000_BTI_unsigned_V4SI, 0 },
++
+ { P8V_BUILTIN_VEC_VGBBD, P8V_BUILTIN_VGBBD,
+ RS6000_BTI_V16QI, RS6000_BTI_V16QI, 0, 0 },
+ { P8V_BUILTIN_VEC_VGBBD, P8V_BUILTIN_VGBBD,
+@@ -4252,6 +4443,42 @@
+ { P8V_BUILTIN_VEC_VPOPCNTD, P8V_BUILTIN_VPOPCNTD,
+ RS6000_BTI_unsigned_V2DI, RS6000_BTI_unsigned_V2DI, 0, 0 },
+
++ { P9V_BUILTIN_VEC_VPRTYB, P9V_BUILTIN_VPRTYBW,
++ RS6000_BTI_V4SI, RS6000_BTI_V4SI, 0, 0 },
++ { P9V_BUILTIN_VEC_VPRTYB, P9V_BUILTIN_VPRTYBW,
++ RS6000_BTI_unsigned_V4SI, RS6000_BTI_unsigned_V4SI, 0, 0 },
++ { P9V_BUILTIN_VEC_VPRTYB, P9V_BUILTIN_VPRTYBD,
++ RS6000_BTI_V2DI, RS6000_BTI_V2DI, 0, 0 },
++ { P9V_BUILTIN_VEC_VPRTYB, P9V_BUILTIN_VPRTYBD,
++ RS6000_BTI_unsigned_V2DI, RS6000_BTI_unsigned_V2DI, 0, 0 },
++ { P9V_BUILTIN_VEC_VPRTYB, P9V_BUILTIN_VPRTYBQ,
++ RS6000_BTI_V1TI, RS6000_BTI_V1TI, 0, 0 },
++ { P9V_BUILTIN_VEC_VPRTYB, P9V_BUILTIN_VPRTYBQ,
++ RS6000_BTI_unsigned_V1TI, RS6000_BTI_unsigned_V1TI, 0, 0 },
++ { P9V_BUILTIN_VEC_VPRTYB, P9V_BUILTIN_VPRTYBQ,
++ RS6000_BTI_INTTI, RS6000_BTI_INTTI, 0, 0 },
++ { P9V_BUILTIN_VEC_VPRTYB, P9V_BUILTIN_VPRTYBQ,
++ RS6000_BTI_UINTTI, RS6000_BTI_UINTTI, 0, 0 },
++
++ { P9V_BUILTIN_VEC_VPRTYBW, P9V_BUILTIN_VPRTYBW,
++ RS6000_BTI_V4SI, RS6000_BTI_V4SI, 0, 0 },
++ { P9V_BUILTIN_VEC_VPRTYBW, P9V_BUILTIN_VPRTYBW,
++ RS6000_BTI_unsigned_V4SI, RS6000_BTI_unsigned_V4SI, 0, 0 },
++
++ { P9V_BUILTIN_VEC_VPRTYBD, P9V_BUILTIN_VPRTYBD,
++ RS6000_BTI_V2DI, RS6000_BTI_V2DI, 0, 0 },
++ { P9V_BUILTIN_VEC_VPRTYBD, P9V_BUILTIN_VPRTYBD,
++ RS6000_BTI_unsigned_V2DI, RS6000_BTI_unsigned_V2DI, 0, 0 },
++
++ { P9V_BUILTIN_VEC_VPRTYBQ, P9V_BUILTIN_VPRTYBQ,
++ RS6000_BTI_V1TI, RS6000_BTI_V1TI, 0, 0 },
++ { P9V_BUILTIN_VEC_VPRTYBQ, P9V_BUILTIN_VPRTYBQ,
++ RS6000_BTI_unsigned_V1TI, RS6000_BTI_unsigned_V1TI, 0, 0 },
++ { P9V_BUILTIN_VEC_VPRTYBQ, P9V_BUILTIN_VPRTYBQ,
++ RS6000_BTI_INTTI, RS6000_BTI_INTTI, 0, 0 },
++ { P9V_BUILTIN_VEC_VPRTYBQ, P9V_BUILTIN_VPRTYBQ,
++ RS6000_BTI_UINTTI, RS6000_BTI_UINTTI, 0, 0 },
++
+ { P8V_BUILTIN_VEC_VPKUDUM, P8V_BUILTIN_VPKUDUM,
+ RS6000_BTI_V4SI, RS6000_BTI_V2DI, RS6000_BTI_V2DI, 0 },
+ { P8V_BUILTIN_VEC_VPKUDUM, P8V_BUILTIN_VPKUDUM,
+@@ -4328,6 +4555,13 @@
+ { P8V_BUILTIN_VEC_VGBBD, P8V_BUILTIN_VGBBD,
+ RS6000_BTI_unsigned_V16QI, 0, 0, 0 },
+
++ { P9V_BUILTIN_VEC_VSLV, P9V_BUILTIN_VSLV,
++ RS6000_BTI_unsigned_V16QI, RS6000_BTI_unsigned_V16QI,
++ RS6000_BTI_unsigned_V16QI, 0 },
++ { P9V_BUILTIN_VEC_VSRV, P9V_BUILTIN_VSRV,
++ RS6000_BTI_unsigned_V16QI, RS6000_BTI_unsigned_V16QI,
++ RS6000_BTI_unsigned_V16QI, 0 },
++
+ /* Crypto builtins. */
+ { CRYPTO_BUILTIN_VPERMXOR, CRYPTO_BUILTIN_VPERMXOR_V16QI,
+ RS6000_BTI_unsigned_V16QI, RS6000_BTI_unsigned_V16QI,
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/config/rs6000/rs6000-cpus.def gcc-6-20160721/gcc/config/rs6000/rs6000-cpus.def
+--- gcc-6.1.0/gcc/config/rs6000/rs6000-cpus.def 2016-03-23 20:33:28.000000000 +0000
++++ gcc-6-20160721/gcc/config/rs6000/rs6000-cpus.def 2016-07-08 14:51:44.000000000 +0000
+@@ -60,15 +60,26 @@
+ | OPTION_MASK_UPPER_REGS_SF)
+
+ /* Add ISEL back into ISA 3.0, since it is supposed to be a win. Do not add
+- P9_DFORM or P9_MINMAX until they are fully debugged. */
++ P9_MINMAX until the hardware that supports it is available. Do not add
++ FLOAT128_HW here until we are ready to make -mfloat128 on by default. */
+ #define ISA_3_0_MASKS_SERVER (ISA_2_7_MASKS_SERVER \
+- | OPTION_MASK_FLOAT128_HW \
+ | OPTION_MASK_ISEL \
+ | OPTION_MASK_MODULO \
+ | OPTION_MASK_P9_FUSION \
+- | OPTION_MASK_P9_DFORM \
++ | OPTION_MASK_P9_DFORM_SCALAR \
++ | OPTION_MASK_P9_DFORM_VECTOR \
++ | OPTION_MASK_P9_MISC \
+ | OPTION_MASK_P9_VECTOR)
+
++/* Support for the IEEE 128-bit floating point hardware requires a lot of the
++ VSX instructions that are part of ISA 3.0. */
++#define ISA_3_0_MASKS_IEEE (OPTION_MASK_VSX \
++ | OPTION_MASK_P8_VECTOR \
++ | OPTION_MASK_P9_VECTOR \
++ | OPTION_MASK_DIRECT_MOVE \
++ | OPTION_MASK_UPPER_REGS_DF \
++ | OPTION_MASK_UPPER_REGS_SF)
++
+ #define POWERPC_7400_MASK (OPTION_MASK_PPC_GFXOPT | OPTION_MASK_ALTIVEC)
+
+ /* Deal with ports that do not have -mstrict-align. */
+@@ -94,6 +105,7 @@
+ | OPTION_MASK_FPRND \
+ | OPTION_MASK_HTM \
+ | OPTION_MASK_ISEL \
++ | OPTION_MASK_LRA \
+ | OPTION_MASK_MFCRF \
+ | OPTION_MASK_MFPGPR \
+ | OPTION_MASK_MODULO \
+@@ -101,9 +113,11 @@
+ | OPTION_MASK_NO_UPDATE \
+ | OPTION_MASK_P8_FUSION \
+ | OPTION_MASK_P8_VECTOR \
+- | OPTION_MASK_P9_DFORM \
++ | OPTION_MASK_P9_DFORM_SCALAR \
++ | OPTION_MASK_P9_DFORM_VECTOR \
+ | OPTION_MASK_P9_FUSION \
+ | OPTION_MASK_P9_MINMAX \
++ | OPTION_MASK_P9_MISC \
+ | OPTION_MASK_P9_VECTOR \
+ | OPTION_MASK_POPCNTB \
+ | OPTION_MASK_POPCNTD \
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/config/rs6000/rs6000-protos.h gcc-6-20160721/gcc/config/rs6000/rs6000-protos.h
+--- gcc-6.1.0/gcc/config/rs6000/rs6000-protos.h 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/gcc/config/rs6000/rs6000-protos.h 2016-07-12 19:51:09.000000000 +0000
+@@ -31,6 +31,7 @@
+ #endif /* TREE_CODE */
+
+ extern bool easy_altivec_constant (rtx, machine_mode);
++extern bool xxspltib_constant_p (rtx, machine_mode, int *, int *);
+ extern int vspltis_shifted (rtx);
+ extern HOST_WIDE_INT const_vector_elt_as_int (rtx, unsigned int);
+ extern bool macho_lo_sum_memory_operand (rtx, machine_mode);
+@@ -86,6 +87,7 @@
+ extern int mems_ok_for_quad_peep (rtx, rtx);
+ extern bool gpr_or_gpr_p (rtx, rtx);
+ extern bool direct_move_p (rtx, rtx);
++extern bool quad_address_p (rtx, machine_mode, bool);
+ extern bool quad_load_store_p (rtx, rtx);
+ extern bool fusion_gpr_load_p (rtx, rtx, rtx, rtx);
+ extern void expand_fusion_gpr_load (rtx *);
+@@ -133,6 +135,7 @@
+ extern int rs6000_emit_cmove (rtx, rtx, rtx, rtx);
+ extern int rs6000_emit_vector_cond_expr (rtx, rtx, rtx, rtx, rtx, rtx);
+ extern void rs6000_emit_minmax (rtx, enum rtx_code, rtx, rtx);
++extern void rs6000_split_signbit (rtx, rtx);
+ extern void rs6000_expand_atomic_compare_and_swap (rtx op[]);
+ extern void rs6000_expand_atomic_exchange (rtx op[]);
+ extern void rs6000_expand_atomic_op (enum rtx_code, rtx, rtx, rtx, rtx, rtx);
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/config/rs6000/rs6000.c gcc-6-20160721/gcc/config/rs6000/rs6000.c
+--- gcc-6.1.0/gcc/config/rs6000/rs6000.c 2016-04-14 23:21:30.000000000 +0000
++++ gcc-6-20160721/gcc/config/rs6000/rs6000.c 2016-07-19 03:39:34.000000000 +0000
+@@ -452,6 +452,7 @@
+ #define RELOAD_REG_PRE_INCDEC 0x10 /* PRE_INC/PRE_DEC valid. */
+ #define RELOAD_REG_PRE_MODIFY 0x20 /* PRE_MODIFY valid. */
+ #define RELOAD_REG_AND_M16 0x40 /* AND -16 addressing. */
++#define RELOAD_REG_QUAD_OFFSET 0x80 /* quad offset is limited. */
+
+ /* Register type masks based on the type, of valid addressing modes. */
+ struct rs6000_reg_addr {
+@@ -499,6 +500,16 @@
+ return ((reg_addr[mode].addr_mask[RELOAD_REG_VMX] & RELOAD_REG_OFFSET) != 0);
+ }
+
++/* Return true if we have D-form addressing in VSX registers. This addressing
++ is more limited than normal d-form addressing in that the offset must be
++ aligned on a 16-byte boundary. */
++static inline bool
++mode_supports_vsx_dform_quad (machine_mode mode)
++{
++ return ((reg_addr[mode].addr_mask[RELOAD_REG_ANY] & RELOAD_REG_QUAD_OFFSET)
++ != 0);
++}
++
+
+ /* Target cpu costs. */
+
+@@ -1093,16 +1104,16 @@
+ COSTS_N_INSNS (3), /* mulsi_const */
+ COSTS_N_INSNS (3), /* mulsi_const9 */
+ COSTS_N_INSNS (3), /* muldi */
+- COSTS_N_INSNS (19), /* divsi */
+- COSTS_N_INSNS (35), /* divdi */
++ COSTS_N_INSNS (8), /* divsi */
++ COSTS_N_INSNS (12), /* divdi */
+ COSTS_N_INSNS (3), /* fp */
+ COSTS_N_INSNS (3), /* dmul */
+- COSTS_N_INSNS (14), /* sdiv */
+- COSTS_N_INSNS (17), /* ddiv */
++ COSTS_N_INSNS (13), /* sdiv */
++ COSTS_N_INSNS (18), /* ddiv */
+ 128, /* cache line size */
+ 32, /* l1 cache */
+- 256, /* l2 cache */
+- 12, /* prefetch streams */
++ 512, /* l2 cache */
++ 8, /* prefetch streams */
+ COSTS_N_INSNS (3), /* SF->DF convert */
+ };
+
+@@ -1128,6 +1139,7 @@
+
+
+ /* Table that classifies rs6000 builtin functions (pure, const, etc.). */
++#undef RS6000_BUILTIN_0
+ #undef RS6000_BUILTIN_1
+ #undef RS6000_BUILTIN_2
+ #undef RS6000_BUILTIN_3
+@@ -1140,6 +1152,9 @@
+ #undef RS6000_BUILTIN_S
+ #undef RS6000_BUILTIN_X
+
++#define RS6000_BUILTIN_0(ENUM, NAME, MASK, ATTR, ICODE) \
++ { NAME, ICODE, MASK, ATTR },
++
+ #define RS6000_BUILTIN_1(ENUM, NAME, MASK, ATTR, ICODE) \
+ { NAME, ICODE, MASK, ATTR },
+
+@@ -1185,6 +1200,7 @@
+ #include "rs6000-builtin.def"
+ };
+
++#undef RS6000_BUILTIN_0
+ #undef RS6000_BUILTIN_1
+ #undef RS6000_BUILTIN_2
+ #undef RS6000_BUILTIN_3
+@@ -1312,6 +1328,7 @@
+ bool);
+ rtl_opt_pass *make_pass_analyze_swaps (gcc::context*);
+ static bool rs6000_keep_leaf_when_profiled () __attribute__ ((unused));
++static tree rs6000_fold_builtin (tree, int, tree *, bool);
+
+ /* Hash table stuff for keeping track of TOC entries. */
+
+@@ -1586,6 +1603,9 @@
+ #undef TARGET_BUILTIN_DECL
+ #define TARGET_BUILTIN_DECL rs6000_builtin_decl
+
++#undef TARGET_FOLD_BUILTIN
++#define TARGET_FOLD_BUILTIN rs6000_fold_builtin
++
+ #undef TARGET_EXPAND_BUILTIN
+ #define TARGET_EXPAND_BUILTIN rs6000_expand_builtin
+
+@@ -1866,7 +1886,7 @@
+ 128-bit floating point that can go in vector registers, which has VSX
+ memory addressing. */
+ if (FP_REGNO_P (regno))
+- reg_size = (VECTOR_MEM_VSX_P (mode)
++ reg_size = (VECTOR_MEM_VSX_P (mode) || FLOAT128_VECTOR_P (mode)
+ ? UNITS_PER_VSX_WORD
+ : UNITS_PER_FP_WORD);
+
+@@ -1898,6 +1918,9 @@
+ {
+ int last_regno = regno + rs6000_hard_regno_nregs[mode][regno] - 1;
+
++ if (COMPLEX_MODE_P (mode))
++ mode = GET_MODE_INNER (mode);
++
+ /* PTImode can only go in GPRs. Quad word memory operations require even/odd
+ register combinations, and use PTImode where we need to deal with quad
+ word memory operations. Don't allow quad words in the argument or frame
+@@ -2105,7 +2128,9 @@
+ else if (keep_spaces)
+ *p++ = ' ';
+
+- if ((mask & RELOAD_REG_OFFSET) != 0)
++ if ((mask & RELOAD_REG_QUAD_OFFSET) != 0)
++ *p++ = 'O';
++ else if ((mask & RELOAD_REG_OFFSET) != 0)
+ *p++ = 'o';
+ else if (keep_spaces)
+ *p++ = ' ';
+@@ -2642,8 +2667,7 @@
+ if (TARGET_LINK_STACK)
+ fprintf (stderr, DEBUG_FMT_S, "link_stack", "true");
+
+- if (targetm.lra_p ())
+- fprintf (stderr, DEBUG_FMT_S, "lra", "true");
++ fprintf (stderr, DEBUG_FMT_S, "lra", TARGET_LRA ? "true" : "false");
+
+ if (TARGET_P8_FUSION)
+ {
+@@ -2699,8 +2723,17 @@
+
+ for (m = 0; m < NUM_MACHINE_MODES; ++m)
+ {
+- machine_mode m2 = (machine_mode)m;
+- unsigned short msize = GET_MODE_SIZE (m2);
++ machine_mode m2 = (machine_mode) m;
++ bool complex_p = false;
++ size_t msize;
++
++ if (COMPLEX_MODE_P (m2))
++ {
++ complex_p = true;
++ m2 = GET_MODE_INNER (m2);
++ }
++
++ msize = GET_MODE_SIZE (m2);
+
+ /* SDmode is special in that we want to access it only via REG+REG
+ addressing on power7 and above, since we want to use the LFIWZX and
+@@ -2722,7 +2755,7 @@
+ /* Indicate if the mode takes more than 1 physical register. If
+ it takes a single register, indicate it can do REG+REG
+ addressing. */
+- if (nregs > 1 || m == BLKmode)
++ if (nregs > 1 || m == BLKmode || complex_p)
+ addr_mask |= RELOAD_REG_MULTIPLE;
+ else
+ addr_mask |= RELOAD_REG_INDEXED;
+@@ -2738,7 +2771,7 @@
+ && msize <= 8
+ && !VECTOR_MODE_P (m2)
+ && !FLOAT128_VECTOR_P (m2)
+- && !COMPLEX_MODE_P (m2)
++ && !complex_p
+ && (m2 != DFmode || !TARGET_UPPER_REGS_DF)
+ && (m2 != SFmode || !TARGET_UPPER_REGS_SF)
+ && !(TARGET_E500_DOUBLE && msize == 8))
+@@ -2769,17 +2802,31 @@
+ }
+
+ /* GPR and FPR registers can do REG+OFFSET addressing, except
+- possibly for SDmode. ISA 3.0 (i.e. power9) adds D-form
+- addressing for scalars to altivec registers. */
++ possibly for SDmode. ISA 3.0 (i.e. power9) adds D-form addressing
++ for 64-bit scalars and 32-bit SFmode to altivec registers. */
+ if ((addr_mask != 0) && !indexed_only_p
+ && msize <= 8
+ && (rc == RELOAD_REG_GPR
+- || rc == RELOAD_REG_FPR
+- || (rc == RELOAD_REG_VMX
+- && TARGET_P9_DFORM
+- && (m2 == DFmode || m2 == SFmode))))
++ || ((msize == 8 || m2 == SFmode)
++ && (rc == RELOAD_REG_FPR
++ || (rc == RELOAD_REG_VMX
++ && TARGET_P9_DFORM_SCALAR)))))
+ addr_mask |= RELOAD_REG_OFFSET;
+
++ /* VSX registers can do REG+OFFSET addresssing if ISA 3.0
++ instructions are enabled. The offset for 128-bit VSX registers is
++ only 12-bits. While GPRs can handle the full offset range, VSX
++ registers can only handle the restricted range. */
++ else if ((addr_mask != 0) && !indexed_only_p
++ && msize == 16 && TARGET_P9_DFORM_VECTOR
++ && (ALTIVEC_OR_VSX_VECTOR_MODE (m2)
++ || (m2 == TImode && TARGET_VSX_TIMODE)))
++ {
++ addr_mask |= RELOAD_REG_OFFSET;
++ if (rc == RELOAD_REG_FPR || rc == RELOAD_REG_VMX)
++ addr_mask |= RELOAD_REG_QUAD_OFFSET;
++ }
++
+ /* VMX registers can do (REG & -16) and ((REG+REG) & -16)
+ addressing on 128-bit types. */
+ if (rc == RELOAD_REG_VMX && msize == 16
+@@ -3102,7 +3149,7 @@
+ }
+
+ /* Support for new D-form instructions. */
+- if (TARGET_P9_DFORM)
++ if (TARGET_P9_DFORM_SCALAR)
+ rs6000_constraints[RS6000_CONSTRAINT_wb] = ALTIVEC_REGS;
+
+ /* Support for ISA 3.0 (power9) vectors. */
+@@ -3621,11 +3668,16 @@
+ | ((TARGET_POPCNTD) ? RS6000_BTM_POPCNTD : 0)
+ | ((rs6000_cpu == PROCESSOR_CELL) ? RS6000_BTM_CELL : 0)
+ | ((TARGET_P8_VECTOR) ? RS6000_BTM_P8_VECTOR : 0)
++ | ((TARGET_P9_VECTOR) ? RS6000_BTM_P9_VECTOR : 0)
++ | ((TARGET_P9_MISC) ? RS6000_BTM_P9_MISC : 0)
++ | ((TARGET_MODULO) ? RS6000_BTM_MODULO : 0)
++ | ((TARGET_64BIT) ? RS6000_BTM_64BIT : 0)
+ | ((TARGET_CRYPTO) ? RS6000_BTM_CRYPTO : 0)
+ | ((TARGET_HTM) ? RS6000_BTM_HTM : 0)
+ | ((TARGET_DFP) ? RS6000_BTM_DFP : 0)
+ | ((TARGET_HARD_FLOAT) ? RS6000_BTM_HARD_FLOAT : 0)
+- | ((TARGET_LONG_DOUBLE_128) ? RS6000_BTM_LDBL128 : 0));
++ | ((TARGET_LONG_DOUBLE_128) ? RS6000_BTM_LDBL128 : 0)
++ | ((TARGET_FLOAT128) ? RS6000_BTM_FLOAT128 : 0));
+ }
+
+ /* Implement TARGET_MD_ASM_ADJUST. All asm statements are considered
+@@ -3784,22 +3836,7 @@
+ if (rs6000_tune_index >= 0)
+ tune_index = rs6000_tune_index;
+ else if (have_cpu)
+- {
+- /* Until power9 tuning is available, use power8 tuning if -mcpu=power9. */
+- if (processor_target_table[cpu_index].processor != PROCESSOR_POWER9)
+- rs6000_tune_index = tune_index = cpu_index;
+- else
+- {
+- size_t i;
+- tune_index = -1;
+- for (i = 0; i < ARRAY_SIZE (processor_target_table); i++)
+- if (processor_target_table[i].processor == PROCESSOR_POWER8)
+- {
+- rs6000_tune_index = tune_index = i;
+- break;
+- }
+- }
+- }
++ rs6000_tune_index = tune_index = cpu_index;
+ else
+ {
+ size_t i;
+@@ -3974,7 +4011,8 @@
+
+ /* For the newer switches (vsx, dfp, etc.) set some of the older options,
+ unless the user explicitly used the -mno-<option> to disable the code. */
+- if (TARGET_P9_VECTOR || TARGET_MODULO || TARGET_P9_DFORM || TARGET_P9_MINMAX)
++ if (TARGET_P9_VECTOR || TARGET_MODULO || TARGET_P9_DFORM_SCALAR
++ || TARGET_P9_DFORM_VECTOR || TARGET_P9_DFORM_BOTH > 0 || TARGET_P9_MINMAX)
+ rs6000_isa_flags |= (ISA_3_0_MASKS_SERVER & ~rs6000_isa_flags_explicit);
+ else if (TARGET_P8_VECTOR || TARGET_DIRECT_MOVE || TARGET_CRYPTO)
+ rs6000_isa_flags |= (ISA_2_7_MASKS_SERVER & ~rs6000_isa_flags_explicit);
+@@ -4188,34 +4226,80 @@
+ && !(rs6000_isa_flags_explicit & OPTION_MASK_TOC_FUSION))
+ rs6000_isa_flags |= OPTION_MASK_TOC_FUSION;
+
++ /* ISA 3.0 vector instructions include ISA 2.07. */
++ if (TARGET_P9_VECTOR && !TARGET_P8_VECTOR)
++ {
++ if (rs6000_isa_flags_explicit & OPTION_MASK_P8_VECTOR)
++ error ("-mpower9-vector requires -mpower8-vector");
++ rs6000_isa_flags &= ~OPTION_MASK_P9_VECTOR;
++ }
++
++ /* -mpower9-dform turns on both -mpower9-dform-scalar and
++ -mpower9-dform-vector. */
++ if (TARGET_P9_DFORM_BOTH > 0)
++ {
++ if (!(rs6000_isa_flags_explicit & OPTION_MASK_P9_DFORM_VECTOR))
++ rs6000_isa_flags |= OPTION_MASK_P9_DFORM_VECTOR;
++
++ if (!(rs6000_isa_flags_explicit & OPTION_MASK_P9_DFORM_SCALAR))
++ rs6000_isa_flags |= OPTION_MASK_P9_DFORM_SCALAR;
++ }
++ else if (TARGET_P9_DFORM_BOTH == 0)
++ {
++ if (!(rs6000_isa_flags_explicit & OPTION_MASK_P9_DFORM_VECTOR))
++ rs6000_isa_flags &= ~OPTION_MASK_P9_DFORM_VECTOR;
++
++ if (!(rs6000_isa_flags_explicit & OPTION_MASK_P9_DFORM_SCALAR))
++ rs6000_isa_flags &= ~OPTION_MASK_P9_DFORM_SCALAR;
++ }
++
+ /* ISA 3.0 D-form instructions require p9-vector and upper-regs. */
+- if (TARGET_P9_DFORM && !TARGET_P9_VECTOR)
++ if ((TARGET_P9_DFORM_SCALAR || TARGET_P9_DFORM_VECTOR) && !TARGET_P9_VECTOR)
+ {
+ if (rs6000_isa_flags_explicit & OPTION_MASK_P9_VECTOR)
+ error ("-mpower9-dform requires -mpower9-vector");
+- rs6000_isa_flags &= ~OPTION_MASK_P9_DFORM;
++ rs6000_isa_flags &= ~(OPTION_MASK_P9_DFORM_SCALAR
++ | OPTION_MASK_P9_DFORM_VECTOR);
+ }
+
+- if (TARGET_P9_DFORM && !TARGET_UPPER_REGS_DF)
++ if (TARGET_P9_DFORM_SCALAR && !TARGET_UPPER_REGS_DF)
+ {
+ if (rs6000_isa_flags_explicit & OPTION_MASK_UPPER_REGS_DF)
+ error ("-mpower9-dform requires -mupper-regs-df");
+- rs6000_isa_flags &= ~OPTION_MASK_P9_DFORM;
++ rs6000_isa_flags &= ~OPTION_MASK_P9_DFORM_SCALAR;
+ }
+
+- if (TARGET_P9_DFORM && !TARGET_UPPER_REGS_SF)
++ if (TARGET_P9_DFORM_SCALAR && !TARGET_UPPER_REGS_SF)
+ {
+ if (rs6000_isa_flags_explicit & OPTION_MASK_UPPER_REGS_SF)
+ error ("-mpower9-dform requires -mupper-regs-sf");
+- rs6000_isa_flags &= ~OPTION_MASK_P9_DFORM;
++ rs6000_isa_flags &= ~OPTION_MASK_P9_DFORM_SCALAR;
+ }
+
+- /* ISA 3.0 vector instructions include ISA 2.07. */
+- if (TARGET_P9_VECTOR && !TARGET_P8_VECTOR)
++ /* There have been bugs with -mvsx-timode that don't show up with -mlra,
++ but do show up with -mno-lra. Given -mlra will become the default once
++ PR 69847 is fixed, turn off the options with problems by default if
++ -mno-lra was used, and warn if the user explicitly asked for the option.
++
++ Enable -mpower9-dform-vector by default if LRA and other power9 options.
++ Enable -mvsx-timode by default if LRA and VSX. */
++ if (!TARGET_LRA)
+ {
+- if (rs6000_isa_flags_explicit & OPTION_MASK_P8_VECTOR)
+- error ("-mpower9-vector requires -mpower8-vector");
+- rs6000_isa_flags &= ~OPTION_MASK_P9_VECTOR;
++ if (TARGET_VSX_TIMODE)
++ {
++ if ((rs6000_isa_flags_explicit & OPTION_MASK_VSX_TIMODE) != 0)
++ warning (0, "-mvsx-timode might need -mlra");
++
++ else
++ rs6000_isa_flags &= ~OPTION_MASK_VSX_TIMODE;
++ }
++ }
++
++ else
++ {
++ if (TARGET_VSX && !TARGET_VSX_TIMODE
++ && (rs6000_isa_flags_explicit & OPTION_MASK_VSX_TIMODE) == 0)
++ rs6000_isa_flags |= OPTION_MASK_VSX_TIMODE;
+ }
+
+ /* Set -mallow-movmisalign to explicitly on if we have full ISA 2.07
+@@ -4267,13 +4351,21 @@
+ rs6000_isa_flags &= ~(OPTION_MASK_FLOAT128 | OPTION_MASK_FLOAT128_HW);
+ }
+
++ /* If we have -mfloat128 and full ISA 3.0 support, enable -mfloat128-hardware
++ by default. */
++ if (TARGET_FLOAT128 && !TARGET_FLOAT128_HW
++ && (rs6000_isa_flags & ISA_3_0_MASKS_IEEE) == ISA_3_0_MASKS_IEEE
++ && !(rs6000_isa_flags_explicit & OPTION_MASK_FLOAT128_HW))
++ {
++ rs6000_isa_flags |= OPTION_MASK_FLOAT128_HW;
++ if ((rs6000_isa_flags & OPTION_MASK_FLOAT128) != 0)
++ rs6000_isa_flags_explicit |= OPTION_MASK_FLOAT128_HW;
++ }
++
+ /* IEEE 128-bit floating point hardware instructions imply enabling
+ __float128. */
+ if (TARGET_FLOAT128_HW
+- && (rs6000_isa_flags & (OPTION_MASK_P9_VECTOR
+- | OPTION_MASK_DIRECT_MOVE
+- | OPTION_MASK_UPPER_REGS_DF
+- | OPTION_MASK_UPPER_REGS_SF)) == 0)
++ && (rs6000_isa_flags & ISA_3_0_MASKS_IEEE) != ISA_3_0_MASKS_IEEE)
+ {
+ if ((rs6000_isa_flags_explicit & OPTION_MASK_FLOAT128_HW) != 0)
+ error ("-mfloat128-hardware requires full ISA 3.0 support");
+@@ -4281,10 +4373,6 @@
+ rs6000_isa_flags &= ~OPTION_MASK_FLOAT128_HW;
+ }
+
+- else if (TARGET_P9_VECTOR && !TARGET_FLOAT128_HW
+- && (rs6000_isa_flags_explicit & OPTION_MASK_FLOAT128_HW) == 0)
+- rs6000_isa_flags |= OPTION_MASK_FLOAT128_HW;
+-
+ if (TARGET_FLOAT128_HW
+ && (rs6000_isa_flags_explicit & OPTION_MASK_FLOAT128) == 0)
+ rs6000_isa_flags |= OPTION_MASK_FLOAT128;
+@@ -4494,8 +4582,7 @@
+ rs6000_sched_groups = (rs6000_cpu == PROCESSOR_POWER4
+ || rs6000_cpu == PROCESSOR_POWER5
+ || rs6000_cpu == PROCESSOR_POWER7
+- || rs6000_cpu == PROCESSOR_POWER8
+- || rs6000_cpu == PROCESSOR_POWER9);
++ || rs6000_cpu == PROCESSOR_POWER8);
+ rs6000_align_branch_targets = (rs6000_cpu == PROCESSOR_POWER4
+ || rs6000_cpu == PROCESSOR_POWER5
+ || rs6000_cpu == PROCESSOR_POWER6
+@@ -6134,6 +6221,128 @@
+ gcc_unreachable ();
+ }
+
++/* Return true if OP is of the given MODE and can be synthesized with ISA 3.0
++ instructions (xxspltib, vupkhsb/vextsb2w/vextb2d).
++
++ Return the number of instructions needed (1 or 2) into the address pointed
++ via NUM_INSNS_PTR.
++
++ If NOSPLIT_P, only return true for constants that only generate the XXSPLTIB
++ instruction and can go in any VSX register. If !NOSPLIT_P, only return true
++ for constants that generate XXSPLTIB and need a sign extend operation, which
++ restricts us to the Altivec registers.
++
++ Allow either (vec_const [...]) or (vec_duplicate <const>). If OP is a valid
++ XXSPLTIB constant, return the constant being set via the CONST_PTR
++ pointer. */
++
++bool
++xxspltib_constant_p (rtx op,
++ machine_mode mode,
++ int *num_insns_ptr,
++ int *constant_ptr)
++{
++ size_t nunits = GET_MODE_NUNITS (mode);
++ size_t i;
++ HOST_WIDE_INT value;
++ rtx element;
++
++ /* Set the returned values to out of bound values. */
++ *num_insns_ptr = -1;
++ *constant_ptr = 256;
++
++ if (!TARGET_P9_VECTOR)
++ return false;
++
++ if (mode == VOIDmode)
++ mode = GET_MODE (op);
++
++ else if (mode != GET_MODE (op))
++ return false;
++
++ /* Handle (vec_duplicate <constant>). */
++ if (GET_CODE (op) == VEC_DUPLICATE)
++ {
++ if (mode != V16QImode && mode != V8HImode && mode != V4SImode
++ && mode != V2DImode)
++ return false;
++
++ element = XEXP (op, 0);
++ if (!CONST_INT_P (element))
++ return false;
++
++ value = INTVAL (element);
++ if (!IN_RANGE (value, -128, 127))
++ return false;
++ }
++
++ /* Handle (const_vector [...]). */
++ else if (GET_CODE (op) == CONST_VECTOR)
++ {
++ if (mode != V16QImode && mode != V8HImode && mode != V4SImode
++ && mode != V2DImode)
++ return false;
++
++ element = CONST_VECTOR_ELT (op, 0);
++ if (!CONST_INT_P (element))
++ return false;
++
++ value = INTVAL (element);
++ if (!IN_RANGE (value, -128, 127))
++ return false;
++
++ for (i = 1; i < nunits; i++)
++ {
++ element = CONST_VECTOR_ELT (op, i);
++ if (!CONST_INT_P (element))
++ return false;
++
++ if (value != INTVAL (element))
++ return false;
++ }
++
++ /* See if we could generate vspltisw/vspltish directly instead of
++ xxspltib + sign extend. Special case 0/-1 to allow getting
++ any VSX register instead of an Altivec register. */
++ if (!IN_RANGE (value, -1, 0) && EASY_VECTOR_15 (value)
++ && (mode == V4SImode || mode == V8HImode))
++ return false;
++ }
++
++ /* Handle integer constants being loaded into the upper part of the VSX
++ register as a scalar. If the value isn't 0/-1, only allow it if
++ the mode can go in Altivec registers. */
++ else if (CONST_INT_P (op))
++ {
++ if (!SCALAR_INT_MODE_P (mode))
++ return false;
++
++ value = INTVAL (op);
++ if (!IN_RANGE (value, -128, 127))
++ return false;
++
++ if (!IN_RANGE (value, -1, 0)
++ && (reg_addr[mode].addr_mask[RELOAD_REG_VMX] & RELOAD_REG_VALID) == 0)
++ return false;
++ }
++
++ else
++ return false;
++
++ /* Return # of instructions and the constant byte for XXSPLTIB. */
++ if (mode == V16QImode)
++ *num_insns_ptr = 1;
++
++ else if (IN_RANGE (value, -1, 0))
++ *num_insns_ptr = 1;
++
++ else
++ *num_insns_ptr = 2;
++
++ *constant_ptr = (int) value;
++ return true;
++}
++
+ const char *
+ output_vec_const_move (rtx *operands)
+ {
+@@ -6147,23 +6356,60 @@
+
+ if (TARGET_VSX)
+ {
++ bool dest_vmx_p = ALTIVEC_REGNO_P (REGNO (dest));
++ int xxspltib_value = 256;
++ int num_insns = -1;
++
+ if (zero_constant (vec, mode))
+- return "xxlxor %x0,%x0,%x0";
++ {
++ if (TARGET_P9_VECTOR)
++ return "xxspltib %x0,0";
+
+- if (TARGET_P8_VECTOR && vec == CONSTM1_RTX (mode))
+- return "xxlorc %x0,%x0,%x0";
++ else if (dest_vmx_p)
++ return "vspltisw %0,0";
+
+- if ((mode == V2DImode || mode == V1TImode)
+- && INTVAL (CONST_VECTOR_ELT (vec, 0)) == -1
+- && INTVAL (CONST_VECTOR_ELT (vec, 1)) == -1)
+- return (TARGET_P8_VECTOR) ? "xxlorc %x0,%x0,%x0" : "vspltisw %0,-1";
++ else
++ return "xxlxor %x0,%x0,%x0";
++ }
++
++ if (all_ones_constant (vec, mode))
++ {
++ if (TARGET_P9_VECTOR)
++ return "xxspltib %x0,255";
++
++ else if (dest_vmx_p)
++ return "vspltisw %0,-1";
++
++ else if (TARGET_P8_VECTOR)
++ return "xxlorc %x0,%x0,%x0";
++
++ else
++ gcc_unreachable ();
++ }
++
++ if (TARGET_P9_VECTOR
++ && xxspltib_constant_p (vec, mode, &num_insns, &xxspltib_value))
++ {
++ if (num_insns == 1)
++ {
++ operands[2] = GEN_INT (xxspltib_value & 0xff);
++ return "xxspltib %x0,%2";
++ }
++
++ return "#";
++ }
+ }
+
+ if (TARGET_ALTIVEC)
+ {
+ rtx splat_vec;
++
++ gcc_assert (ALTIVEC_REGNO_P (REGNO (dest)));
+ if (zero_constant (vec, mode))
+- return "vxor %0,%0,%0";
++ return "vspltisw %0,0";
++
++ if (all_ones_constant (vec, mode))
++ return "vspltisw %0,-1";
+
+ /* Do we need to construct a value using VSLDOI? */
+ shift = vspltis_shifted (vec);
+@@ -6436,6 +6682,15 @@
+ return;
+ }
+
++ /* Word values on ISA 3.0 can use mtvsrws, lxvwsx, or vspltisw. V4SF is
++ complicated since scalars are stored as doubles in the registers. */
++ if (TARGET_P9_VECTOR && mode == V4SImode && all_same
++ && VECTOR_MEM_VSX_P (mode))
++ {
++ emit_insn (gen_vsx_splat_v4si (target, XVECEXP (vals, 0, 0)));
++ return;
++ }
++
+ /* With single precision floating point on VSX, know that internally single
+ precision is actually represented as a double, and either make 2 V2DF
+ vectors, and convert these vectors to single precision, or do one
+@@ -6444,14 +6699,23 @@
+ {
+ if (all_same)
+ {
+- rtx freg = gen_reg_rtx (V4SFmode);
+- rtx sreg = force_reg (SFmode, XVECEXP (vals, 0, 0));
+- rtx cvt = ((TARGET_XSCVDPSPN)
+- ? gen_vsx_xscvdpspn_scalar (freg, sreg)
+- : gen_vsx_xscvdpsp_scalar (freg, sreg));
++ rtx op0 = XVECEXP (vals, 0, 0);
++
++ if (TARGET_P9_VECTOR)
++ emit_insn (gen_vsx_splat_v4sf (target, op0));
++
++ else
++ {
++ rtx freg = gen_reg_rtx (V4SFmode);
++ rtx sreg = force_reg (SFmode, op0);
++ rtx cvt = (TARGET_XSCVDPSPN
++ ? gen_vsx_xscvdpspn_scalar (freg, sreg)
++ : gen_vsx_xscvdpsp_scalar (freg, sreg));
+
+- emit_insn (cvt);
+- emit_insn (gen_vsx_xxspltw_v4sf_direct (target, freg, const0_rtx));
++ emit_insn (cvt);
++ emit_insn (gen_vsx_xxspltw_v4sf_direct (target, freg,
++ const0_rtx));
++ }
+ }
+ else
+ {
+@@ -6572,21 +6836,29 @@
+ gen_rtvec (3, target, reg,
+ force_reg (V16QImode, x)),
+ UNSPEC_VPERM);
+- else
++ else
+ {
+- /* Invert selector. We prefer to generate VNAND on P8 so
+- that future fusion opportunities can kick in, but must
+- generate VNOR elsewhere. */
+- rtx notx = gen_rtx_NOT (V16QImode, force_reg (V16QImode, x));
+- rtx iorx = (TARGET_P8_VECTOR
+- ? gen_rtx_IOR (V16QImode, notx, notx)
+- : gen_rtx_AND (V16QImode, notx, notx));
+- rtx tmp = gen_reg_rtx (V16QImode);
+- emit_insn (gen_rtx_SET (tmp, iorx));
+-
+- /* Permute with operands reversed and adjusted selector. */
+- x = gen_rtx_UNSPEC (mode, gen_rtvec (3, reg, target, tmp),
+- UNSPEC_VPERM);
++ if (TARGET_P9_VECTOR)
++ x = gen_rtx_UNSPEC (mode,
++ gen_rtvec (3, target, reg,
++ force_reg (V16QImode, x)),
++ UNSPEC_VPERMR);
++ else
++ {
++ /* Invert selector. We prefer to generate VNAND on P8 so
++ that future fusion opportunities can kick in, but must
++ generate VNOR elsewhere. */
++ rtx notx = gen_rtx_NOT (V16QImode, force_reg (V16QImode, x));
++ rtx iorx = (TARGET_P8_VECTOR
++ ? gen_rtx_IOR (V16QImode, notx, notx)
++ : gen_rtx_AND (V16QImode, notx, notx));
++ rtx tmp = gen_reg_rtx (V16QImode);
++ emit_insn (gen_rtx_SET (tmp, iorx));
++
++ /* Permute with operands reversed and adjusted selector. */
++ x = gen_rtx_UNSPEC (mode, gen_rtvec (3, reg, target, tmp),
++ UNSPEC_VPERM);
++ }
+ }
+
+ emit_insn (gen_rtx_SET (target, x));
+@@ -6902,6 +7174,49 @@
+ return false;
+ }
+
++/* Return true if the OFFSET is valid for the quad address instructions that
++ use d-form (register + offset) addressing. */
++
++static inline bool
++quad_address_offset_p (HOST_WIDE_INT offset)
++{
++ return (IN_RANGE (offset, -32768, 32767) && ((offset) & 0xf) == 0);
++}
++
++/* Return true if the ADDR is an acceptable address for a quad memory
++ operation of mode MODE (either LQ/STQ for general purpose registers, or
++ LXV/STXV for vector registers under ISA 3.0. GPR_P is true if this address
++ is intended for LQ/STQ. If it is false, the address is intended for the ISA
++ 3.0 LXV/STXV instruction. */
++
++bool
++quad_address_p (rtx addr, machine_mode mode, bool strict)
++{
++ rtx op0, op1;
++
++ if (GET_MODE_SIZE (mode) != 16)
++ return false;
++
++ if (legitimate_indirect_address_p (addr, strict))
++ return true;
++
++ if (VECTOR_MODE_P (mode) && !mode_supports_vsx_dform_quad (mode))
++ return false;
++
++ if (GET_CODE (addr) != PLUS)
++ return false;
++
++ op0 = XEXP (addr, 0);
++ if (!REG_P (op0) || !INT_REG_OK_FOR_BASE_P (op0, strict))
++ return false;
++
++ op1 = XEXP (addr, 1);
++ if (!CONST_INT_P (op1))
++ return false;
++
++ return quad_address_offset_p (INTVAL (op1));
++}
++
+ /* Return true if this is a load or store quad operation. This function does
+ not handle the atomic quad memory instructions. */
+
+@@ -6994,6 +7309,10 @@
+ if (TARGET_POWERPC64 && (offset & 3) != 0)
+ return false;
+
++ if (mode_supports_vsx_dform_quad (mode)
++ && !quad_address_offset_p (offset))
++ return false;
++
+ extra = GET_MODE_SIZE (mode) - UNITS_PER_WORD;
+ if (extra < 0)
+ extra = 0;
+@@ -7023,13 +7342,14 @@
+ case TImode:
+ case TFmode:
+ case KFmode:
+- /* AltiVec/VSX vector modes. Only reg+reg addressing is valid. While
+- TImode is not a vector mode, if we want to use the VSX registers to
+- move it around, we need to restrict ourselves to reg+reg addressing.
+- Similarly for IEEE 128-bit floating point that is passed in a single
+- vector register. */
++ /* AltiVec/VSX vector modes. Only reg+reg addressing was valid until the
++ ISA 3.0 vector d-form addressing mode was added. While TImode is not
++ a vector mode, if we want to use the VSX registers to move it around,
++ we need to restrict ourselves to reg+reg addressing. Similarly for
++ IEEE 128-bit floating point that is passed in a single vector
++ register. */
+ if (VECTOR_MEM_ALTIVEC_OR_VSX_P (mode))
+- return false;
++ return mode_supports_vsx_dform_quad (mode);
+ break;
+
+ case V4HImode:
+@@ -7096,6 +7416,11 @@
+ if (GET_CODE (op) != SYMBOL_REF)
+ return false;
+
++ /* ISA 3.0 vector d-form addressing is restricted, don't allow
++ SYMBOL_REF. */
++ if (mode_supports_vsx_dform_quad (mode))
++ return false;
++
+ dsize = GET_MODE_SIZE (mode);
+ decl = SYMBOL_REF_DECL (op);
+ if (!decl)
+@@ -7250,6 +7575,8 @@
+ return false;
+ if (!INT_REG_OK_FOR_BASE_P (XEXP (x, 0), strict))
+ return false;
++ if (mode_supports_vsx_dform_quad (mode))
++ return quad_address_p (x, mode, strict);
+ if (!reg_offset_addressing_ok_p (mode))
+ return virtual_stack_registers_memory_p (x);
+ if (legitimate_constant_pool_address_p (x, mode, strict || lra_in_progress))
+@@ -7388,6 +7715,9 @@
+ return false;
+ if (!INT_REG_OK_FOR_BASE_P (XEXP (x, 0), strict))
+ return false;
++ /* quad word addresses are restricted, and we can't use LO_SUM. */
++ if (mode_supports_vsx_dform_quad (mode))
++ return false;
+ /* Restrict addressing for DI because of our SUBREG hackery. */
+ if (TARGET_E500_DOUBLE && GET_MODE_SIZE (mode) > UNITS_PER_WORD)
+ return false;
+@@ -7399,7 +7729,7 @@
+
+ if (DEFAULT_ABI == ABI_V4 && flag_pic)
+ return false;
+- /* LRA don't use LEGITIMIZE_RELOAD_ADDRESS as it usually calls
++ /* LRA doesn't use LEGITIMIZE_RELOAD_ADDRESS as it usually calls
+ push_reload from reload pass code. LEGITIMIZE_RELOAD_ADDRESS
+ recognizes some LO_SUM addresses as valid although this
+ function says opposite. In most cases, LRA through different
+@@ -7453,7 +7783,8 @@
+ {
+ unsigned int extra;
+
+- if (!reg_offset_addressing_ok_p (mode))
++ if (!reg_offset_addressing_ok_p (mode)
++ || mode_supports_vsx_dform_quad (mode))
+ {
+ if (virtual_stack_registers_memory_p (x))
+ return x;
+@@ -8148,13 +8479,18 @@
+ int ind_levels ATTRIBUTE_UNUSED, int *win)
+ {
+ bool reg_offset_p = reg_offset_addressing_ok_p (mode);
++ bool quad_offset_p = mode_supports_vsx_dform_quad (mode);
+
+- /* Nasty hack for vsx_splat_V2DF/V2DI load from mem, which takes a
+- DFmode/DImode MEM. */
++ /* Nasty hack for vsx_splat_v2df/v2di load from mem, which takes a
++ DFmode/DImode MEM. Ditto for ISA 3.0 vsx_splat_v4sf/v4si. */
+ if (reg_offset_p
+ && opnum == 1
+ && ((mode == DFmode && recog_data.operand_mode[0] == V2DFmode)
+- || (mode == DImode && recog_data.operand_mode[0] == V2DImode)))
++ || (mode == DImode && recog_data.operand_mode[0] == V2DImode)
++ || (mode == SFmode && recog_data.operand_mode[0] == V4SFmode
++ && TARGET_P9_VECTOR)
++ || (mode == SImode && recog_data.operand_mode[0] == V4SImode
++ && TARGET_P9_VECTOR)))
+ reg_offset_p = false;
+
+ /* We must recognize output that we have already generated ourselves. */
+@@ -8164,6 +8500,11 @@
+ && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
+ && GET_CODE (XEXP (x, 1)) == CONST_INT)
+ {
++ if (TARGET_DEBUG_ADDR)
++ {
++ fprintf (stderr, "\nlegitimize_reload_address push_reload #1:\n");
++ debug_rtx (x);
++ }
+ push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
+ BASE_REG_CLASS, GET_MODE (x), VOIDmode, 0, 0,
+ opnum, (enum reload_type) type);
+@@ -8175,6 +8516,11 @@
+ if (GET_CODE (x) == LO_SUM
+ && GET_CODE (XEXP (x, 0)) == HIGH)
+ {
++ if (TARGET_DEBUG_ADDR)
++ {
++ fprintf (stderr, "\nlegitimize_reload_address push_reload #2:\n");
++ debug_rtx (x);
++ }
+ push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
+ BASE_REG_CLASS, Pmode, VOIDmode, 0, 0,
+ opnum, (enum reload_type) type);
+@@ -8203,10 +8549,16 @@
+
+ if (TARGET_CMODEL != CMODEL_SMALL
+ && reg_offset_p
++ && !quad_offset_p
+ && small_toc_ref (x, VOIDmode))
+ {
+ rtx hi = gen_rtx_HIGH (Pmode, copy_rtx (x));
+ x = gen_rtx_LO_SUM (Pmode, hi, x);
++ if (TARGET_DEBUG_ADDR)
++ {
++ fprintf (stderr, "\nlegitimize_reload_address push_reload #3:\n");
++ debug_rtx (x);
++ }
+ push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
+ BASE_REG_CLASS, Pmode, VOIDmode, 0, 0,
+ opnum, (enum reload_type) type);
+@@ -8215,22 +8567,24 @@
+ }
+
+ if (GET_CODE (x) == PLUS
+- && GET_CODE (XEXP (x, 0)) == REG
++ && REG_P (XEXP (x, 0))
+ && REGNO (XEXP (x, 0)) < FIRST_PSEUDO_REGISTER
+ && INT_REG_OK_FOR_BASE_P (XEXP (x, 0), 1)
+- && GET_CODE (XEXP (x, 1)) == CONST_INT
++ && CONST_INT_P (XEXP (x, 1))
+ && reg_offset_p
+ && !SPE_VECTOR_MODE (mode)
+ && !(TARGET_E500_DOUBLE && GET_MODE_SIZE (mode) > UNITS_PER_WORD)
+- && (!VECTOR_MODE_P (mode) || VECTOR_MEM_NONE_P (mode)))
++ && (quad_offset_p || !VECTOR_MODE_P (mode) || VECTOR_MEM_NONE_P (mode)))
+ {
+ HOST_WIDE_INT val = INTVAL (XEXP (x, 1));
+ HOST_WIDE_INT low = ((val & 0xffff) ^ 0x8000) - 0x8000;
+ HOST_WIDE_INT high
+ = (((val - low) & 0xffffffff) ^ 0x80000000) - 0x80000000;
+
+- /* Check for 32-bit overflow. */
+- if (high + low != val)
++ /* Check for 32-bit overflow or quad addresses with one of the
++ four least significant bits set. */
++ if (high + low != val
++ || (quad_offset_p && (low & 0xf)))
+ {
+ *win = 0;
+ return x;
+@@ -8244,6 +8598,11 @@
+ GEN_INT (high)),
+ GEN_INT (low));
+
++ if (TARGET_DEBUG_ADDR)
++ {
++ fprintf (stderr, "\nlegitimize_reload_address push_reload #4:\n");
++ debug_rtx (x);
++ }
+ push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
+ BASE_REG_CLASS, GET_MODE (x), VOIDmode, 0, 0,
+ opnum, (enum reload_type) type);
+@@ -8253,6 +8612,7 @@
+
+ if (GET_CODE (x) == SYMBOL_REF
+ && reg_offset_p
++ && !quad_offset_p
+ && (!VECTOR_MODE_P (mode) || VECTOR_MEM_NONE_P (mode))
+ && !SPE_VECTOR_MODE (mode)
+ #if TARGET_MACHO
+@@ -8304,6 +8664,11 @@
+ x = gen_rtx_LO_SUM (GET_MODE (x),
+ gen_rtx_HIGH (Pmode, x), x);
+
++ if (TARGET_DEBUG_ADDR)
++ {
++ fprintf (stderr, "\nlegitimize_reload_address push_reload #5:\n");
++ debug_rtx (x);
++ }
+ push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
+ BASE_REG_CLASS, Pmode, VOIDmode, 0, 0,
+ opnum, (enum reload_type) type);
+@@ -8332,14 +8697,22 @@
+
+ if (TARGET_TOC
+ && reg_offset_p
++ && !quad_offset_p
+ && GET_CODE (x) == SYMBOL_REF
+ && use_toc_relative_ref (x, mode))
+ {
+ x = create_TOC_reference (x, NULL_RTX);
+ if (TARGET_CMODEL != CMODEL_SMALL)
+- push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
+- BASE_REG_CLASS, Pmode, VOIDmode, 0, 0,
+- opnum, (enum reload_type) type);
++ {
++ if (TARGET_DEBUG_ADDR)
++ {
++ fprintf (stderr, "\nlegitimize_reload_address push_reload #6:\n");
++ debug_rtx (x);
++ }
++ push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
++ BASE_REG_CLASS, Pmode, VOIDmode, 0, 0,
++ opnum, (enum reload_type) type);
++ }
+ *win = 1;
+ return x;
+ }
+@@ -8395,6 +8768,7 @@
+ rs6000_legitimate_address_p (machine_mode mode, rtx x, bool reg_ok_strict)
+ {
+ bool reg_offset_p = reg_offset_addressing_ok_p (mode);
++ bool quad_offset_p = mode_supports_vsx_dform_quad (mode);
+
+ /* If this is an unaligned stvx/ldvx type address, discard the outer AND. */
+ if (VECTOR_MEM_ALTIVEC_P (mode)
+@@ -8412,17 +8786,27 @@
+ && mode_supports_pre_incdec_p (mode)
+ && legitimate_indirect_address_p (XEXP (x, 0), reg_ok_strict))
+ return 1;
+- if (virtual_stack_registers_memory_p (x))
+- return 1;
+- if (reg_offset_p && legitimate_small_data_p (mode, x))
++ /* Handle restricted vector d-form offsets in ISA 3.0. */
++ if (quad_offset_p)
++ {
++ if (quad_address_p (x, mode, reg_ok_strict))
++ return 1;
++ }
++ else if (virtual_stack_registers_memory_p (x))
+ return 1;
+- if (reg_offset_p
+- && legitimate_constant_pool_address_p (x, mode,
++
++ else if (reg_offset_p)
++ {
++ if (legitimate_small_data_p (mode, x))
++ return 1;
++ if (legitimate_constant_pool_address_p (x, mode,
+ reg_ok_strict || lra_in_progress))
+- return 1;
+- if (reg_offset_p && reg_addr[mode].fused_toc && GET_CODE (x) == UNSPEC
+- && XINT (x, 1) == UNSPEC_FUSION_ADDIS)
+- return 1;
++ return 1;
++ if (reg_addr[mode].fused_toc && GET_CODE (x) == UNSPEC
++ && XINT (x, 1) == UNSPEC_FUSION_ADDIS)
++ return 1;
++ }
++
+ /* For TImode, if we have load/store quad and TImode in VSX registers, only
+ allow register indirect addresses. This will allow the values to go in
+ either GPRs or VSX registers without reloading. The vector types would
+@@ -8461,7 +8845,8 @@
+ && legitimate_indexed_address_p (XEXP (x, 1), reg_ok_strict)))
+ && rtx_equal_p (XEXP (XEXP (x, 1), 0), XEXP (x, 0)))
+ return 1;
+- if (reg_offset_p && legitimate_lo_sum_address_p (mode, x, reg_ok_strict))
++ if (reg_offset_p && !quad_offset_p
++ && legitimate_lo_sum_address_p (mode, x, reg_ok_strict))
+ return 1;
+ return 0;
+ }
+@@ -10044,6 +10429,35 @@
+ return must_pass_in_stack_var_size_or_pad (mode, type);
+ }
+
++static inline bool
++is_complex_IBM_long_double (machine_mode mode)
++{
++ return mode == ICmode || (!TARGET_IEEEQUAD && mode == TCmode);
++}
++
++/* Whether ABI_V4 passes MODE args to a function in floating point
++ registers. */
++
++static bool
++abi_v4_pass_in_fpr (machine_mode mode)
++{
++ if (!TARGET_FPRS || !TARGET_HARD_FLOAT)
++ return false;
++ if (TARGET_SINGLE_FLOAT && mode == SFmode)
++ return true;
++ if (TARGET_DOUBLE_FLOAT && mode == DFmode)
++ return true;
++ /* ABI_V4 passes complex IBM long double in 8 gprs.
++ Stupid, but we can't change the ABI now. */
++ if (is_complex_IBM_long_double (mode))
++ return false;
++ if (FLOAT128_2REG_P (mode))
++ return true;
++ if (DECIMAL_FLOAT_MODE_P (mode))
++ return true;
++ return false;
++}
++
+ /* If defined, a C expression which determines whether, and in which
+ direction, to pad out an argument with extra space. The value
+ should be of type `enum direction': either `upward' to pad above
+@@ -10128,6 +10542,7 @@
+ && (GET_MODE_SIZE (mode) == 8
+ || (TARGET_HARD_FLOAT
+ && TARGET_FPRS
++ && !is_complex_IBM_long_double (mode)
+ && FLOAT128_2REG_P (mode))))
+ return 64;
+ else if (FLOAT128_VECTOR_P (mode))
+@@ -10507,11 +10922,7 @@
+ }
+ else if (DEFAULT_ABI == ABI_V4)
+ {
+- if (TARGET_HARD_FLOAT && TARGET_FPRS
+- && ((TARGET_SINGLE_FLOAT && mode == SFmode)
+- || (TARGET_DOUBLE_FLOAT && mode == DFmode)
+- || FLOAT128_2REG_P (mode)
+- || DECIMAL_FLOAT_MODE_P (mode)))
++ if (abi_v4_pass_in_fpr (mode))
+ {
+ /* _Decimal128 must use an even/odd register pair. This assumes
+ that the register number is odd when fregno is odd. */
+@@ -11168,11 +11579,7 @@
+
+ else if (abi == ABI_V4)
+ {
+- if (TARGET_HARD_FLOAT && TARGET_FPRS
+- && ((TARGET_SINGLE_FLOAT && mode == SFmode)
+- || (TARGET_DOUBLE_FLOAT && mode == DFmode)
+- || FLOAT128_2REG_P (mode)
+- || DECIMAL_FLOAT_MODE_P (mode)))
++ if (abi_v4_pass_in_fpr (mode))
+ {
+ /* _Decimal128 must use an even/odd register pair. This assumes
+ that the register number is odd when fregno is odd. */
+@@ -12093,19 +12500,15 @@
+ rsize = (size + 3) / 4;
+ align = 1;
+
+- if (TARGET_HARD_FLOAT && TARGET_FPRS
+- && ((TARGET_SINGLE_FLOAT && TYPE_MODE (type) == SFmode)
+- || (TARGET_DOUBLE_FLOAT
+- && (TYPE_MODE (type) == DFmode
+- || FLOAT128_2REG_P (TYPE_MODE (type))
+- || DECIMAL_FLOAT_MODE_P (TYPE_MODE (type))))))
++ machine_mode mode = TYPE_MODE (type);
++ if (abi_v4_pass_in_fpr (mode))
+ {
+ /* FP args go in FP registers, if present. */
+ reg = fpr;
+ n_reg = (size + 7) / 8;
+ sav_ofs = ((TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT) ? 8 : 4) * 4;
+ sav_scale = ((TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT) ? 8 : 4);
+- if (TYPE_MODE (type) != SFmode && TYPE_MODE (type) != SDmode)
++ if (mode != SFmode && mode != SDmode)
+ align = 8;
+ }
+ else
+@@ -12125,7 +12528,7 @@
+ addr = create_tmp_var (ptr_type_node, "addr");
+
+ /* AltiVec vectors never go in registers when -mabi=altivec. */
+- if (TARGET_ALTIVEC_ABI && ALTIVEC_VECTOR_MODE (TYPE_MODE (type)))
++ if (TARGET_ALTIVEC_ABI && ALTIVEC_VECTOR_MODE (mode))
+ align = 16;
+ else
+ {
+@@ -12146,7 +12549,7 @@
+ }
+ /* _Decimal128 is passed in even/odd fpr pairs; the stored
+ reg number is 0 for f1, so we want to make it odd. */
+- else if (reg == fpr && TYPE_MODE (type) == TDmode)
++ else if (reg == fpr && mode == TDmode)
+ {
+ t = build2 (BIT_IOR_EXPR, TREE_TYPE (reg), unshare_expr (reg),
+ build_int_cst (TREE_TYPE (reg), 1));
+@@ -12173,7 +12576,7 @@
+ FP register for 32-bit binaries. */
+ if (TARGET_32BIT
+ && TARGET_HARD_FLOAT && TARGET_FPRS
+- && TYPE_MODE (type) == SDmode)
++ && mode == SDmode)
+ t = fold_build_pointer_plus_hwi (t, size);
+
+ gimplify_assign (addr, t, pre_p);
+@@ -12260,7 +12663,7 @@
+ /* const function, function only depends on the inputs. */
+ TREE_READONLY (t) = 1;
+ TREE_NOTHROW (t) = 1;
+- attr_string = ", pure";
++ attr_string = ", const";
+ }
+ else if ((classify & RS6000_BTC_PURE) != 0)
+ {
+@@ -12268,7 +12671,7 @@
+ external state. */
+ DECL_PURE_P (t) = 1;
+ TREE_NOTHROW (t) = 1;
+- attr_string = ", const";
++ attr_string = ", pure";
+ }
+ else if ((classify & RS6000_BTC_FP) != 0)
+ {
+@@ -12300,6 +12703,7 @@
+
+ /* Simple ternary operations: VECd = foo (VECa, VECb, VECc). */
+
++#undef RS6000_BUILTIN_0
+ #undef RS6000_BUILTIN_1
+ #undef RS6000_BUILTIN_2
+ #undef RS6000_BUILTIN_3
+@@ -12312,6 +12716,7 @@
+ #undef RS6000_BUILTIN_S
+ #undef RS6000_BUILTIN_X
+
++#define RS6000_BUILTIN_0(ENUM, NAME, MASK, ATTR, ICODE)
+ #define RS6000_BUILTIN_1(ENUM, NAME, MASK, ATTR, ICODE)
+ #define RS6000_BUILTIN_2(ENUM, NAME, MASK, ATTR, ICODE)
+ #define RS6000_BUILTIN_3(ENUM, NAME, MASK, ATTR, ICODE) \
+@@ -12333,6 +12738,7 @@
+
+ /* DST operations: void foo (void *, const int, const char). */
+
++#undef RS6000_BUILTIN_0
+ #undef RS6000_BUILTIN_1
+ #undef RS6000_BUILTIN_2
+ #undef RS6000_BUILTIN_3
+@@ -12345,6 +12751,7 @@
+ #undef RS6000_BUILTIN_S
+ #undef RS6000_BUILTIN_X
+
++#define RS6000_BUILTIN_0(ENUM, NAME, MASK, ATTR, ICODE)
+ #define RS6000_BUILTIN_1(ENUM, NAME, MASK, ATTR, ICODE)
+ #define RS6000_BUILTIN_2(ENUM, NAME, MASK, ATTR, ICODE)
+ #define RS6000_BUILTIN_3(ENUM, NAME, MASK, ATTR, ICODE)
+@@ -12366,6 +12773,7 @@
+
+ /* Simple binary operations: VECc = foo (VECa, VECb). */
+
++#undef RS6000_BUILTIN_0
+ #undef RS6000_BUILTIN_1
+ #undef RS6000_BUILTIN_2
+ #undef RS6000_BUILTIN_3
+@@ -12378,6 +12786,7 @@
+ #undef RS6000_BUILTIN_S
+ #undef RS6000_BUILTIN_X
+
++#define RS6000_BUILTIN_0(ENUM, NAME, MASK, ATTR, ICODE)
+ #define RS6000_BUILTIN_1(ENUM, NAME, MASK, ATTR, ICODE)
+ #define RS6000_BUILTIN_2(ENUM, NAME, MASK, ATTR, ICODE) \
+ { MASK, ICODE, NAME, ENUM },
+@@ -12397,6 +12806,7 @@
+ #include "rs6000-builtin.def"
+ };
+
++#undef RS6000_BUILTIN_0
+ #undef RS6000_BUILTIN_1
+ #undef RS6000_BUILTIN_2
+ #undef RS6000_BUILTIN_3
+@@ -12409,6 +12819,7 @@
+ #undef RS6000_BUILTIN_S
+ #undef RS6000_BUILTIN_X
+
++#define RS6000_BUILTIN_0(ENUM, NAME, MASK, ATTR, ICODE)
+ #define RS6000_BUILTIN_1(ENUM, NAME, MASK, ATTR, ICODE)
+ #define RS6000_BUILTIN_2(ENUM, NAME, MASK, ATTR, ICODE)
+ #define RS6000_BUILTIN_3(ENUM, NAME, MASK, ATTR, ICODE)
+@@ -12431,6 +12842,7 @@
+ };
+
+ /* SPE predicates. */
++#undef RS6000_BUILTIN_0
+ #undef RS6000_BUILTIN_1
+ #undef RS6000_BUILTIN_2
+ #undef RS6000_BUILTIN_3
+@@ -12443,6 +12855,7 @@
+ #undef RS6000_BUILTIN_S
+ #undef RS6000_BUILTIN_X
+
++#define RS6000_BUILTIN_0(ENUM, NAME, MASK, ATTR, ICODE)
+ #define RS6000_BUILTIN_1(ENUM, NAME, MASK, ATTR, ICODE)
+ #define RS6000_BUILTIN_2(ENUM, NAME, MASK, ATTR, ICODE)
+ #define RS6000_BUILTIN_3(ENUM, NAME, MASK, ATTR, ICODE)
+@@ -12463,6 +12876,7 @@
+ };
+
+ /* SPE evsel predicates. */
++#undef RS6000_BUILTIN_0
+ #undef RS6000_BUILTIN_1
+ #undef RS6000_BUILTIN_2
+ #undef RS6000_BUILTIN_3
+@@ -12475,6 +12889,7 @@
+ #undef RS6000_BUILTIN_S
+ #undef RS6000_BUILTIN_X
+
++#define RS6000_BUILTIN_0(ENUM, NAME, MASK, ATTR, ICODE)
+ #define RS6000_BUILTIN_1(ENUM, NAME, MASK, ATTR, ICODE)
+ #define RS6000_BUILTIN_2(ENUM, NAME, MASK, ATTR, ICODE)
+ #define RS6000_BUILTIN_3(ENUM, NAME, MASK, ATTR, ICODE)
+@@ -12495,6 +12910,7 @@
+ };
+
+ /* PAIRED predicates. */
++#undef RS6000_BUILTIN_0
+ #undef RS6000_BUILTIN_1
+ #undef RS6000_BUILTIN_2
+ #undef RS6000_BUILTIN_3
+@@ -12507,6 +12923,7 @@
+ #undef RS6000_BUILTIN_S
+ #undef RS6000_BUILTIN_X
+
++#define RS6000_BUILTIN_0(ENUM, NAME, MASK, ATTR, ICODE)
+ #define RS6000_BUILTIN_1(ENUM, NAME, MASK, ATTR, ICODE)
+ #define RS6000_BUILTIN_2(ENUM, NAME, MASK, ATTR, ICODE)
+ #define RS6000_BUILTIN_3(ENUM, NAME, MASK, ATTR, ICODE)
+@@ -12528,6 +12945,7 @@
+
+ /* ABS* operations. */
+
++#undef RS6000_BUILTIN_0
+ #undef RS6000_BUILTIN_1
+ #undef RS6000_BUILTIN_2
+ #undef RS6000_BUILTIN_3
+@@ -12540,6 +12958,7 @@
+ #undef RS6000_BUILTIN_S
+ #undef RS6000_BUILTIN_X
+
++#define RS6000_BUILTIN_0(ENUM, NAME, MASK, ATTR, ICODE)
+ #define RS6000_BUILTIN_1(ENUM, NAME, MASK, ATTR, ICODE)
+ #define RS6000_BUILTIN_2(ENUM, NAME, MASK, ATTR, ICODE)
+ #define RS6000_BUILTIN_3(ENUM, NAME, MASK, ATTR, ICODE)
+@@ -12562,6 +12981,7 @@
+ /* Simple unary operations: VECb = foo (unsigned literal) or VECb =
+ foo (VECa). */
+
++#undef RS6000_BUILTIN_0
+ #undef RS6000_BUILTIN_1
+ #undef RS6000_BUILTIN_2
+ #undef RS6000_BUILTIN_3
+@@ -12574,6 +12994,7 @@
+ #undef RS6000_BUILTIN_S
+ #undef RS6000_BUILTIN_X
+
++#define RS6000_BUILTIN_0(ENUM, NAME, MASK, ATTR, ICODE)
+ #define RS6000_BUILTIN_1(ENUM, NAME, MASK, ATTR, ICODE) \
+ { MASK, ICODE, NAME, ENUM },
+
+@@ -12593,7 +13014,43 @@
+ #include "rs6000-builtin.def"
+ };
+
++/* Simple no-argument operations: result = __builtin_darn_32 () */
++
++#undef RS6000_BUILTIN_0
++#undef RS6000_BUILTIN_1
++#undef RS6000_BUILTIN_2
++#undef RS6000_BUILTIN_3
++#undef RS6000_BUILTIN_A
++#undef RS6000_BUILTIN_D
++#undef RS6000_BUILTIN_E
++#undef RS6000_BUILTIN_H
++#undef RS6000_BUILTIN_P
++#undef RS6000_BUILTIN_Q
++#undef RS6000_BUILTIN_S
++#undef RS6000_BUILTIN_X
++
++#define RS6000_BUILTIN_0(ENUM, NAME, MASK, ATTR, ICODE) \
++ { MASK, ICODE, NAME, ENUM },
++
++#define RS6000_BUILTIN_1(ENUM, NAME, MASK, ATTR, ICODE)
++#define RS6000_BUILTIN_2(ENUM, NAME, MASK, ATTR, ICODE)
++#define RS6000_BUILTIN_3(ENUM, NAME, MASK, ATTR, ICODE)
++#define RS6000_BUILTIN_A(ENUM, NAME, MASK, ATTR, ICODE)
++#define RS6000_BUILTIN_D(ENUM, NAME, MASK, ATTR, ICODE)
++#define RS6000_BUILTIN_E(ENUM, NAME, MASK, ATTR, ICODE)
++#define RS6000_BUILTIN_H(ENUM, NAME, MASK, ATTR, ICODE)
++#define RS6000_BUILTIN_P(ENUM, NAME, MASK, ATTR, ICODE)
++#define RS6000_BUILTIN_Q(ENUM, NAME, MASK, ATTR, ICODE)
++#define RS6000_BUILTIN_S(ENUM, NAME, MASK, ATTR, ICODE)
++#define RS6000_BUILTIN_X(ENUM, NAME, MASK, ATTR, ICODE)
++
++static const struct builtin_description bdesc_0arg[] =
++{
++#include "rs6000-builtin.def"
++};
++
+ /* HTM builtins. */
++#undef RS6000_BUILTIN_0
+ #undef RS6000_BUILTIN_1
+ #undef RS6000_BUILTIN_2
+ #undef RS6000_BUILTIN_3
+@@ -12606,6 +13063,7 @@
+ #undef RS6000_BUILTIN_S
+ #undef RS6000_BUILTIN_X
+
++#define RS6000_BUILTIN_0(ENUM, NAME, MASK, ATTR, ICODE)
+ #define RS6000_BUILTIN_1(ENUM, NAME, MASK, ATTR, ICODE)
+ #define RS6000_BUILTIN_2(ENUM, NAME, MASK, ATTR, ICODE)
+ #define RS6000_BUILTIN_3(ENUM, NAME, MASK, ATTR, ICODE)
+@@ -12625,6 +13083,7 @@
+ #include "rs6000-builtin.def"
+ };
+
++#undef RS6000_BUILTIN_0
+ #undef RS6000_BUILTIN_1
+ #undef RS6000_BUILTIN_2
+ #undef RS6000_BUILTIN_3
+@@ -12845,6 +13304,24 @@
+ return const0_rtx;
+ }
+ }
++ else if (icode == CODE_FOR_dfptstsfi_eq_dd
++ || icode == CODE_FOR_dfptstsfi_lt_dd
++ || icode == CODE_FOR_dfptstsfi_gt_dd
++ || icode == CODE_FOR_dfptstsfi_unordered_dd
++ || icode == CODE_FOR_dfptstsfi_eq_td
++ || icode == CODE_FOR_dfptstsfi_lt_td
++ || icode == CODE_FOR_dfptstsfi_gt_td
++ || icode == CODE_FOR_dfptstsfi_unordered_td)
++ {
++ /* Only allow 6-bit unsigned literals. */
++ STRIP_NOPS (arg0);
++ if (TREE_CODE (arg0) != INTEGER_CST
++ || !IN_RANGE (TREE_INT_CST_LOW (arg0), 0, 63))
++ {
++ error ("argument 1 must be a 6-bit unsigned literal");
++ return CONST0_RTX (tmode);
++ }
++ }
+
+ if (target == 0
+ || GET_MODE (target) != tmode
+@@ -14129,6 +14606,47 @@
+ case VSX_BUILTIN_STXVW4X_V16QI:
+ return altivec_expand_stv_builtin (CODE_FOR_vsx_store_v16qi, exp);
+
++ /* For the following on big endian, it's ok to use any appropriate
++ unaligned-supporting store, so use a generic expander. For
++ little-endian, the exact element-reversing instruction must
++ be used. */
++ case VSX_BUILTIN_ST_ELEMREV_V2DF:
++ {
++ enum insn_code code = (BYTES_BIG_ENDIAN ? CODE_FOR_vsx_store_v2df
++ : CODE_FOR_vsx_st_elemrev_v2df);
++ return altivec_expand_stv_builtin (code, exp);
++ }
++ case VSX_BUILTIN_ST_ELEMREV_V2DI:
++ {
++ enum insn_code code = (BYTES_BIG_ENDIAN ? CODE_FOR_vsx_store_v2di
++ : CODE_FOR_vsx_st_elemrev_v2di);
++ return altivec_expand_stv_builtin (code, exp);
++ }
++ case VSX_BUILTIN_ST_ELEMREV_V4SF:
++ {
++ enum insn_code code = (BYTES_BIG_ENDIAN ? CODE_FOR_vsx_store_v4sf
++ : CODE_FOR_vsx_st_elemrev_v4sf);
++ return altivec_expand_stv_builtin (code, exp);
++ }
++ case VSX_BUILTIN_ST_ELEMREV_V4SI:
++ {
++ enum insn_code code = (BYTES_BIG_ENDIAN ? CODE_FOR_vsx_store_v4si
++ : CODE_FOR_vsx_st_elemrev_v4si);
++ return altivec_expand_stv_builtin (code, exp);
++ }
++ case VSX_BUILTIN_ST_ELEMREV_V8HI:
++ {
++ enum insn_code code = (BYTES_BIG_ENDIAN ? CODE_FOR_vsx_store_v8hi
++ : CODE_FOR_vsx_st_elemrev_v8hi);
++ return altivec_expand_stv_builtin (code, exp);
++ }
++ case VSX_BUILTIN_ST_ELEMREV_V16QI:
++ {
++ enum insn_code code = (BYTES_BIG_ENDIAN ? CODE_FOR_vsx_store_v16qi
++ : CODE_FOR_vsx_st_elemrev_v16qi);
++ return altivec_expand_stv_builtin (code, exp);
++ }
++
+ case ALTIVEC_BUILTIN_MFVSCR:
+ icode = CODE_FOR_altivec_mfvscr;
+ tmode = insn_data[icode].operand[0].mode;
+@@ -14323,6 +14841,46 @@
+ case VSX_BUILTIN_LXVW4X_V16QI:
+ return altivec_expand_lv_builtin (CODE_FOR_vsx_load_v16qi,
+ exp, target, false);
++ /* For the following on big endian, it's ok to use any appropriate
++ unaligned-supporting load, so use a generic expander. For
++ little-endian, the exact element-reversing instruction must
++ be used. */
++ case VSX_BUILTIN_LD_ELEMREV_V2DF:
++ {
++ enum insn_code code = (BYTES_BIG_ENDIAN ? CODE_FOR_vsx_load_v2df
++ : CODE_FOR_vsx_ld_elemrev_v2df);
++ return altivec_expand_lv_builtin (code, exp, target, false);
++ }
++ case VSX_BUILTIN_LD_ELEMREV_V2DI:
++ {
++ enum insn_code code = (BYTES_BIG_ENDIAN ? CODE_FOR_vsx_load_v2di
++ : CODE_FOR_vsx_ld_elemrev_v2di);
++ return altivec_expand_lv_builtin (code, exp, target, false);
++ }
++ case VSX_BUILTIN_LD_ELEMREV_V4SF:
++ {
++ enum insn_code code = (BYTES_BIG_ENDIAN ? CODE_FOR_vsx_load_v4sf
++ : CODE_FOR_vsx_ld_elemrev_v4sf);
++ return altivec_expand_lv_builtin (code, exp, target, false);
++ }
++ case VSX_BUILTIN_LD_ELEMREV_V4SI:
++ {
++ enum insn_code code = (BYTES_BIG_ENDIAN ? CODE_FOR_vsx_load_v4si
++ : CODE_FOR_vsx_ld_elemrev_v4si);
++ return altivec_expand_lv_builtin (code, exp, target, false);
++ }
++ case VSX_BUILTIN_LD_ELEMREV_V8HI:
++ {
++ enum insn_code code = (BYTES_BIG_ENDIAN ? CODE_FOR_vsx_load_v8hi
++ : CODE_FOR_vsx_ld_elemrev_v8hi);
++ return altivec_expand_lv_builtin (code, exp, target, false);
++ }
++ case VSX_BUILTIN_LD_ELEMREV_V16QI:
++ {
++ enum insn_code code = (BYTES_BIG_ENDIAN ? CODE_FOR_vsx_load_v16qi
++ : CODE_FOR_vsx_ld_elemrev_v16qi);
++ return altivec_expand_lv_builtin (code, exp, target, false);
++ }
+ break;
+ default:
+ break;
+@@ -14792,17 +15350,71 @@
+ error ("Builtin function %s requires the -mhard-dfp option", name);
+ else if ((fnmask & RS6000_BTM_P8_VECTOR) != 0)
+ error ("Builtin function %s requires the -mpower8-vector option", name);
++ else if ((fnmask & RS6000_BTM_P9_VECTOR) != 0)
++ error ("Builtin function %s requires the -mpower9-vector option", name);
++ else if ((fnmask & (RS6000_BTM_P9_MISC | RS6000_BTM_64BIT))
++ == (RS6000_BTM_P9_MISC | RS6000_BTM_64BIT))
++ error ("Builtin function %s requires the -mpower9-misc and"
++ " -m64 options", name);
++ else if ((fnmask & RS6000_BTM_P9_MISC) == RS6000_BTM_P9_MISC)
++ error ("Builtin function %s requires the -mpower9-misc option", name);
+ else if ((fnmask & (RS6000_BTM_HARD_FLOAT | RS6000_BTM_LDBL128))
+ == (RS6000_BTM_HARD_FLOAT | RS6000_BTM_LDBL128))
+ error ("Builtin function %s requires the -mhard-float and"
+ " -mlong-double-128 options", name);
+ else if ((fnmask & RS6000_BTM_HARD_FLOAT) != 0)
+ error ("Builtin function %s requires the -mhard-float option", name);
++ else if ((fnmask & RS6000_BTM_FLOAT128) != 0)
++ error ("Builtin function %s requires the -mfloat128 option", name);
+ else
+ error ("Builtin function %s is not supported with the current options",
+ name);
+ }
+
++/* Target hook for early folding of built-ins, shamelessly stolen
++ from ia64.c. */
++
++static tree
++rs6000_fold_builtin (tree fndecl, int n_args ATTRIBUTE_UNUSED,
++ tree *args, bool ignore ATTRIBUTE_UNUSED)
++{
++ if (DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_MD)
++ {
++ enum rs6000_builtins fn_code
++ = (enum rs6000_builtins) DECL_FUNCTION_CODE (fndecl);
++ switch (fn_code)
++ {
++ case RS6000_BUILTIN_NANQ:
++ case RS6000_BUILTIN_NANSQ:
++ {
++ tree type = TREE_TYPE (TREE_TYPE (fndecl));
++ const char *str = c_getstr (*args);
++ int quiet = fn_code == RS6000_BUILTIN_NANQ;
++ REAL_VALUE_TYPE real;
++
++ if (str && real_nan (&real, str, quiet, TYPE_MODE (type)))
++ return build_real (type, real);
++ return NULL_TREE;
++ }
++ case RS6000_BUILTIN_INFQ:
++ case RS6000_BUILTIN_HUGE_VALQ:
++ {
++ tree type = TREE_TYPE (TREE_TYPE (fndecl));
++ REAL_VALUE_TYPE inf;
++ real_inf (&inf);
++ return build_real (type, inf);
++ }
++ default:
++ break;
++ }
++ }
++#ifdef SUBTARGET_FOLD_BUILTIN
++ return SUBTARGET_FOLD_BUILTIN (fndecl, n_args, args, ignore);
++#else
++ return NULL_TREE;
++#endif
++}
++
+ /* Expand an expression EXP that calls a built-in function,
+ with result going to TARGET if that's convenient
+ (and in mode MODE if that's convenient).
+@@ -14990,9 +15602,11 @@
+ }
+
+ unsigned attr = rs6000_builtin_info[uns_fcode].attr & RS6000_BTC_TYPE_MASK;
++ /* RS6000_BTC_SPECIAL represents no-operand operators. */
+ gcc_assert (attr == RS6000_BTC_UNARY
+ || attr == RS6000_BTC_BINARY
+- || attr == RS6000_BTC_TERNARY);
++ || attr == RS6000_BTC_TERNARY
++ || attr == RS6000_BTC_SPECIAL);
+
+ /* Handle simple unary operations. */
+ d = bdesc_1arg;
+@@ -15012,6 +15626,12 @@
+ if (d->code == fcode)
+ return rs6000_expand_ternop_builtin (d->icode, exp, target);
+
++ /* Handle simple no-argument operations. */
++ d = bdesc_0arg;
++ for (i = 0; i < ARRAY_SIZE (bdesc_0arg); i++, d++)
++ if (d->code == fcode)
++ return rs6000_expand_zeroop_builtin (d->icode, target);
++
+ gcc_unreachable ();
+ }
+
+@@ -15049,6 +15669,10 @@
+ opaque_p_V2SI_type_node = build_pointer_type (opaque_V2SI_type_node);
+ opaque_V4SI_type_node = build_opaque_vector_type (intSI_type_node, 4);
+
++ const_str_type_node
++ = build_pointer_type (build_qualified_type (char_type_node,
++ TYPE_QUAL_CONST));
++
+ /* We use V1TI mode as a special container to hold __int128_t items that
+ must live in VSX registers. */
+ if (intTI_type_node)
+@@ -15111,6 +15735,12 @@
+ lang_hooks.types.register_builtin_type (ibm128_float_type_node,
+ "__ibm128");
+ }
++ else
++ {
++ /* All types must be nonzero, or self-test barfs during bootstrap. */
++ ieee128_float_type_node = long_double_type_node;
++ ibm128_float_type_node = long_double_type_node;
++ }
+
+ /* Initialize the modes for builtin_function_type, mapping a machine mode to
+ tree type node. */
+@@ -15252,6 +15882,15 @@
+ if (TARGET_EXTRA_BUILTINS || TARGET_SPE || TARGET_PAIRED_FLOAT)
+ rs6000_common_init_builtins ();
+
++ ftype = build_function_type_list (ieee128_float_type_node,
++ const_str_type_node, NULL_TREE);
++ def_builtin ("__builtin_nanq", ftype, RS6000_BUILTIN_NANQ);
++ def_builtin ("__builtin_nansq", ftype, RS6000_BUILTIN_NANSQ);
++
++ ftype = build_function_type_list (ieee128_float_type_node, NULL_TREE);
++ def_builtin ("__builtin_infq", ftype, RS6000_BUILTIN_INFQ);
++ def_builtin ("__builtin_huge_valq", ftype, RS6000_BUILTIN_HUGE_VALQ);
++
+ ftype = builtin_function_type (DFmode, DFmode, DFmode, VOIDmode,
+ RS6000_BUILTIN_RECIP, "__builtin_recipdiv");
+ def_builtin ("__builtin_recipdiv", ftype, RS6000_BUILTIN_RECIP);
+@@ -15816,10 +16455,44 @@
+ VSX_BUILTIN_STXVW4X_V8HI);
+ def_builtin ("__builtin_vsx_stxvw4x_v16qi", void_ftype_v16qi_long_pvoid,
+ VSX_BUILTIN_STXVW4X_V16QI);
++
++ def_builtin ("__builtin_vsx_ld_elemrev_v2df", v2df_ftype_long_pcvoid,
++ VSX_BUILTIN_LD_ELEMREV_V2DF);
++ def_builtin ("__builtin_vsx_ld_elemrev_v2di", v2di_ftype_long_pcvoid,
++ VSX_BUILTIN_LD_ELEMREV_V2DI);
++ def_builtin ("__builtin_vsx_ld_elemrev_v4sf", v4sf_ftype_long_pcvoid,
++ VSX_BUILTIN_LD_ELEMREV_V4SF);
++ def_builtin ("__builtin_vsx_ld_elemrev_v4si", v4si_ftype_long_pcvoid,
++ VSX_BUILTIN_LD_ELEMREV_V4SI);
++ def_builtin ("__builtin_vsx_st_elemrev_v2df", void_ftype_v2df_long_pvoid,
++ VSX_BUILTIN_ST_ELEMREV_V2DF);
++ def_builtin ("__builtin_vsx_st_elemrev_v2di", void_ftype_v2di_long_pvoid,
++ VSX_BUILTIN_ST_ELEMREV_V2DI);
++ def_builtin ("__builtin_vsx_st_elemrev_v4sf", void_ftype_v4sf_long_pvoid,
++ VSX_BUILTIN_ST_ELEMREV_V4SF);
++ def_builtin ("__builtin_vsx_st_elemrev_v4si", void_ftype_v4si_long_pvoid,
++ VSX_BUILTIN_ST_ELEMREV_V4SI);
++
++ if (TARGET_P9_VECTOR)
++ {
++ def_builtin ("__builtin_vsx_ld_elemrev_v8hi", v8hi_ftype_long_pcvoid,
++ VSX_BUILTIN_LD_ELEMREV_V8HI);
++ def_builtin ("__builtin_vsx_ld_elemrev_v16qi", v16qi_ftype_long_pcvoid,
++ VSX_BUILTIN_LD_ELEMREV_V16QI);
++ def_builtin ("__builtin_vsx_st_elemrev_v8hi",
++ void_ftype_v8hi_long_pvoid, VSX_BUILTIN_ST_ELEMREV_V8HI);
++ def_builtin ("__builtin_vsx_st_elemrev_v16qi",
++ void_ftype_v16qi_long_pvoid, VSX_BUILTIN_ST_ELEMREV_V16QI);
++ }
++
+ def_builtin ("__builtin_vec_vsx_ld", opaque_ftype_long_pcvoid,
+ VSX_BUILTIN_VEC_LD);
+ def_builtin ("__builtin_vec_vsx_st", void_ftype_opaque_long_pvoid,
+ VSX_BUILTIN_VEC_ST);
++ def_builtin ("__builtin_vec_xl", opaque_ftype_long_pcvoid,
++ VSX_BUILTIN_VEC_XL);
++ def_builtin ("__builtin_vec_xst", void_ftype_opaque_long_pvoid,
++ VSX_BUILTIN_VEC_XST);
+
+ def_builtin ("__builtin_vec_step", int_ftype_opaque, ALTIVEC_BUILTIN_VEC_STEP);
+ def_builtin ("__builtin_vec_splats", opaque_ftype_opaque, ALTIVEC_BUILTIN_VEC_SPLATS);
+@@ -16351,10 +17024,6 @@
+ while (num_args > 0 && h.mode[num_args] == VOIDmode)
+ num_args--;
+
+- if (num_args == 0)
+- fatal_error (input_location,
+- "internal error: builtin function %s had no type", name);
+-
+ ret_type = builtin_mode_to_type[h.mode[0]][h.uns_p[0]];
+ if (!ret_type && h.uns_p[0])
+ ret_type = builtin_mode_to_type[h.mode[0]][0];
+@@ -16406,6 +17075,7 @@
+ tree opaque_ftype_opaque = NULL_TREE;
+ tree opaque_ftype_opaque_opaque = NULL_TREE;
+ tree opaque_ftype_opaque_opaque_opaque = NULL_TREE;
++ tree v2si_ftype = NULL_TREE;
+ tree v2si_ftype_qi = NULL_TREE;
+ tree v2si_ftype_v2si_qi = NULL_TREE;
+ tree v2si_ftype_int_qi = NULL_TREE;
+@@ -16622,6 +17292,64 @@
+
+ def_builtin (d->name, type, d->code);
+ }
++
++ /* Add the simple no-argument operators. */
++ d = bdesc_0arg;
++ for (i = 0; i < ARRAY_SIZE (bdesc_0arg); i++, d++)
++ {
++ machine_mode mode0;
++ tree type;
++ HOST_WIDE_INT mask = d->mask;
++
++ if ((mask & builtin_mask) != mask)
++ {
++ if (TARGET_DEBUG_BUILTIN)
++ fprintf (stderr, "rs6000_builtin, skip no-argument %s\n", d->name);
++ continue;
++ }
++ if (rs6000_overloaded_builtin_p (d->code))
++ {
++ if (!opaque_ftype_opaque)
++ opaque_ftype_opaque
++ = build_function_type_list (opaque_V4SI_type_node, NULL_TREE);
++ type = opaque_ftype_opaque;
++ }
++ else
++ {
++ enum insn_code icode = d->icode;
++ if (d->name == 0)
++ {
++ if (TARGET_DEBUG_BUILTIN)
++ fprintf (stderr, "rs6000_builtin, bdesc_0arg[%lu] no name\n",
++ (long unsigned) i);
++ continue;
++ }
++ if (icode == CODE_FOR_nothing)
++ {
++ if (TARGET_DEBUG_BUILTIN)
++ fprintf (stderr,
++ "rs6000_builtin, skip no-argument %s (no code)\n",
++ d->name);
++ continue;
++ }
++ mode0 = insn_data[icode].operand[0].mode;
++ if (mode0 == V2SImode)
++ {
++ /* code for SPE */
++ if (! (type = v2si_ftype))
++ {
++ v2si_ftype
++ = build_function_type_list (opaque_V2SI_type_node,
++ NULL_TREE);
++ type = v2si_ftype;
++ }
++ }
++ else
++ type = builtin_function_type (mode0, VOIDmode, VOIDmode, VOIDmode,
++ d->code, d->name);
++ }
++ def_builtin (d->name, type, d->code);
++ }
+ }
+
+ /* Set up AIX/Darwin/64-bit Linux quad floating point routines. */
+@@ -18006,25 +18734,33 @@
+ addr_mask = (reg_addr[mode].addr_mask[RELOAD_REG_VMX]
+ & ~RELOAD_REG_AND_M16);
+
+- else
++ /* If the register allocator hasn't made up its mind yet on the register
++ class to use, settle on defaults to use. */
++ else if (rclass == NO_REGS)
+ {
+- if (TARGET_DEBUG_ADDR)
+- fprintf (stderr,
+- "rs6000_secondary_reload_memory: mode = %s, class = %s, "
+- "class is not GPR, FPR, VMX\n",
+- GET_MODE_NAME (mode), reg_class_names[rclass]);
++ addr_mask = (reg_addr[mode].addr_mask[RELOAD_REG_ANY]
++ & ~RELOAD_REG_AND_M16);
+
+- return -1;
++ if ((addr_mask & RELOAD_REG_MULTIPLE) != 0)
++ addr_mask &= ~(RELOAD_REG_INDEXED
++ | RELOAD_REG_PRE_INCDEC
++ | RELOAD_REG_PRE_MODIFY);
+ }
+
++ else
++ addr_mask = 0;
++
+ /* If the register isn't valid in this register class, just return now. */
+ if ((addr_mask & RELOAD_REG_VALID) == 0)
+ {
+ if (TARGET_DEBUG_ADDR)
+- fprintf (stderr,
+- "rs6000_secondary_reload_memory: mode = %s, class = %s, "
+- "not valid in class\n",
+- GET_MODE_NAME (mode), reg_class_names[rclass]);
++ {
++ fprintf (stderr,
++ "rs6000_secondary_reload_memory: mode = %s, class = %s, "
++ "not valid in class\n",
++ GET_MODE_NAME (mode), reg_class_names[rclass]);
++ debug_rtx (addr);
++ }
+
+ return -1;
+ }
+@@ -18152,13 +18888,23 @@
+ }
+ }
+
++ else if ((addr_mask & RELOAD_REG_QUAD_OFFSET) != 0
++ && CONST_INT_P (plus_arg1))
++ {
++ if (!quad_address_offset_p (INTVAL (plus_arg1)))
++ {
++ extra_cost = 1;
++ type = "vector d-form offset";
++ }
++ }
++
+ /* Make sure the register class can handle offset addresses. */
+ else if (rs6000_legitimate_offset_address_p (mode, addr, false, true))
+ {
+ if ((addr_mask & RELOAD_REG_OFFSET) == 0)
+ {
+ extra_cost = 1;
+- type = "offset";
++ type = "offset #2";
+ }
+ }
+
+@@ -18171,7 +18917,14 @@
+ break;
+
+ case LO_SUM:
+- if (!legitimate_lo_sum_address_p (mode, addr, false))
++ /* Quad offsets are restricted and can't handle normal addresses. */
++ if ((addr_mask & RELOAD_REG_QUAD_OFFSET) != 0)
++ {
++ extra_cost = -1;
++ type = "vector d-form lo_sum";
++ }
++
++ else if (!legitimate_lo_sum_address_p (mode, addr, false))
+ {
+ fail_msg = "bad LO_SUM";
+ extra_cost = -1;
+@@ -18188,8 +18941,17 @@
+ case CONST:
+ case SYMBOL_REF:
+ case LABEL_REF:
+- type = "address";
+- extra_cost = rs6000_secondary_reload_toc_costs (addr_mask);
++ if ((addr_mask & RELOAD_REG_QUAD_OFFSET) != 0)
++ {
++ extra_cost = -1;
++ type = "vector d-form lo_sum #2";
++ }
++
++ else
++ {
++ type = "address";
++ extra_cost = rs6000_secondary_reload_toc_costs (addr_mask);
++ }
+ break;
+
+ /* TOC references look like offsetable memory. */
+@@ -18200,6 +18962,12 @@
+ extra_cost = -1;
+ }
+
++ else if ((addr_mask & RELOAD_REG_QUAD_OFFSET) != 0)
++ {
++ extra_cost = -1;
++ type = "vector d-form lo_sum #3";
++ }
++
+ else if ((addr_mask & RELOAD_REG_OFFSET) == 0)
+ {
+ extra_cost = 1;
+@@ -18256,7 +19024,8 @@
+ simple move insns are issued. At present, 32-bit integers are not allowed
+ in FPR/VSX registers. Single precision binary floating is not a simple
+ move because we need to convert to the single precision memory layout.
+- The 4-byte SDmode can be moved. */
++ The 4-byte SDmode can be moved. TDmode values are disallowed since they
++ need special direct move handling, which we do not support yet. */
+ size = GET_MODE_SIZE (mode);
+ if (TARGET_DIRECT_MOVE
+ && ((mode == SDmode) || (TARGET_POWERPC64 && size == 8))
+@@ -18264,7 +19033,7 @@
+ || (to_type == VSX_REG_TYPE && from_type == GPR_REG_TYPE)))
+ return true;
+
+- else if (TARGET_DIRECT_MOVE_128 && size == 16
++ else if (TARGET_DIRECT_MOVE_128 && size == 16 && mode != TDmode
+ && ((to_type == VSX_REG_TYPE && from_type == GPR_REG_TYPE)
+ || (to_type == GPR_REG_TYPE && from_type == VSX_REG_TYPE)))
+ return true;
+@@ -18653,6 +19422,9 @@
+ fprintf (stderr, ", reload func = %s, extra cost = %d",
+ insn_data[sri->icode].name, sri->extra_cost);
+
++ else if (sri->extra_cost > 0)
++ fprintf (stderr, ", extra cost = %d", sri->extra_cost);
++
+ fputs ("\n", stderr);
+ debug_rtx (x);
+ }
+@@ -18827,6 +19599,16 @@
+ }
+ }
+
++ else if (mode_supports_vsx_dform_quad (mode) && CONST_INT_P (op1))
++ {
++ if (((addr_mask & RELOAD_REG_QUAD_OFFSET) == 0)
++ || !quad_address_p (addr, mode, false))
++ {
++ emit_insn (gen_rtx_SET (scratch, addr));
++ new_addr = scratch;
++ }
++ }
++
+ /* Make sure the register class can handle offset addresses. */
+ else if (rs6000_legitimate_offset_address_p (mode, addr, false, true))
+ {
+@@ -18857,6 +19639,13 @@
+ }
+ }
+
++ /* Quad offsets are restricted and can't handle normal addresses. */
++ else if (mode_supports_vsx_dform_quad (mode))
++ {
++ emit_insn (gen_rtx_SET (scratch, addr));
++ new_addr = scratch;
++ }
++
+ /* Make sure the register class can handle offset addresses. */
+ else if (legitimate_lo_sum_address_p (mode, addr, false))
+ {
+@@ -19046,6 +19835,16 @@
+ machine_mode mode = GET_MODE (x);
+ bool is_constant = CONSTANT_P (x);
+
++ /* If a mode can't go in FPR/ALTIVEC/VSX registers, don't return a preferred
++ reload class for it. */
++ if ((rclass == ALTIVEC_REGS || rclass == VSX_REGS)
++ && (reg_addr[mode].addr_mask[RELOAD_REG_VMX] & RELOAD_REG_VALID) == 0)
++ return NO_REGS;
++
++ if ((rclass == FLOAT_REGS || rclass == VSX_REGS)
++ && (reg_addr[mode].addr_mask[RELOAD_REG_FPR] & RELOAD_REG_VALID) == 0)
++ return NO_REGS;
++
+ /* For VSX, see if we should prefer FLOAT_REGS or ALTIVEC_REGS. Do not allow
+ the reloading of address expressions using PLUS into floating point
+ registers. */
+@@ -19067,7 +19866,8 @@
+ }
+
+ /* D-form addressing can easily reload the value. */
+- if (mode_supports_vmx_dform (mode))
++ if (mode_supports_vmx_dform (mode)
++ || mode_supports_vsx_dform_quad (mode))
+ return rclass;
+
+ /* If this is a scalar floating point value and we don't have D-form
+@@ -19095,6 +19895,25 @@
+ return NO_REGS;
+ }
+
++ /* If we haven't picked a register class, and the type is a vector or
++ floating point type, prefer to use the VSX, FPR, or Altivec register
++ classes. */
++ if (rclass == NO_REGS)
++ {
++ if (TARGET_VSX && VECTOR_MEM_VSX_OR_P8_VECTOR_P (mode))
++ return VSX_REGS;
++
++ if (TARGET_ALTIVEC && VECTOR_MEM_ALTIVEC_P (mode))
++ return ALTIVEC_REGS;
++
++ if (DECIMAL_FLOAT_MODE_P (mode))
++ return TARGET_DFP ? FLOAT_REGS : NO_REGS;
++
++ if (TARGET_FPRS && TARGET_HARD_FLOAT && FLOAT_MODE_P (mode)
++ && (reg_addr[mode].addr_mask[RELOAD_REG_FPR] & RELOAD_REG_VALID) == 0)
++ return FLOAT_REGS;
++ }
++
+ if (GET_MODE_CLASS (mode) == MODE_INT && rclass == NON_SPECIAL_REGS)
+ return GENERAL_REGS;
+
+@@ -19483,8 +20302,16 @@
+
+ else if (TARGET_VSX && dest_vsx_p)
+ {
+- if (mode == V16QImode || mode == V8HImode || mode == V4SImode)
++ if (mode_supports_vsx_dform_quad (mode)
++ && quad_address_p (XEXP (src, 0), mode, true))
++ return "lxv %x0,%1";
++
++ else if (TARGET_P9_VECTOR)
++ return "lxvx %x0,%y1";
++
++ else if (mode == V16QImode || mode == V8HImode || mode == V4SImode)
+ return "lxvw4x %x0,%y1";
++
+ else
+ return "lxvd2x %x0,%y1";
+ }
+@@ -19513,8 +20340,16 @@
+
+ else if (TARGET_VSX && src_vsx_p)
+ {
+- if (mode == V16QImode || mode == V8HImode || mode == V4SImode)
++ if (mode_supports_vsx_dform_quad (mode)
++ && quad_address_p (XEXP (dest, 0), mode, true))
++ return "stxv %x1,%0";
++
++ else if (TARGET_P9_VECTOR)
++ return "stxvx %x1,%y0";
++
++ else if (mode == V16QImode || mode == V8HImode || mode == V4SImode)
+ return "stxvw4x %x1,%y0";
++
+ else
+ return "stxvd2x %x1,%y0";
+ }
+@@ -19536,10 +20371,8 @@
+ if (dest_gpr_p)
+ return "#";
+
+- else if (TARGET_VSX && dest_vsx_p && zero_constant (src, mode))
+- return "xxlxor %x0,%x0,%x0";
+-
+- else if (TARGET_ALTIVEC && dest_vmx_p)
++ else if ((dest_vmx_p && TARGET_ALTIVEC)
++ || (dest_vsx_p && TARGET_VSX))
+ return output_vec_const_move (operands);
+ }
+
+@@ -21747,6 +22580,101 @@
+ return 1;
+ }
+
++/* ISA 3.0 (power9) minmax subcase to emit a XSMAXCDP or XSMINCDP instruction
++ for SF/DF scalars. Move TRUE_COND to DEST if OP of the operands of the last
++ comparison is nonzero/true, FALSE_COND if it is zero/false. Return 0 if the
++ hardware has no such operation. */
++
++static int
++rs6000_emit_p9_fp_minmax (rtx dest, rtx op, rtx true_cond, rtx false_cond)
++{
++ enum rtx_code code = GET_CODE (op);
++ rtx op0 = XEXP (op, 0);
++ rtx op1 = XEXP (op, 1);
++ machine_mode compare_mode = GET_MODE (op0);
++ machine_mode result_mode = GET_MODE (dest);
++ bool max_p = false;
++
++ if (result_mode != compare_mode)
++ return 0;
++
++ if (code == GE || code == GT)
++ max_p = true;
++ else if (code == LE || code == LT)
++ max_p = false;
++ else
++ return 0;
++
++ if (rtx_equal_p (op0, true_cond) && rtx_equal_p (op1, false_cond))
++ ;
++
++ else if (rtx_equal_p (op1, true_cond) && rtx_equal_p (op0, false_cond))
++ max_p = !max_p;
++
++ else
++ return 0;
++
++ rs6000_emit_minmax (dest, max_p ? SMAX : SMIN, op0, op1);
++ return 1;
++}
++
++/* ISA 3.0 (power9) conditional move subcase to emit XSCMP{EQ,GE,GT,NE}DP and
++ XXSEL instructions for SF/DF scalars. Move TRUE_COND to DEST if OP of the
++ operands of the last comparison is nonzero/true, FALSE_COND if it is
++ zero/false. Return 0 if the hardware has no such operation. */
++
++static int
++rs6000_emit_p9_fp_cmove (rtx dest, rtx op, rtx true_cond, rtx false_cond)
++{
++ enum rtx_code code = GET_CODE (op);
++ rtx op0 = XEXP (op, 0);
++ rtx op1 = XEXP (op, 1);
++ machine_mode result_mode = GET_MODE (dest);
++ rtx compare_rtx;
++ rtx cmove_rtx;
++ rtx clobber_rtx;
++
++ if (!can_create_pseudo_p ())
++ return 0;
++
++ switch (code)
++ {
++ case EQ:
++ case GE:
++ case GT:
++ break;
++
++ case NE:
++ case LT:
++ case LE:
++ code = swap_condition (code);
++ std::swap (op0, op1);
++ break;
++
++ default:
++ return 0;
++ }
++
++ /* Generate: [(parallel [(set (dest)
++ (if_then_else (op (cmp1) (cmp2))
++ (true)
++ (false)))
++ (clobber (scratch))])]. */
++
++ compare_rtx = gen_rtx_fmt_ee (code, CCFPmode, op0, op1);
++ cmove_rtx = gen_rtx_SET (dest,
++ gen_rtx_IF_THEN_ELSE (result_mode,
++ compare_rtx,
++ true_cond,
++ false_cond));
++
++ clobber_rtx = gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (V2DImode));
++ emit_insn (gen_rtx_PARALLEL (VOIDmode,
++ gen_rtvec (2, cmove_rtx, clobber_rtx)));
++
++ return 1;
++}
++
+ /* Emit a conditional move: move TRUE_COND to DEST if OP of the
+ operands of the last comparison is nonzero/true, FALSE_COND if it
+ is zero/false. Return 0 if the hardware has no such operation. */
+@@ -21773,6 +22701,18 @@
+ if (GET_MODE (false_cond) != result_mode)
+ return 0;
+
++ /* See if we can use the ISA 3.0 (power9) min/max/compare functions. */
++ if (TARGET_P9_MINMAX
++ && (compare_mode == SFmode || compare_mode == DFmode)
++ && (result_mode == SFmode || result_mode == DFmode))
++ {
++ if (rs6000_emit_p9_fp_minmax (dest, op, true_cond, false_cond))
++ return 1;
++
++ if (rs6000_emit_p9_fp_cmove (dest, op, true_cond, false_cond))
++ return 1;
++ }
++
+ /* Don't allow using floating point comparisons for integer results for
+ now. */
+ if (FLOAT_MODE_P (compare_mode) && !FLOAT_MODE_P (result_mode))
+@@ -22034,6 +22974,48 @@
+ emit_move_insn (dest, target);
+ }
+
++/* Split a signbit operation on 64-bit machines with direct move. Also allow
++ for the value to come from memory or if it is already loaded into a GPR. */
++
++void
++rs6000_split_signbit (rtx dest, rtx src)
++{
++ machine_mode d_mode = GET_MODE (dest);
++ machine_mode s_mode = GET_MODE (src);
++ rtx dest_di = (d_mode == DImode) ? dest : gen_lowpart (DImode, dest);
++ rtx shift_reg = dest_di;
++
++ gcc_assert (REG_P (dest));
++ gcc_assert (REG_P (src) || MEM_P (src));
++ gcc_assert (s_mode == KFmode || s_mode == TFmode);
++
++ if (MEM_P (src))
++ {
++ rtx mem = (WORDS_BIG_ENDIAN
++ ? adjust_address (src, DImode, 0)
++ : adjust_address (src, DImode, 8));
++ emit_insn (gen_rtx_SET (dest_di, mem));
++ }
++
++ else
++ {
++ unsigned int r = REGNO (src);
++
++ /* If this is a VSX register, generate the special mfvsrd instruction
++ to get it in a GPR. Until we support SF and DF modes, that will
++ always be true. */
++ gcc_assert (VSX_REGNO_P (r));
++
++ if (s_mode == KFmode)
++ emit_insn (gen_signbitkf2_dm2 (dest_di, src));
++ else
++ emit_insn (gen_signbittf2_dm2 (dest_di, src));
++ }
++
++ emit_insn (gen_lshrdi3 (dest_di, shift_reg, GEN_INT (63)));
++ return;
++}
++
+ /* A subroutine of the atomic operation splitters. Jump to LABEL if
+ COND is true. Mark the jump as unlikely to be taken. */
+
+@@ -25949,25 +26931,37 @@
+ if (info->vrsave_mask & ALTIVEC_REG_BIT (i))
+ {
+ rtx areg, savereg, mem;
+- int offset;
++ HOST_WIDE_INT offset;
+
+ offset = (info->altivec_save_offset + frame_off
+ + 16 * (i - info->first_altivec_reg_save));
+
+ savereg = gen_rtx_REG (V4SImode, i);
+
+- NOT_INUSE (0);
+- areg = gen_rtx_REG (Pmode, 0);
+- emit_move_insn (areg, GEN_INT (offset));
+-
+- /* AltiVec addressing mode is [reg+reg]. */
+- mem = gen_frame_mem (V4SImode,
+- gen_rtx_PLUS (Pmode, frame_reg_rtx, areg));
+-
+- /* Rather than emitting a generic move, force use of the stvx
+- instruction, which we always want. In particular we don't
+- want xxpermdi/stxvd2x for little endian. */
+- insn = emit_insn (gen_altivec_stvx_v4si_internal (mem, savereg));
++ if (TARGET_P9_DFORM_VECTOR && quad_address_offset_p (offset))
++ {
++ mem = gen_frame_mem (V4SImode,
++ gen_rtx_PLUS (Pmode, frame_reg_rtx,
++ GEN_INT (offset)));
++ insn = emit_insn (gen_rtx_SET (mem, savereg));
++ areg = NULL_RTX;
++ }
++ else
++ {
++ NOT_INUSE (0);
++ areg = gen_rtx_REG (Pmode, 0);
++ emit_move_insn (areg, GEN_INT (offset));
++
++ /* AltiVec addressing mode is [reg+reg]. */
++ mem = gen_frame_mem (V4SImode,
++ gen_rtx_PLUS (Pmode, frame_reg_rtx, areg));
++
++ /* Rather than emitting a generic move, force use of the stvx
++ instruction, which we always want on ISA 2.07 (power8) systems.
++ In particular we don't want xxpermdi/stxvd2x for little
++ endian. */
++ insn = emit_insn (gen_altivec_stvx_v4si_internal (mem, savereg));
++ }
+
+ rs6000_frame_related (insn, frame_reg_rtx, sp_off - frame_off,
+ areg, GEN_INT (offset));
+@@ -26687,23 +27681,35 @@
+ for (i = info->first_altivec_reg_save; i <= LAST_ALTIVEC_REGNO; ++i)
+ if (info->vrsave_mask & ALTIVEC_REG_BIT (i))
+ {
+- rtx addr, areg, mem, reg;
++ rtx addr, areg, mem, insn;
++ rtx reg = gen_rtx_REG (V4SImode, i);
++ HOST_WIDE_INT offset
++ = (info->altivec_save_offset + frame_off
++ + 16 * (i - info->first_altivec_reg_save));
+
+- areg = gen_rtx_REG (Pmode, 0);
+- emit_move_insn
+- (areg, GEN_INT (info->altivec_save_offset
+- + frame_off
+- + 16 * (i - info->first_altivec_reg_save)));
++ if (TARGET_P9_DFORM_VECTOR && quad_address_offset_p (offset))
++ {
++ mem = gen_frame_mem (V4SImode,
++ gen_rtx_PLUS (Pmode, frame_reg_rtx,
++ GEN_INT (offset)));
++ insn = gen_rtx_SET (reg, mem);
++ }
++ else
++ {
++ areg = gen_rtx_REG (Pmode, 0);
++ emit_move_insn (areg, GEN_INT (offset));
+
+- /* AltiVec addressing mode is [reg+reg]. */
+- addr = gen_rtx_PLUS (Pmode, frame_reg_rtx, areg);
+- mem = gen_frame_mem (V4SImode, addr);
++ /* AltiVec addressing mode is [reg+reg]. */
++ addr = gen_rtx_PLUS (Pmode, frame_reg_rtx, areg);
++ mem = gen_frame_mem (V4SImode, addr);
++
++ /* Rather than emitting a generic move, force use of the
++ lvx instruction, which we always want. In particular we
++ don't want lxvd2x/xxpermdi for little endian. */
++ insn = gen_altivec_lvx_v4si_internal (reg, mem);
++ }
+
+- reg = gen_rtx_REG (V4SImode, i);
+- /* Rather than emitting a generic move, force use of the
+- lvx instruction, which we always want. In particular
+- we don't want lxvd2x/xxpermdi for little endian. */
+- (void) emit_insn (gen_altivec_lvx_v4si_internal (reg, mem));
++ (void) emit_insn (insn);
+ }
+ }
+
+@@ -26890,23 +27896,35 @@
+ for (i = info->first_altivec_reg_save; i <= LAST_ALTIVEC_REGNO; ++i)
+ if (info->vrsave_mask & ALTIVEC_REG_BIT (i))
+ {
+- rtx addr, areg, mem, reg;
++ rtx addr, areg, mem, insn;
++ rtx reg = gen_rtx_REG (V4SImode, i);
++ HOST_WIDE_INT offset
++ = (info->altivec_save_offset + frame_off
++ + 16 * (i - info->first_altivec_reg_save));
+
+- areg = gen_rtx_REG (Pmode, 0);
+- emit_move_insn
+- (areg, GEN_INT (info->altivec_save_offset
+- + frame_off
+- + 16 * (i - info->first_altivec_reg_save)));
++ if (TARGET_P9_DFORM_VECTOR && quad_address_offset_p (offset))
++ {
++ mem = gen_frame_mem (V4SImode,
++ gen_rtx_PLUS (Pmode, frame_reg_rtx,
++ GEN_INT (offset)));
++ insn = gen_rtx_SET (reg, mem);
++ }
++ else
++ {
++ areg = gen_rtx_REG (Pmode, 0);
++ emit_move_insn (areg, GEN_INT (offset));
+
+- /* AltiVec addressing mode is [reg+reg]. */
+- addr = gen_rtx_PLUS (Pmode, frame_reg_rtx, areg);
+- mem = gen_frame_mem (V4SImode, addr);
++ /* AltiVec addressing mode is [reg+reg]. */
++ addr = gen_rtx_PLUS (Pmode, frame_reg_rtx, areg);
++ mem = gen_frame_mem (V4SImode, addr);
++
++ /* Rather than emitting a generic move, force use of the
++ lvx instruction, which we always want. In particular we
++ don't want lxvd2x/xxpermdi for little endian. */
++ insn = gen_altivec_lvx_v4si_internal (reg, mem);
++ }
+
+- reg = gen_rtx_REG (V4SImode, i);
+- /* Rather than emitting a generic move, force use of the
+- lvx instruction, which we always want. In particular
+- we don't want lxvd2x/xxpermdi for little endian. */
+- (void) emit_insn (gen_altivec_lvx_v4si_internal (reg, mem));
++ (void) emit_insn (insn);
+ }
+ }
+
+@@ -27724,6 +28742,11 @@
+ const0_rtx, const0_rtx));
+ call_fusage = NULL_RTX;
+ use_reg (&call_fusage, r12);
++ /* Say the call uses r0, even though it doesn't, to stop regrename
++ from twiddling with the insns saving lr, trashing args for cfun.
++ The insns restoring lr are similarly protected by making
++ split_stack_return use r0. */
++ use_reg (&call_fusage, r0);
+ add_function_usage_to (insn, call_fusage);
+ emit_insn (gen_frame_load (r0, r1, info->lr_save_offset));
+ insn = emit_move_insn (lr, r0);
+@@ -28763,13 +29786,20 @@
+
+ /* The following variable value is the last issued insn. */
+
+-static rtx last_scheduled_insn;
++static rtx_insn *last_scheduled_insn;
+
+ /* The following variable helps to balance issuing of load and
+ store instructions */
+
+ static int load_store_pendulum;
+
++/* The following variable helps pair divide insns during scheduling. */
++static int divide_cnt;
++/* The following variable helps pair and alternate vector and vector load
++ insns during scheduling. */
++static int vec_load_pendulum;
++
++
+ /* Power4 load update and store update instructions are cracked into a
+ load or store and an integer insn which are executed in the same cycle.
+ Branches have their own dispatch slot which does not count against the
+@@ -28844,7 +29874,7 @@
+ some cycles later. */
+
+ /* Separate a load from a narrower, dependent store. */
+- if (rs6000_sched_groups
++ if ((rs6000_sched_groups || rs6000_cpu_attr == CPU_POWER9)
+ && GET_CODE (PATTERN (insn)) == SET
+ && GET_CODE (PATTERN (dep_insn)) == SET
+ && GET_CODE (XEXP (PATTERN (insn), 1)) == MEM
+@@ -29070,7 +30100,9 @@
+ switch (attr_type)
+ {
+ case TYPE_FP:
+- if (get_attr_type (dep_insn) == TYPE_FP)
++ case TYPE_FPSIMPLE:
++ if (get_attr_type (dep_insn) == TYPE_FP
++ || get_attr_type (dep_insn) == TYPE_FPSIMPLE)
+ return 1;
+ break;
+ case TYPE_FPLOAD:
+@@ -29082,6 +30114,8 @@
+ break;
+ }
+ }
++ /* Fall through, no cost for output dependency. */
++
+ case REG_DEP_ANTI:
+ /* Anti dependency; DEP_INSN reads a register that INSN writes some
+ cycles later. */
+@@ -29454,8 +30488,9 @@
+ case CPU_POWER7:
+ return 5;
+ case CPU_POWER8:
+- case CPU_POWER9:
+ return 7;
++ case CPU_POWER9:
++ return 6;
+ default:
+ return 1;
+ }
+@@ -29613,6 +30648,28 @@
+ return is_store_insn1 (PATTERN (insn), str_mem);
+ }
+
++/* Return whether TYPE is a Power9 pairable vector instruction type. */
++
++static bool
++is_power9_pairable_vec_type (enum attr_type type)
++{
++ switch (type)
++ {
++ case TYPE_VECSIMPLE:
++ case TYPE_VECCOMPLEX:
++ case TYPE_VECDIV:
++ case TYPE_VECCMP:
++ case TYPE_VECPERM:
++ case TYPE_VECFLOAT:
++ case TYPE_VECFDIV:
++ case TYPE_VECDOUBLE:
++ return true;
++ default:
++ break;
++ }
++ return false;
++}
++
+ /* Returns whether the dependence between INSN and NEXT is considered
+ costly by the given target. */
+
+@@ -29689,6 +30746,229 @@
+ return insn;
+ }
+
++/* Do Power9 specific sched_reorder2 reordering of ready list. */
++
++static int
++power9_sched_reorder2 (rtx_insn **ready, int lastpos)
++{
++ int pos;
++ int i;
++ rtx_insn *tmp;
++ enum attr_type type;
++
++ type = get_attr_type (last_scheduled_insn);
++
++ /* Try to issue fixed point divides back-to-back in pairs so they will be
++ routed to separate execution units and execute in parallel. */
++ if (type == TYPE_DIV && divide_cnt == 0)
++ {
++ /* First divide has been scheduled. */
++ divide_cnt = 1;
++
++ /* Scan the ready list looking for another divide, if found move it
++ to the end of the list so it is chosen next. */
++ pos = lastpos;
++ while (pos >= 0)
++ {
++ if (recog_memoized (ready[pos]) >= 0
++ && get_attr_type (ready[pos]) == TYPE_DIV)
++ {
++ tmp = ready[pos];
++ for (i = pos; i < lastpos; i++)
++ ready[i] = ready[i + 1];
++ ready[lastpos] = tmp;
++ break;
++ }
++ pos--;
++ }
++ }
++ else
++ {
++ /* Last insn was the 2nd divide or not a divide, reset the counter. */
++ divide_cnt = 0;
++
++ /* Power9 can execute 2 vector operations and 2 vector loads in a single
++ cycle. So try to pair up and alternate groups of vector and vector
++ load instructions.
++
++ To aid this formation, a counter is maintained to keep track of
++ vec/vecload insns issued. The value of vec_load_pendulum maintains
++ the current state with the following values:
++
++ 0 : Initial state, no vec/vecload group has been started.
++
++ -1 : 1 vector load has been issued and another has been found on
++ the ready list and moved to the end.
++
++ -2 : 2 vector loads have been issued and a vector operation has
++ been found and moved to the end of the ready list.
++
++ -3 : 2 vector loads and a vector insn have been issued and a
++ vector operation has been found and moved to the end of the
++ ready list.
++
++ 1 : 1 vector insn has been issued and another has been found and
++ moved to the end of the ready list.
++
++ 2 : 2 vector insns have been issued and a vector load has been
++ found and moved to the end of the ready list.
++
++ 3 : 2 vector insns and a vector load have been issued and another
++ vector load has been found and moved to the end of the ready
++ list. */
++ if (type == TYPE_VECLOAD)
++ {
++ /* Issued a vecload. */
++ if (vec_load_pendulum == 0)
++ {
++ /* We issued a single vecload, look for another and move it to
++ the end of the ready list so it will be scheduled next.
++ Set pendulum if found. */
++ pos = lastpos;
++ while (pos >= 0)
++ {
++ if (recog_memoized (ready[pos]) >= 0
++ && get_attr_type (ready[pos]) == TYPE_VECLOAD)
++ {
++ tmp = ready[pos];
++ for (i = pos; i < lastpos; i++)
++ ready[i] = ready[i + 1];
++ ready[lastpos] = tmp;
++ vec_load_pendulum = -1;
++ return cached_can_issue_more;
++ }
++ pos--;
++ }
++ }
++ else if (vec_load_pendulum == -1)
++ {
++ /* This is the second vecload we've issued, search the ready
++ list for a vector operation so we can try to schedule a
++ pair of those next. If found move to the end of the ready
++ list so it is scheduled next and set the pendulum. */
++ pos = lastpos;
++ while (pos >= 0)
++ {
++ if (recog_memoized (ready[pos]) >= 0
++ && is_power9_pairable_vec_type (
++ get_attr_type (ready[pos])))
++ {
++ tmp = ready[pos];
++ for (i = pos; i < lastpos; i++)
++ ready[i] = ready[i + 1];
++ ready[lastpos] = tmp;
++ vec_load_pendulum = -2;
++ return cached_can_issue_more;
++ }
++ pos--;
++ }
++ }
++ else if (vec_load_pendulum == 2)
++ {
++ /* Two vector ops have been issued and we've just issued a
++ vecload, look for another vecload and move to end of ready
++ list if found. */
++ pos = lastpos;
++ while (pos >= 0)
++ {
++ if (recog_memoized (ready[pos]) >= 0
++ && get_attr_type (ready[pos]) == TYPE_VECLOAD)
++ {
++ tmp = ready[pos];
++ for (i = pos; i < lastpos; i++)
++ ready[i] = ready[i + 1];
++ ready[lastpos] = tmp;
++ /* Set pendulum so that next vecload will be seen as
++ finishing a group, not start of one. */
++ vec_load_pendulum = 3;
++ return cached_can_issue_more;
++ }
++ pos--;
++ }
++ }
++ }
++ else if (is_power9_pairable_vec_type (type))
++ {
++ /* Issued a vector operation. */
++ if (vec_load_pendulum == 0)
++ /* We issued a single vec op, look for another and move it
++ to the end of the ready list so it will be scheduled next.
++ Set pendulum if found. */
++ {
++ pos = lastpos;
++ while (pos >= 0)
++ {
++ if (recog_memoized (ready[pos]) >= 0
++ && is_power9_pairable_vec_type (
++ get_attr_type (ready[pos])))
++ {
++ tmp = ready[pos];
++ for (i = pos; i < lastpos; i++)
++ ready[i] = ready[i + 1];
++ ready[lastpos] = tmp;
++ vec_load_pendulum = 1;
++ return cached_can_issue_more;
++ }
++ pos--;
++ }
++ }
++ else if (vec_load_pendulum == 1)
++ {
++ /* This is the second vec op we've issued, search the ready
++ list for a vecload operation so we can try to schedule a
++ pair of those next. If found move to the end of the ready
++ list so it is scheduled next and set the pendulum. */
++ pos = lastpos;
++ while (pos >= 0)
++ {
++ if (recog_memoized (ready[pos]) >= 0
++ && get_attr_type (ready[pos]) == TYPE_VECLOAD)
++ {
++ tmp = ready[pos];
++ for (i = pos; i < lastpos; i++)
++ ready[i] = ready[i + 1];
++ ready[lastpos] = tmp;
++ vec_load_pendulum = 2;
++ return cached_can_issue_more;
++ }
++ pos--;
++ }
++ }
++ else if (vec_load_pendulum == -2)
++ {
++ /* Two vecload ops have been issued and we've just issued a
++ vec op, look for another vec op and move to end of ready
++ list if found. */
++ pos = lastpos;
++ while (pos >= 0)
++ {
++ if (recog_memoized (ready[pos]) >= 0
++ && is_power9_pairable_vec_type (
++ get_attr_type (ready[pos])))
++ {
++ tmp = ready[pos];
++ for (i = pos; i < lastpos; i++)
++ ready[i] = ready[i + 1];
++ ready[lastpos] = tmp;
++ /* Set pendulum so that next vec op will be seen as
++ finishing a group, not start of one. */
++ vec_load_pendulum = -3;
++ return cached_can_issue_more;
++ }
++ pos--;
++ }
++ }
++ }
++
++ /* We've either finished a vec/vecload group, couldn't find an insn to
++ continue the current group, or the last insn had nothing to do with
++ with a group. In any case, reset the pendulum. */
++ vec_load_pendulum = 0;
++ }
++
++ return cached_can_issue_more;
++}
++
+ /* We are about to begin issuing insns for this clock cycle. */
+
+ static int
+@@ -29920,6 +31200,11 @@
+ }
+ }
+
++ /* Do Power9 dependent reordering if necessary. */
++ if (rs6000_cpu == PROCESSOR_POWER9 && last_scheduled_insn
++ && recog_memoized (last_scheduled_insn) >= 0)
++ return power9_sched_reorder2 (ready, *pn_ready - 1);
++
+ return cached_can_issue_more;
+ }
+
+@@ -30088,7 +31373,6 @@
+ }
+ break;
+ case PROCESSOR_POWER8:
+- case PROCESSOR_POWER9:
+ type = get_attr_type (insn);
+
+ switch (type)
+@@ -30219,7 +31503,6 @@
+ }
+ break;
+ case PROCESSOR_POWER8:
+- case PROCESSOR_POWER9:
+ type = get_attr_type (insn);
+
+ switch (type)
+@@ -30338,7 +31621,7 @@
+
+ /* Do we have a special group ending nop? */
+ if (rs6000_cpu_attr == CPU_POWER6 || rs6000_cpu_attr == CPU_POWER7
+- || rs6000_cpu_attr == CPU_POWER8 || rs6000_cpu_attr == CPU_POWER9)
++ || rs6000_cpu_attr == CPU_POWER8)
+ {
+ nop = gen_group_ending_nop ();
+ emit_insn_before (nop, next_insn);
+@@ -30592,8 +31875,10 @@
+ int sched_verbose ATTRIBUTE_UNUSED,
+ int max_ready ATTRIBUTE_UNUSED)
+ {
+- last_scheduled_insn = NULL_RTX;
++ last_scheduled_insn = NULL;
+ load_store_pendulum = 0;
++ divide_cnt = 0;
++ vec_load_pendulum = 0;
+ }
+
+ /* The following function is called at the end of scheduling BB.
+@@ -30634,14 +31919,16 @@
+ }
+ }
+
+-struct _rs6000_sched_context
++struct rs6000_sched_context
+ {
+ short cached_can_issue_more;
+- rtx last_scheduled_insn;
++ rtx_insn *last_scheduled_insn;
+ int load_store_pendulum;
++ int divide_cnt;
++ int vec_load_pendulum;
+ };
+
+-typedef struct _rs6000_sched_context rs6000_sched_context_def;
++typedef struct rs6000_sched_context rs6000_sched_context_def;
+ typedef rs6000_sched_context_def *rs6000_sched_context_t;
+
+ /* Allocate store for new scheduling context. */
+@@ -30661,14 +31948,18 @@
+ if (clean_p)
+ {
+ sc->cached_can_issue_more = 0;
+- sc->last_scheduled_insn = NULL_RTX;
++ sc->last_scheduled_insn = NULL;
+ sc->load_store_pendulum = 0;
++ sc->divide_cnt = 0;
++ sc->vec_load_pendulum = 0;
+ }
+ else
+ {
+ sc->cached_can_issue_more = cached_can_issue_more;
+ sc->last_scheduled_insn = last_scheduled_insn;
+ sc->load_store_pendulum = load_store_pendulum;
++ sc->divide_cnt = divide_cnt;
++ sc->vec_load_pendulum = vec_load_pendulum;
+ }
+ }
+
+@@ -30683,6 +31974,8 @@
+ cached_can_issue_more = sc->cached_can_issue_more;
+ last_scheduled_insn = sc->last_scheduled_insn;
+ load_store_pendulum = sc->load_store_pendulum;
++ divide_cnt = sc->divide_cnt;
++ vec_load_pendulum = sc->vec_load_pendulum;
+ }
+
+ /* Free _SC. */
+@@ -33448,17 +34741,25 @@
+ if (!REG_P (target))
+ tmp = gen_reg_rtx (mode);
+
+- /* Invert the selector with a VNAND if available, else a VNOR.
+- The VNAND is preferred for future fusion opportunities. */
+- notx = gen_rtx_NOT (V16QImode, sel);
+- iorx = (TARGET_P8_VECTOR
+- ? gen_rtx_IOR (V16QImode, notx, notx)
+- : gen_rtx_AND (V16QImode, notx, notx));
+- emit_insn (gen_rtx_SET (norreg, iorx));
++ if (TARGET_P9_VECTOR)
++ {
++ unspec = gen_rtx_UNSPEC (mode, gen_rtvec (3, op0, op1, sel),
++ UNSPEC_VPERMR);
++ }
++ else
++ {
++ /* Invert the selector with a VNAND if available, else a VNOR.
++ The VNAND is preferred for future fusion opportunities. */
++ notx = gen_rtx_NOT (V16QImode, sel);
++ iorx = (TARGET_P8_VECTOR
++ ? gen_rtx_IOR (V16QImode, notx, notx)
++ : gen_rtx_AND (V16QImode, notx, notx));
++ emit_insn (gen_rtx_SET (norreg, iorx));
+
+- /* Permute with operands reversed and adjusted selector. */
+- unspec = gen_rtx_UNSPEC (mode, gen_rtvec (3, op1, op0, norreg),
+- UNSPEC_VPERM);
++ /* Permute with operands reversed and adjusted selector. */
++ unspec = gen_rtx_UNSPEC (mode, gen_rtvec (3, op1, op0, norreg),
++ UNSPEC_VPERM);
++ }
+
+ /* Copy into target, possibly by way of a register. */
+ if (!REG_P (target))
+@@ -33869,8 +35170,14 @@
+ machine_mode inner = GET_MODE_INNER (mode);
+ unsigned int inner_bytes = GET_MODE_UNIT_SIZE (mode);
+
+- if (FLOAT_MODE_P (mode) && TARGET_HARD_FLOAT && TARGET_FPRS)
++ if (TARGET_FLOAT128
++ && (mode == KCmode
++ || (mode == TCmode && TARGET_IEEEQUAD)))
++ regno = ALTIVEC_ARG_RETURN;
++
++ else if (FLOAT_MODE_P (mode) && TARGET_HARD_FLOAT && TARGET_FPRS)
+ regno = FP_ARG_RETURN;
++
+ else
+ {
+ regno = GP_ARG_RETURN;
+@@ -33992,7 +35299,8 @@
+ if (DECIMAL_FLOAT_MODE_P (mode) && TARGET_HARD_FLOAT && TARGET_FPRS)
+ /* _Decimal128 must use an even/odd register pair. */
+ regno = (mode == TDmode) ? FP_ARG_RETURN + 1 : FP_ARG_RETURN;
+- else if (SCALAR_FLOAT_MODE_NOT_VECTOR_P (mode) && TARGET_HARD_FLOAT && TARGET_FPRS
++ else if (SCALAR_FLOAT_TYPE_P (valtype) && TARGET_HARD_FLOAT && TARGET_FPRS
++ && !FLOAT128_VECTOR_P (mode)
+ && ((TARGET_SINGLE_FLOAT && (mode == SFmode)) || TARGET_DOUBLE_FLOAT))
+ regno = FP_ARG_RETURN;
+ else if (TREE_CODE (valtype) == COMPLEX_TYPE
+@@ -34056,7 +35364,7 @@
+ static bool
+ rs6000_lra_p (void)
+ {
+- return rs6000_lra_flag;
++ return TARGET_LRA;
+ }
+
+ /* Given FROM and TO register numbers, say whether this elimination is allowed.
+@@ -34417,9 +35725,11 @@
+ { "power8-fusion", OPTION_MASK_P8_FUSION, false, true },
+ { "power8-fusion-sign", OPTION_MASK_P8_FUSION_SIGN, false, true },
+ { "power8-vector", OPTION_MASK_P8_VECTOR, false, true },
+- { "power9-dform", OPTION_MASK_P9_DFORM, false, true },
++ { "power9-dform-scalar", OPTION_MASK_P9_DFORM_SCALAR, false, true },
++ { "power9-dform-vector", OPTION_MASK_P9_DFORM_VECTOR, false, true },
+ { "power9-fusion", OPTION_MASK_P9_FUSION, false, true },
+ { "power9-minmax", OPTION_MASK_P9_MINMAX, false, true },
++ { "power9-misc", OPTION_MASK_P9_MISC, false, true },
+ { "power9-vector", OPTION_MASK_P9_VECTOR, false, true },
+ { "powerpc-gfxopt", OPTION_MASK_PPC_GFXOPT, false, true },
+ { "powerpc-gpopt", OPTION_MASK_PPC_GPOPT, false, true },
+@@ -34474,11 +35784,14 @@
+ { "popcntd", RS6000_BTM_POPCNTD, false, false },
+ { "cell", RS6000_BTM_CELL, false, false },
+ { "power8-vector", RS6000_BTM_P8_VECTOR, false, false },
++ { "power9-vector", RS6000_BTM_P9_VECTOR, false, false },
++ { "power9-misc", RS6000_BTM_P9_MISC, false, false },
+ { "crypto", RS6000_BTM_CRYPTO, false, false },
+ { "htm", RS6000_BTM_HTM, false, false },
+ { "hard-dfp", RS6000_BTM_DFP, false, false },
+ { "hard-float", RS6000_BTM_HARD_FLOAT, false, false },
+ { "long-double-128", RS6000_BTM_LDBL128, false, false },
++ { "float128", RS6000_BTM_FLOAT128, false, false },
+ };
+
+ /* Option variables that we want to support inside attribute((target)) and
+@@ -35049,7 +36362,9 @@
+ size_t i;
+ size_t start_column = 0;
+ size_t cur_column;
+- size_t max_column = 76;
++ size_t max_column = 120;
++ size_t prefix_len = strlen (prefix);
++ size_t comma_len = 0;
+ const char *comma = "";
+
+ if (indent)
+@@ -35067,27 +36382,45 @@
+ cur_column = start_column;
+ for (i = 0; i < num_elements; i++)
+ {
+- if ((flags & opts[i].mask) != 0)
++ bool invert = opts[i].invert;
++ const char *name = opts[i].name;
++ const char *no_str = "";
++ HOST_WIDE_INT mask = opts[i].mask;
++ size_t len = comma_len + prefix_len + strlen (name);
++
++ if (!invert)
+ {
+- const char *no_str = rs6000_opt_masks[i].invert ? "no-" : "";
+- size_t len = (strlen (comma)
+- + strlen (prefix)
+- + strlen (no_str)
+- + strlen (rs6000_opt_masks[i].name));
++ if ((flags & mask) == 0)
++ {
++ no_str = "no-";
++ len += sizeof ("no-") - 1;
++ }
++
++ flags &= ~mask;
++ }
+
+- cur_column += len;
+- if (cur_column > max_column)
++ else
++ {
++ if ((flags & mask) != 0)
+ {
+- fprintf (stderr, ", \\\n%*s", (int)start_column, "");
+- cur_column = start_column + len;
+- comma = "";
++ no_str = "no-";
++ len += sizeof ("no-") - 1;
+ }
+
+- fprintf (file, "%s%s%s%s", comma, prefix, no_str,
+- rs6000_opt_masks[i].name);
+- flags &= ~ opts[i].mask;
+- comma = ", ";
++ flags |= mask;
++ }
++
++ cur_column += len;
++ if (cur_column > max_column)
++ {
++ fprintf (stderr, ", \\\n%*s", (int)start_column, "");
++ cur_column = start_column + len;
++ comma = "";
+ }
++
++ fprintf (file, "%s%s%s%s", comma, prefix, no_str, name);
++ comma = ", ";
++ comma_len = sizeof (", ") - 1;
+ }
+
+ fputs ("\n", file);
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/config/rs6000/rs6000.h gcc-6-20160721/gcc/config/rs6000/rs6000.h
+--- gcc-6.1.0/gcc/config/rs6000/rs6000.h 2016-01-20 20:30:24.000000000 +0000
++++ gcc-6-20160721/gcc/config/rs6000/rs6000.h 2016-07-07 19:42:07.000000000 +0000
+@@ -302,6 +302,28 @@
+ #define TARGET_P8_VECTOR 0
+ #endif
+
++/* Define the ISA 3.0 flags as 0 if the target assembler does not support
++ Power9 instructions. Allow -mpower9-fusion, since it does not add new
++ instructions. Allow -misel, since it predates ISA 3.0 and does
++ not require any Power9 features. */
++
++#ifndef HAVE_AS_POWER9
++#undef TARGET_FLOAT128_HW
++#undef TARGET_MODULO
++#undef TARGET_P9_VECTOR
++#undef TARGET_P9_MINMAX
++#undef TARGET_P9_DFORM_SCALAR
++#undef TARGET_P9_DFORM_VECTOR
++#undef TARGET_P9_MISC
++#define TARGET_FLOAT128_HW 0
++#define TARGET_MODULO 0
++#define TARGET_P9_VECTOR 0
++#define TARGET_P9_MINMAX 0
++#define TARGET_P9_DFORM_SCALAR 0
++#define TARGET_P9_DFORM_VECTOR 0
++#define TARGET_P9_MISC 0
++#endif
++
+ /* Define TARGET_LWSYNC_INSTRUCTION if the assembler knows about lwsync. If
+ not, generate the lwsync code as an integer constant. */
+ #ifdef HAVE_AS_LWSYNC
+@@ -418,12 +440,12 @@
+ Similarly IFmode is the IBM long double format even if the default is IEEE
+ 128-bit. */
+ #define FLOAT128_IEEE_P(MODE) \
+- (((MODE) == TFmode && TARGET_IEEEQUAD) \
+- || ((MODE) == KFmode))
++ ((TARGET_IEEEQUAD && ((MODE) == TFmode || (MODE) == TCmode)) \
++ || ((MODE) == KFmode) || ((MODE) == KCmode))
+
+ #define FLOAT128_IBM_P(MODE) \
+- (((MODE) == TFmode && !TARGET_IEEEQUAD) \
+- || ((MODE) == IFmode))
++ ((!TARGET_IEEEQUAD && ((MODE) == TFmode || (MODE) == TCmode)) \
++ || ((MODE) == IFmode) || ((MODE) == ICmode))
+
+ /* Helper macros to say whether a 128-bit floating point type can go in a
+ single vector register, or whether it needs paired scalar values. */
+@@ -594,6 +616,15 @@
+ in the register. */
+ #define TARGET_NO_SDMODE_STACK (TARGET_LFIWZX && TARGET_STFIWX && TARGET_DFP)
+
++/* ISA 3.0 has new min/max functions that don't need fast math that are being
++ phased in. Min/max using FSEL or XSMAXDP/XSMINDP do not return the correct
++ answers if the arguments are not in the normal range. */
++#define TARGET_MINMAX_SF (TARGET_SF_FPR && TARGET_PPC_GFXOPT \
++ && (TARGET_P9_MINMAX || !flag_trapping_math))
++
++#define TARGET_MINMAX_DF (TARGET_DF_FPR && TARGET_PPC_GFXOPT \
++ && (TARGET_P9_MINMAX || !flag_trapping_math))
++
+ /* In switching from using target_flags to using rs6000_isa_flags, the options
+ machinery creates OPTION_MASK_<xxx> instead of MASK_<xxx>. For now map
+ OPTION_MASK_<xxx> back into MASK_<xxx>. */
+@@ -615,6 +646,8 @@
+ #define MASK_MULTIPLE OPTION_MASK_MULTIPLE
+ #define MASK_NO_UPDATE OPTION_MASK_NO_UPDATE
+ #define MASK_P8_VECTOR OPTION_MASK_P8_VECTOR
++#define MASK_P9_VECTOR OPTION_MASK_P9_VECTOR
++#define MASK_P9_MISC OPTION_MASK_P9_MISC
+ #define MASK_POPCNTB OPTION_MASK_POPCNTB
+ #define MASK_POPCNTD OPTION_MASK_POPCNTD
+ #define MASK_PPC_GFXOPT OPTION_MASK_PPC_GFXOPT
+@@ -655,6 +688,11 @@
+ #define MASK_PROTOTYPE OPTION_MASK_PROTOTYPE
+ #endif
+
++#ifdef TARGET_MODULO
++#define RS6000_BTM_MODULO OPTION_MASK_MODULO
++#endif
++
++
+ /* For power systems, we want to enable Altivec and VSX builtins even if the
+ user did not use -maltivec or -mvsx to allow the builtins to be used inside
+ of #pragma GCC target or the target attribute to change the code level for a
+@@ -1774,7 +1812,9 @@
+ #define ALTIVEC_ARG_RETURN (FIRST_ALTIVEC_REGNO + 2)
+ #define FP_ARG_MAX_RETURN (DEFAULT_ABI != ABI_ELFv2 ? FP_ARG_RETURN \
+ : (FP_ARG_RETURN + AGGR_ARG_NUM_REG - 1))
+-#define ALTIVEC_ARG_MAX_RETURN (DEFAULT_ABI != ABI_ELFv2 ? ALTIVEC_ARG_RETURN \
++#define ALTIVEC_ARG_MAX_RETURN (DEFAULT_ABI != ABI_ELFv2 \
++ ? (ALTIVEC_ARG_RETURN \
++ + (TARGET_FLOAT128 ? 1 : 0)) \
+ : (ALTIVEC_ARG_RETURN + AGGR_ARG_NUM_REG - 1))
+
+ /* Flags for the call/call_value rtl operations set up by function_arg */
+@@ -2638,7 +2678,9 @@
+
+ #define RS6000_BTC_MISC 0x00000000 /* No special attributes. */
+ #define RS6000_BTC_CONST 0x00000100 /* uses no global state. */
+-#define RS6000_BTC_PURE 0x00000200 /* reads global state/mem. */
++#define RS6000_BTC_PURE 0x00000200 /* reads global
++ state/mem and does
++ not modify global state. */
+ #define RS6000_BTC_FP 0x00000400 /* depends on rounding mode. */
+ #define RS6000_BTC_ATTR_MASK 0x00000700 /* Mask of the attributes. */
+
+@@ -2660,6 +2702,8 @@
+ #define RS6000_BTM_ALTIVEC MASK_ALTIVEC /* VMX/altivec vectors. */
+ #define RS6000_BTM_VSX MASK_VSX /* VSX (vector/scalar). */
+ #define RS6000_BTM_P8_VECTOR MASK_P8_VECTOR /* ISA 2.07 vector. */
++#define RS6000_BTM_P9_VECTOR MASK_P9_VECTOR /* ISA 3.00 vector. */
++#define RS6000_BTM_P9_MISC MASK_P9_MISC /* ISA 3.0 misc. non-vector. */
+ #define RS6000_BTM_CRYPTO MASK_CRYPTO /* crypto funcs. */
+ #define RS6000_BTM_HTM MASK_HTM /* hardware TM funcs. */
+ #define RS6000_BTM_SPE MASK_STRING /* E500 */
+@@ -2673,10 +2717,15 @@
+ #define RS6000_BTM_DFP MASK_DFP /* Decimal floating point. */
+ #define RS6000_BTM_HARD_FLOAT MASK_SOFT_FLOAT /* Hardware floating point. */
+ #define RS6000_BTM_LDBL128 MASK_MULTIPLE /* 128-bit long double. */
++#define RS6000_BTM_64BIT MASK_64BIT /* 64-bit addressing. */
++#define RS6000_BTM_FLOAT128 MASK_P9_VECTOR /* IEEE 128-bit float. */
+
+ #define RS6000_BTM_COMMON (RS6000_BTM_ALTIVEC \
+ | RS6000_BTM_VSX \
+ | RS6000_BTM_P8_VECTOR \
++ | RS6000_BTM_P9_VECTOR \
++ | RS6000_BTM_P9_MISC \
++ | RS6000_BTM_MODULO \
+ | RS6000_BTM_CRYPTO \
+ | RS6000_BTM_FRE \
+ | RS6000_BTM_FRES \
+@@ -2687,10 +2736,12 @@
+ | RS6000_BTM_CELL \
+ | RS6000_BTM_DFP \
+ | RS6000_BTM_HARD_FLOAT \
+- | RS6000_BTM_LDBL128)
++ | RS6000_BTM_LDBL128 \
++ | RS6000_BTM_FLOAT128)
+
+ /* Define builtin enum index. */
+
++#undef RS6000_BUILTIN_0
+ #undef RS6000_BUILTIN_1
+ #undef RS6000_BUILTIN_2
+ #undef RS6000_BUILTIN_3
+@@ -2703,6 +2754,7 @@
+ #undef RS6000_BUILTIN_S
+ #undef RS6000_BUILTIN_X
+
++#define RS6000_BUILTIN_0(ENUM, NAME, MASK, ATTR, ICODE) ENUM,
+ #define RS6000_BUILTIN_1(ENUM, NAME, MASK, ATTR, ICODE) ENUM,
+ #define RS6000_BUILTIN_2(ENUM, NAME, MASK, ATTR, ICODE) ENUM,
+ #define RS6000_BUILTIN_3(ENUM, NAME, MASK, ATTR, ICODE) ENUM,
+@@ -2722,6 +2774,7 @@
+ RS6000_BUILTIN_COUNT
+ };
+
++#undef RS6000_BUILTIN_0
+ #undef RS6000_BUILTIN_1
+ #undef RS6000_BUILTIN_2
+ #undef RS6000_BUILTIN_3
+@@ -2788,6 +2841,7 @@
+ RS6000_BTI_void, /* void_type_node */
+ RS6000_BTI_ieee128_float, /* ieee 128-bit floating point */
+ RS6000_BTI_ibm128_float, /* IBM 128-bit floating point */
++ RS6000_BTI_const_str, /* pointer to const char * */
+ RS6000_BTI_MAX
+ };
+
+@@ -2844,6 +2898,7 @@
+ #define void_type_internal_node (rs6000_builtin_types[RS6000_BTI_void])
+ #define ieee128_float_type_node (rs6000_builtin_types[RS6000_BTI_ieee128_float])
+ #define ibm128_float_type_node (rs6000_builtin_types[RS6000_BTI_ibm128_float])
++#define const_str_type_node (rs6000_builtin_types[RS6000_BTI_const_str])
+
+ extern GTY(()) tree rs6000_builtin_types[RS6000_BTI_MAX];
+ extern GTY(()) tree rs6000_builtin_decls[RS6000_BUILTIN_COUNT];
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/config/rs6000/rs6000.md gcc-6-20160721/gcc/config/rs6000/rs6000.md
+--- gcc-6.1.0/gcc/config/rs6000/rs6000.md 2016-04-12 19:25:56.000000000 +0000
++++ gcc-6-20160721/gcc/config/rs6000/rs6000.md 2016-07-15 04:47:30.000000000 +0000
+@@ -147,6 +147,8 @@
+ UNSPEC_ROUND_TO_ODD
+ UNSPEC_IEEE128_MOVE
+ UNSPEC_IEEE128_CONVERT
++ UNSPEC_SIGNBIT
++ UNSPEC_DOLOOP
+ ])
+
+ ;;
+@@ -183,12 +185,13 @@
+ brinc,
+ vecsimple,veccomplex,vecdiv,veccmp,veccmpsimple,vecperm,
+ vecfloat,vecfdiv,vecdouble,mffgpr,mftgpr,crypto,
+- htm"
++ veclogical,veccmpfx,vecexts,vecmove,
++ htm,htmsimple,dfp"
+ (const_string "integer"))
+
+ ;; What data size does this instruction work on?
+-;; This is used for insert, mul.
+-(define_attr "size" "8,16,32,64" (const_string "32"))
++;; This is used for insert, mul and others as necessary.
++(define_attr "size" "8,16,32,64,128" (const_string "32"))
+
+ ;; Is this instruction record form ("dot", signed compare to 0, writing CR0)?
+ ;; This is used for add, logical, shift, exts, mul.
+@@ -298,6 +301,7 @@
+ (include "power6.md")
+ (include "power7.md")
+ (include "power8.md")
++(include "power9.md")
+ (include "cell.md")
+ (include "xfpu.md")
+ (include "a2.md")
+@@ -489,6 +493,10 @@
+ ; Iterator for just SF/DF
+ (define_mode_iterator SFDF [SF DF])
+
++; Like SFDF, but a different name to match conditional move where the
++; comparison operands may be a different mode than the input operands.
++(define_mode_iterator SFDF2 [SF DF])
++
+ ; Iterator for 128-bit floating point that uses the IBM double-double format
+ (define_mode_iterator IBM128 [(IF "FLOAT128_IBM_P (IFmode)")
+ (TF "FLOAT128_IBM_P (TFmode)")])
+@@ -502,6 +510,13 @@
+ (IF "TARGET_FLOAT128")
+ (TF "TARGET_LONG_DOUBLE_128")])
+
++; Iterator for signbit on 64-bit machines with direct move
++(define_mode_iterator SIGNBIT [(KF "FLOAT128_VECTOR_P (KFmode)")
++ (TF "FLOAT128_VECTOR_P (TFmode)")])
++
++(define_mode_attr Fsignbit [(KF "wa")
++ (TF "wa")])
++
+ ; SF/DF suffix for traditional floating instructions
+ (define_mode_attr Ftrad [(SF "s") (DF "")])
+
+@@ -577,7 +592,9 @@
+ (V16QI "b")
+ (V8HI "h")
+ (V4SI "w")
+- (V2DI "d")])
++ (V2DI "d")
++ (V1TI "q")
++ (TI "q")])
+
+ ;; How many bits in this mode?
+ (define_mode_attr bits [(QI "8") (HI "16") (SI "32") (DI "64")])
+@@ -698,6 +715,15 @@
+ (define_mode_iterator RELOAD [V16QI V8HI V4SI V2DI V4SF V2DF V1TI
+ SF SD SI DF DD DI TI PTI KF IF TF])
+
++;; Iterate over smin, smax
++(define_code_iterator fp_minmax [smin smax])
++
++(define_code_attr minmax [(smin "min")
++ (smax "max")])
++
++(define_code_attr SMINMAX [(smin "SMIN")
++ (smax "SMAX")])
++
+
+ ;; Start with fixed-point load and store insns. Here we put only the more
+ ;; complex forms. Basic data transfer is done later.
+@@ -4044,7 +4070,7 @@
+
+ if (REGNO (cr) == CR0_REGNO)
+ {
+- emit_insn (gen_ashdi3_extswsli_dot (dest, src2, shift, cr));
++ emit_insn (gen_ashdi3_extswsli_dot2 (dest, src2, shift, cr));
+ DONE;
+ }
+
+@@ -4305,7 +4331,7 @@
+ "@
+ fabs %0,%1
+ xsabsdp %x0,%x1"
+- [(set_attr "type" "fp")
++ [(set_attr "type" "fpsimple")
+ (set_attr "fp_type" "fp_addsub_<Fs>")])
+
+ (define_insn "*nabs<mode>2_fpr"
+@@ -4317,7 +4343,7 @@
+ "@
+ fnabs %0,%1
+ xsnabsdp %x0,%x1"
+- [(set_attr "type" "fp")
++ [(set_attr "type" "fpsimple")
+ (set_attr "fp_type" "fp_addsub_<Fs>")])
+
+ (define_expand "neg<mode>2"
+@@ -4333,7 +4359,7 @@
+ "@
+ fneg %0,%1
+ xsnegdp %x0,%x1"
+- [(set_attr "type" "fp")
++ [(set_attr "type" "fpsimple")
+ (set_attr "fp_type" "fp_addsub_<Fs>")])
+
+ (define_expand "add<mode>3"
+@@ -4494,7 +4520,7 @@
+ emit_note (NOTE_INSN_DELETED);
+ DONE;
+ }
+- [(set_attr "type" "fp,fp,fpload,fp,fp,fpload,fpload")])
++ [(set_attr "type" "fp,fpsimple,fpload,fp,fpsimple,fpload,fpload")])
+
+ (define_expand "truncdfsf2"
+ [(set (match_operand:SF 0 "gpc_reg_operand" "")
+@@ -4516,7 +4542,7 @@
+ ;; when little-endian.
+ (define_expand "signbit<mode>2"
+ [(set (match_dup 2)
+- (float_truncate:DF (match_operand:IBM128 1 "gpc_reg_operand" "")))
++ (float_truncate:DF (match_operand:FLOAT128 1 "gpc_reg_operand" "")))
+ (set (match_dup 3)
+ (subreg:DI (match_dup 2) 0))
+ (set (match_dup 4)
+@@ -4524,8 +4550,20 @@
+ (set (match_operand:SI 0 "gpc_reg_operand" "")
+ (match_dup 6))]
+ "TARGET_HARD_FLOAT
+- && (TARGET_FPRS || TARGET_E500_DOUBLE)"
++ && (TARGET_FPRS || TARGET_E500_DOUBLE)
++ && (!FLOAT128_IEEE_P (<MODE>mode)
++ || (TARGET_POWERPC64 && TARGET_DIRECT_MOVE))"
+ {
++ if (FLOAT128_IEEE_P (<MODE>mode))
++ {
++ if (<MODE>mode == KFmode)
++ emit_insn (gen_signbitkf2_dm (operands[0], operands[1]));
++ else if (<MODE>mode == TFmode)
++ emit_insn (gen_signbittf2_dm (operands[0], operands[1]));
++ else
++ gcc_unreachable ();
++ DONE;
++ }
+ operands[2] = gen_reg_rtx (DFmode);
+ operands[3] = gen_reg_rtx (DImode);
+ if (TARGET_POWERPC64)
+@@ -4573,6 +4611,37 @@
+ operands[5] = CONST0_RTX (<MODE>mode);
+ })
+
++;; Optimize signbit on 64-bit systems with direct move to avoid doing the store
++;; and load.
++(define_insn_and_split "signbit<mode>2_dm"
++ [(set (match_operand:SI 0 "gpc_reg_operand" "=r,r,r")
++ (unspec:SI
++ [(match_operand:SIGNBIT 1 "input_operand" "<Fsignbit>,m,r")]
++ UNSPEC_SIGNBIT))]
++ "TARGET_POWERPC64 && TARGET_DIRECT_MOVE"
++ "#"
++ "&& reload_completed"
++ [(const_int 0)]
++{
++ rs6000_split_signbit (operands[0], operands[1]);
++ DONE;
++}
++ [(set_attr "length" "8,8,12")
++ (set_attr "type" "mftgpr,load,integer")])
++
++;; MODES_TIEABLE_P doesn't allow DImode to be tied with the various floating
++;; point types, which makes normal SUBREG's problematical. Instead use a
++;; special pattern to avoid using a normal movdi.
++(define_insn "signbit<mode>2_dm2"
++ [(set (match_operand:DI 0 "gpc_reg_operand" "=r")
++ (unspec:DI [(match_operand:SIGNBIT 1 "gpc_reg_operand" "<Fsignbit>")
++ (const_int 0)]
++ UNSPEC_SIGNBIT))]
++ "TARGET_POWERPC64 && TARGET_DIRECT_MOVE"
++ "mfvsrd %0,%x1"
++ [(set_attr "type" "mftgpr")])
++
++
+ ;; Use an unspec rather providing an if-then-else in RTL, to prevent the
+ ;; compiler from optimizing -0.0
+ (define_insn "copysign<mode>3_fcpsgn"
+@@ -4584,7 +4653,7 @@
+ "@
+ fcpsgn %0,%2,%1
+ xscpsgndp %x0,%x2,%x1"
+- [(set_attr "type" "fp")])
++ [(set_attr "type" "fpsimple")])
+
+ ;; For MIN, MAX, and conditional move, we use DEFINE_EXPAND's that involve a
+ ;; fsel instruction and some auxiliary computations. Then we just have a
+@@ -4599,74 +4668,45 @@
+ ;; On VSX, we only check for TARGET_VSX instead of checking for a vsx/p8 vector
+ ;; to allow either DF/SF to use only traditional registers.
+
+-(define_expand "smax<mode>3"
++(define_expand "s<minmax><mode>3"
+ [(set (match_operand:SFDF 0 "gpc_reg_operand" "")
+- (if_then_else:SFDF (ge (match_operand:SFDF 1 "gpc_reg_operand" "")
+- (match_operand:SFDF 2 "gpc_reg_operand" ""))
+- (match_dup 1)
+- (match_dup 2)))]
+- "TARGET_<MODE>_FPR && TARGET_PPC_GFXOPT && !flag_trapping_math"
++ (fp_minmax:SFDF (match_operand:SFDF 1 "gpc_reg_operand" "")
++ (match_operand:SFDF 2 "gpc_reg_operand" "")))]
++ "TARGET_MINMAX_<MODE>"
+ {
+- rs6000_emit_minmax (operands[0], SMAX, operands[1], operands[2]);
++ rs6000_emit_minmax (operands[0], <SMINMAX>, operands[1], operands[2]);
+ DONE;
+ })
+
+-(define_insn "*smax<mode>3_vsx"
+- [(set (match_operand:SFDF 0 "gpc_reg_operand" "=<Ff>,<Fv>")
+- (smax:SFDF (match_operand:SFDF 1 "gpc_reg_operand" "%<Ff>,<Fv>")
+- (match_operand:SFDF 2 "gpc_reg_operand" "<Ff>,<Fv>")))]
+- "TARGET_<MODE>_FPR && TARGET_VSX"
+- "xsmaxdp %x0,%x1,%x2"
+- [(set_attr "type" "fp")])
+-
+-(define_expand "smin<mode>3"
+- [(set (match_operand:SFDF 0 "gpc_reg_operand" "")
+- (if_then_else:SFDF (ge (match_operand:SFDF 1 "gpc_reg_operand" "")
+- (match_operand:SFDF 2 "gpc_reg_operand" ""))
+- (match_dup 2)
+- (match_dup 1)))]
+- "TARGET_<MODE>_FPR && TARGET_PPC_GFXOPT && !flag_trapping_math"
++(define_insn "*s<minmax><mode>3_vsx"
++ [(set (match_operand:SFDF 0 "vsx_register_operand" "=<Fv>")
++ (fp_minmax:SFDF (match_operand:SFDF 1 "vsx_register_operand" "<Fv>")
++ (match_operand:SFDF 2 "vsx_register_operand" "<Fv>")))]
++ "TARGET_VSX && TARGET_<MODE>_FPR"
+ {
+- rs6000_emit_minmax (operands[0], SMIN, operands[1], operands[2]);
+- DONE;
+-})
+-
+-(define_insn "*smin<mode>3_vsx"
+- [(set (match_operand:SFDF 0 "gpc_reg_operand" "=<Ff>,<Fv>")
+- (smin:SFDF (match_operand:SFDF 1 "gpc_reg_operand" "%<Ff>,<Fv>")
+- (match_operand:SFDF 2 "gpc_reg_operand" "<Ff>,<Fv>")))]
+- "TARGET_<MODE>_FPR && TARGET_VSX"
+- "xsmindp %x0,%x1,%x2"
++ return (TARGET_P9_MINMAX
++ ? "xs<minmax>cdp %x0,%x1,%x2"
++ : "xs<minmax>dp %x0,%x1,%x2");
++}
+ [(set_attr "type" "fp")])
+
+-(define_split
++;; The conditional move instructions allow us to perform max and min operations
++;; even when we don't have the appropriate max/min instruction using the FSEL
++;; instruction.
++
++(define_insn_and_split "*s<minmax><mode>3_fpr"
+ [(set (match_operand:SFDF 0 "gpc_reg_operand" "")
+- (match_operator:SFDF 3 "min_max_operator"
+- [(match_operand:SFDF 1 "gpc_reg_operand" "")
+- (match_operand:SFDF 2 "gpc_reg_operand" "")]))]
+- "TARGET_<MODE>_FPR && TARGET_PPC_GFXOPT && !flag_trapping_math
+- && !TARGET_VSX"
++ (fp_minmax:SFDF (match_operand:SFDF 1 "gpc_reg_operand" "")
++ (match_operand:SFDF 2 "gpc_reg_operand" "")))]
++ "!TARGET_VSX && TARGET_MINMAX_<MODE>"
++ "#"
++ "&& 1"
+ [(const_int 0)]
+ {
+- rs6000_emit_minmax (operands[0], GET_CODE (operands[3]), operands[1],
+- operands[2]);
++ rs6000_emit_minmax (operands[0], <SMINMAX>, operands[1], operands[2]);
+ DONE;
+ })
+
+-(define_split
+- [(set (match_operand:SF 0 "gpc_reg_operand" "")
+- (match_operator:SF 3 "min_max_operator"
+- [(match_operand:SF 1 "gpc_reg_operand" "")
+- (match_operand:SF 2 "gpc_reg_operand" "")]))]
+- "TARGET_PPC_GFXOPT && TARGET_HARD_FLOAT && TARGET_FPRS
+- && TARGET_SINGLE_FLOAT && !flag_trapping_math"
+- [(const_int 0)]
+- "
+-{ rs6000_emit_minmax (operands[0], GET_CODE (operands[3]),
+- operands[1], operands[2]);
+- DONE;
+-}")
+-
+ (define_expand "mov<mode>cc"
+ [(set (match_operand:GPR 0 "gpc_reg_operand" "")
+ (if_then_else:GPR (match_operand 1 "comparison_operator" "")
+@@ -4749,12 +4789,13 @@
+ [(set_attr "type" "isel")
+ (set_attr "length" "4")])
+
+-(define_expand "movsfcc"
+- [(set (match_operand:SF 0 "gpc_reg_operand" "")
+- (if_then_else:SF (match_operand 1 "comparison_operator" "")
+- (match_operand:SF 2 "gpc_reg_operand" "")
+- (match_operand:SF 3 "gpc_reg_operand" "")))]
+- "TARGET_PPC_GFXOPT && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_SINGLE_FLOAT"
++;; Floating point conditional move
++(define_expand "mov<mode>cc"
++ [(set (match_operand:SFDF 0 "gpc_reg_operand" "")
++ (if_then_else:SFDF (match_operand 1 "comparison_operator" "")
++ (match_operand:SFDF 2 "gpc_reg_operand" "")
++ (match_operand:SFDF 3 "gpc_reg_operand" "")))]
++ "TARGET_<MODE>_FPR && TARGET_PPC_GFXOPT"
+ "
+ {
+ if (rs6000_emit_cmove (operands[0], operands[1], operands[2], operands[3]))
+@@ -4763,76 +4804,70 @@
+ FAIL;
+ }")
+
+-(define_insn "*fselsfsf4"
+- [(set (match_operand:SF 0 "gpc_reg_operand" "=f")
+- (if_then_else:SF (ge (match_operand:SF 1 "gpc_reg_operand" "f")
+- (match_operand:SF 4 "zero_fp_constant" "F"))
+- (match_operand:SF 2 "gpc_reg_operand" "f")
+- (match_operand:SF 3 "gpc_reg_operand" "f")))]
+- "TARGET_PPC_GFXOPT && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_SINGLE_FLOAT"
+- "fsel %0,%1,%2,%3"
+- [(set_attr "type" "fp")])
+-
+-(define_insn "*fseldfsf4"
+- [(set (match_operand:SF 0 "gpc_reg_operand" "=f")
+- (if_then_else:SF (ge (match_operand:DF 1 "gpc_reg_operand" "d")
+- (match_operand:DF 4 "zero_fp_constant" "F"))
+- (match_operand:SF 2 "gpc_reg_operand" "f")
+- (match_operand:SF 3 "gpc_reg_operand" "f")))]
+- "TARGET_PPC_GFXOPT && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT && TARGET_SINGLE_FLOAT"
++(define_insn "*fsel<SFDF:mode><SFDF2:mode>4"
++ [(set (match_operand:SFDF 0 "fpr_reg_operand" "=&<SFDF:rreg2>")
++ (if_then_else:SFDF
++ (ge (match_operand:SFDF2 1 "fpr_reg_operand" "<SFDF2:rreg2>")
++ (match_operand:SFDF2 4 "zero_fp_constant" "F"))
++ (match_operand:SFDF 2 "fpr_reg_operand" "<SFDF:rreg2>")
++ (match_operand:SFDF 3 "fpr_reg_operand" "<SFDF:rreg2>")))]
++ "TARGET_<MODE>_FPR && TARGET_PPC_GFXOPT"
+ "fsel %0,%1,%2,%3"
+ [(set_attr "type" "fp")])
+
+-;; The conditional move instructions allow us to perform max and min
+-;; operations even when
+-
+-(define_split
+- [(set (match_operand:DF 0 "gpc_reg_operand" "")
+- (match_operator:DF 3 "min_max_operator"
+- [(match_operand:DF 1 "gpc_reg_operand" "")
+- (match_operand:DF 2 "gpc_reg_operand" "")]))]
+- "TARGET_PPC_GFXOPT && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT
+- && !flag_trapping_math"
+- [(const_int 0)]
+- "
+-{ rs6000_emit_minmax (operands[0], GET_CODE (operands[3]),
+- operands[1], operands[2]);
+- DONE;
+-}")
+-
+-(define_expand "movdfcc"
+- [(set (match_operand:DF 0 "gpc_reg_operand" "")
+- (if_then_else:DF (match_operand 1 "comparison_operator" "")
+- (match_operand:DF 2 "gpc_reg_operand" "")
+- (match_operand:DF 3 "gpc_reg_operand" "")))]
+- "TARGET_PPC_GFXOPT && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT"
+- "
+-{
+- if (rs6000_emit_cmove (operands[0], operands[1], operands[2], operands[3]))
+- DONE;
+- else
+- FAIL;
+-}")
++(define_insn_and_split "*mov<SFDF:mode><SFDF2:mode>cc_p9"
++ [(set (match_operand:SFDF 0 "vsx_register_operand" "=&<SFDF:Fv>,<SFDF:Fv>")
++ (if_then_else:SFDF
++ (match_operator:CCFP 1 "fpmask_comparison_operator"
++ [(match_operand:SFDF2 2 "vsx_register_operand" "<SFDF2:Fv>,<SFDF2:Fv>")
++ (match_operand:SFDF2 3 "vsx_register_operand" "<SFDF2:Fv>,<SFDF2:Fv>")])
++ (match_operand:SFDF 4 "vsx_register_operand" "<SFDF:Fv>,<SFDF:Fv>")
++ (match_operand:SFDF 5 "vsx_register_operand" "<SFDF:Fv>,<SFDF:Fv>")))
++ (clobber (match_scratch:V2DI 6 "=0,&wa"))]
++ "TARGET_P9_MINMAX"
++ "#"
++ ""
++ [(set (match_dup 6)
++ (if_then_else:V2DI (match_dup 1)
++ (match_dup 7)
++ (match_dup 8)))
++ (set (match_dup 0)
++ (if_then_else:SFDF (ne (match_dup 6)
++ (match_dup 8))
++ (match_dup 4)
++ (match_dup 5)))]
++{
++ if (GET_CODE (operands[6]) == SCRATCH)
++ operands[6] = gen_reg_rtx (V2DImode);
++
++ operands[7] = CONSTM1_RTX (V2DImode);
++ operands[8] = CONST0_RTX (V2DImode);
++}
++ [(set_attr "length" "8")
++ (set_attr "type" "vecperm")])
++
++(define_insn "*fpmask<mode>"
++ [(set (match_operand:V2DI 0 "vsx_register_operand" "=wa")
++ (if_then_else:V2DI
++ (match_operator:CCFP 1 "fpmask_comparison_operator"
++ [(match_operand:SFDF 2 "vsx_register_operand" "<Fv>")
++ (match_operand:SFDF 3 "vsx_register_operand" "<Fv>")])
++ (match_operand:V2DI 4 "all_ones_constant" "")
++ (match_operand:V2DI 5 "zero_constant" "")))]
++ "TARGET_P9_MINMAX"
++ "xscmp%V1dp %x0,%x2,%x3"
++ [(set_attr "type" "fpcompare")])
+
+-(define_insn "*fseldfdf4"
+- [(set (match_operand:DF 0 "gpc_reg_operand" "=d")
+- (if_then_else:DF (ge (match_operand:DF 1 "gpc_reg_operand" "d")
+- (match_operand:DF 4 "zero_fp_constant" "F"))
+- (match_operand:DF 2 "gpc_reg_operand" "d")
+- (match_operand:DF 3 "gpc_reg_operand" "d")))]
+- "TARGET_PPC_GFXOPT && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT"
+- "fsel %0,%1,%2,%3"
+- [(set_attr "type" "fp")])
++(define_insn "*xxsel<mode>"
++ [(set (match_operand:SFDF 0 "vsx_register_operand" "=<Fv>")
++ (if_then_else:SFDF (ne (match_operand:V2DI 1 "vsx_register_operand" "wa")
++ (match_operand:V2DI 2 "zero_constant" ""))
++ (match_operand:SFDF 3 "vsx_register_operand" "<Fv>")
++ (match_operand:SFDF 4 "vsx_register_operand" "<Fv>")))]
++ "TARGET_P9_MINMAX"
++ "xxsel %x0,%x1,%x3,%x4"
++ [(set_attr "type" "vecmove")])
+
+-(define_insn "*fselsfdf4"
+- [(set (match_operand:DF 0 "gpc_reg_operand" "=d")
+- (if_then_else:DF (ge (match_operand:SF 1 "gpc_reg_operand" "f")
+- (match_operand:SF 4 "zero_fp_constant" "F"))
+- (match_operand:DF 2 "gpc_reg_operand" "d")
+- (match_operand:DF 3 "gpc_reg_operand" "d")))]
+- "TARGET_PPC_GFXOPT && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT && TARGET_SINGLE_FLOAT"
+- "fsel %0,%1,%2,%3"
+- [(set_attr "type" "fp")])
+
+ ;; Conversions to and from floating-point.
+
+@@ -5942,7 +5977,7 @@
+ [(set (attr "type")
+ (if_then_else
+ (match_test "vsx_register_operand (operands[0], <MODE>mode)")
+- (const_string "vecsimple")
++ (const_string "veclogical")
+ (const_string "integer")))
+ (set (attr "length")
+ (if_then_else
+@@ -5978,7 +6013,7 @@
+ [(set (attr "type")
+ (if_then_else
+ (match_test "vsx_register_operand (operands[0], <MODE>mode)")
+- (const_string "vecsimple")
++ (const_string "veclogical")
+ (const_string "integer")))
+ (set (attr "length")
+ (if_then_else
+@@ -6016,7 +6051,7 @@
+ [(set (attr "type")
+ (if_then_else
+ (match_test "vsx_register_operand (operands[0], <MODE>mode)")
+- (const_string "vecsimple")
++ (const_string "veclogical")
+ (const_string "integer")))
+ (set (attr "length")
+ (if_then_else
+@@ -6076,7 +6111,7 @@
+ [(set (attr "type")
+ (if_then_else
+ (match_test "vsx_register_operand (operands[0], <MODE>mode)")
+- (const_string "vecsimple")
++ (const_string "veclogical")
+ (const_string "integer")))
+ (set (attr "length")
+ (if_then_else
+@@ -6134,7 +6169,7 @@
+ [(set (attr "type")
+ (if_then_else
+ (match_test "vsx_register_operand (operands[0], <MODE>mode)")
+- (const_string "vecsimple")
++ (const_string "veclogical")
+ (const_string "integer")))
+ (set (attr "length")
+ (if_then_else
+@@ -6190,7 +6225,7 @@
+ [(set (attr "type")
+ (if_then_else
+ (match_test "vsx_register_operand (operands[0], <MODE>mode)")
+- (const_string "vecsimple")
++ (const_string "veclogical")
+ (const_string "integer")))
+ (set (attr "length")
+ (if_then_else
+@@ -6505,7 +6540,7 @@
+ mt%0 %1
+ mf%1 %0
+ nop"
+- [(set_attr "type" "*,load,store,fp,fp,vecsimple,integer,fpload,fpload,fpstore,fpstore,fpload,fpstore,mffgpr,mftgpr,mtjmpr,mfjmpr,*")
++ [(set_attr "type" "*,load,store,fpsimple,fpsimple,veclogical,integer,fpload,fpload,fpstore,fpstore,fpload,fpstore,mffgpr,mftgpr,mtjmpr,mfjmpr,*")
+ (set_attr "length" "4")])
+
+ (define_insn "*mov<mode>_softfloat"
+@@ -6640,7 +6675,8 @@
+ #
+ #
+ #"
+- [(set_attr "type" "fpstore,fpload,fp,fpload,fpstore,fpload,fpstore,vecsimple,vecsimple,two,store,load,two")
++ [(set_attr "type" "fpstore,fpload,fpsimple,fpload,fpstore,fpload,fpstore,veclogical,veclogical,two,store,load,two")
++ (set_attr "size" "64")
+ (set_attr "length" "4,4,4,4,4,4,4,4,4,8,8,8,8")])
+
+ (define_insn "*mov<mode>_softfloat32"
+@@ -6685,7 +6721,8 @@
+ mffgpr %0,%1
+ mfvsrd %0,%x1
+ mtvsrd %x0,%1"
+- [(set_attr "type" "fpstore,fpload,fp,fpload,fpstore,fpload,fpstore,vecsimple,vecsimple,integer,store,load,*,mtjmpr,mfjmpr,*,mftgpr,mffgpr,mftgpr,mffgpr")
++ [(set_attr "type" "fpstore,fpload,fpsimple,fpload,fpstore,fpload,fpstore,veclogical,veclogical,integer,store,load,*,mtjmpr,mfjmpr,*,mftgpr,mffgpr,mftgpr,mffgpr")
++ (set_attr "size" "64")
+ (set_attr "length" "4")])
+
+ (define_insn "*mov<mode>_softfloat64"
+@@ -6896,7 +6933,7 @@
+ emit_note (NOTE_INSN_DELETED);
+ DONE;
+ }
+- [(set_attr "type" "fp")])
++ [(set_attr "type" "fpsimple")])
+
+ (define_insn "trunc<mode>df2_internal2"
+ [(set (match_operand:DF 0 "gpc_reg_operand" "=d")
+@@ -7129,7 +7166,7 @@
+ else
+ return \"fneg %0,%1\;fneg %L0,%L1\";
+ }"
+- [(set_attr "type" "fp")
++ [(set_attr "type" "fpsimple")
+ (set_attr "length" "8")])
+
+ (define_expand "abs<mode>2"
+@@ -7264,7 +7301,7 @@
+ (use (match_operand:V16QI 2 "register_operand" "v"))]
+ "TARGET_FLOAT128 && !TARGET_FLOAT128_HW"
+ "xxlxor %x0,%x1,%x2"
+- [(set_attr "type" "vecsimple")])
++ [(set_attr "type" "veclogical")])
+
+ ;; IEEE 128-bit absolute value
+ (define_insn_and_split "ieee_128bit_vsx_abs<mode>2"
+@@ -7293,7 +7330,7 @@
+ (use (match_operand:V16QI 2 "register_operand" "v"))]
+ "TARGET_FLOAT128 && !TARGET_FLOAT128_HW"
+ "xxlandc %x0,%x1,%x2"
+- [(set_attr "type" "vecsimple")])
++ [(set_attr "type" "veclogical")])
+
+ ;; IEEE 128-bit negative absolute value
+ (define_insn_and_split "*ieee_128bit_vsx_nabs<mode>2"
+@@ -7326,7 +7363,7 @@
+ (use (match_operand:V16QI 2 "register_operand" "v"))]
+ "TARGET_FLOAT128 && !TARGET_FLOAT128_HW"
+ "xxlor %x0,%x1,%x2"
+- [(set_attr "type" "vecsimple")])
++ [(set_attr "type" "veclogical")])
+
+ ;; Float128 conversion functions. These expand to library function calls.
+ ;; We use expand to convert from IBM double double to IEEE 128-bit
+@@ -7482,7 +7519,7 @@
+ UNSPEC_P8V_FMRGOW))]
+ "!TARGET_POWERPC64 && TARGET_DIRECT_MOVE"
+ "fmrgow %0,%1,%2"
+- [(set_attr "type" "vecperm")])
++ [(set_attr "type" "fpsimple")])
+
+ (define_insn "p8_mtvsrwz"
+ [(set (match_operand:DF 0 "register_operand" "=d")
+@@ -7705,7 +7742,8 @@
+ lfd%U1%X1 %0,%1
+ fmr %0,%1
+ #"
+- [(set_attr "type" "store,load,*,fpstore,fpload,fp,*")])
++ [(set_attr "type" "store,load,*,fpstore,fpload,fpsimple,*")
++ (set_attr "size" "64")])
+
+ (define_split
+ [(set (match_operand:DI 0 "gpc_reg_operand" "")
+@@ -7759,7 +7797,8 @@
+ mfvsrd %0,%x1
+ mtvsrd %x0,%1
+ xxlxor %x0,%x0,%x0"
+- [(set_attr "type" "store,load,*,*,*,*,fpstore,fpload,fp,mfjmpr,mtjmpr,*,mftgpr,mffgpr,mftgpr,mffgpr,vecsimple")
++ [(set_attr "type" "store,load,*,*,*,*,fpstore,fpload,fpsimple,mfjmpr,mtjmpr,*,mftgpr,mffgpr,mftgpr,mffgpr,veclogical")
++ (set_attr "size" "64")
+ (set_attr "length" "4,4,4,4,4,20,4,4,4,4,4,4,4,4,4,4,4")])
+
+ ; Some DImode loads are best done as a load of -1 followed by a mask
+@@ -8767,7 +8806,8 @@
+ lfdu %3,%2(%0)"
+ [(set_attr "type" "fpload")
+ (set_attr "update" "yes")
+- (set_attr "indexed" "yes,no")])
++ (set_attr "indexed" "yes,no")
++ (set_attr "size" "64")])
+
+ (define_insn "*movdf_update2"
+ [(set (mem:DF (plus:SI (match_operand:SI 1 "gpc_reg_operand" "0,0")
+@@ -11902,6 +11942,7 @@
+ (set (match_dup 0)
+ (plus:P (match_dup 0)
+ (const_int -1)))
++ (unspec [(const_int 0)] UNSPEC_DOLOOP)
+ (clobber (match_scratch:CC 2 ""))
+ (clobber (match_scratch:P 3 ""))])]
+ ""
+@@ -11912,6 +11953,7 @@
+ ;; JUMP_INSNs.
+ ;; For the length attribute to be calculated correctly, the
+ ;; label MUST be operand 0.
++;; The UNSPEC is present to prevent combine creating this pattern.
+
+ (define_insn "*ctr<mode>_internal1"
+ [(set (pc)
+@@ -11919,9 +11961,10 @@
+ (const_int 1))
+ (label_ref (match_operand 0 "" ""))
+ (pc)))
+- (set (match_operand:P 2 "nonimmediate_operand" "=1,*r,m,*d*c*l")
++ (set (match_operand:P 2 "nonimmediate_operand" "=1,*r,m,*d*wi*c*l")
+ (plus:P (match_dup 1)
+ (const_int -1)))
++ (unspec [(const_int 0)] UNSPEC_DOLOOP)
+ (clobber (match_scratch:CC 3 "=X,&x,&x,&x"))
+ (clobber (match_scratch:P 4 "=X,X,&r,r"))]
+ ""
+@@ -11943,9 +11986,10 @@
+ (const_int 1))
+ (pc)
+ (label_ref (match_operand 0 "" ""))))
+- (set (match_operand:P 2 "nonimmediate_operand" "=1,*r,m,*d*c*l")
++ (set (match_operand:P 2 "nonimmediate_operand" "=1,*r,m,*d*wi*c*l")
+ (plus:P (match_dup 1)
+ (const_int -1)))
++ (unspec [(const_int 0)] UNSPEC_DOLOOP)
+ (clobber (match_scratch:CC 3 "=X,&x,&x,&x"))
+ (clobber (match_scratch:P 4 "=X,X,&r,r"))]
+ ""
+@@ -11969,9 +12013,10 @@
+ (const_int 1))
+ (label_ref (match_operand 0 "" ""))
+ (pc)))
+- (set (match_operand:P 2 "nonimmediate_operand" "=1,*r,m,*d*c*l")
++ (set (match_operand:P 2 "nonimmediate_operand" "=1,*r,m,*d*wi*c*l")
+ (plus:P (match_dup 1)
+ (const_int -1)))
++ (unspec [(const_int 0)] UNSPEC_DOLOOP)
+ (clobber (match_scratch:CC 3 "=X,&x,&x,&x"))
+ (clobber (match_scratch:P 4 "=X,X,&r,r"))]
+ ""
+@@ -11993,9 +12038,10 @@
+ (const_int 1))
+ (pc)
+ (label_ref (match_operand 0 "" ""))))
+- (set (match_operand:P 2 "nonimmediate_operand" "=1,*r,m,*d*c*l")
++ (set (match_operand:P 2 "nonimmediate_operand" "=1,*r,m,*d*wi*c*l")
+ (plus:P (match_dup 1)
+ (const_int -1)))
++ (unspec [(const_int 0)] UNSPEC_DOLOOP)
+ (clobber (match_scratch:CC 3 "=X,&x,&x,&x"))
+ (clobber (match_scratch:P 4 "=X,X,&r,r"))]
+ ""
+@@ -12022,6 +12068,7 @@
+ (match_operand 6 "" "")))
+ (set (match_operand:P 0 "int_reg_operand" "")
+ (plus:P (match_dup 1) (const_int -1)))
++ (unspec [(const_int 0)] UNSPEC_DOLOOP)
+ (clobber (match_scratch:CC 3 ""))
+ (clobber (match_scratch:P 4 ""))]
+ "reload_completed"
+@@ -12047,6 +12094,7 @@
+ (match_operand 6 "" "")))
+ (set (match_operand:P 0 "nonimmediate_operand" "")
+ (plus:P (match_dup 1) (const_int -1)))
++ (unspec [(const_int 0)] UNSPEC_DOLOOP)
+ (clobber (match_scratch:CC 3 ""))
+ (clobber (match_scratch:P 4 ""))]
+ "reload_completed && ! gpc_reg_operand (operands[0], SImode)"
+@@ -12563,8 +12611,10 @@
+ (set_attr "indexed" "no")])
+
+ ;; A return instruction which the middle-end doesn't see.
++;; Use r0 to stop regrename twiddling with lr restore insns emitted
++;; after the call to __morestack.
+ (define_insn "split_stack_return"
+- [(unspec_volatile [(const_int 0)] UNSPECV_SPLIT_STACK_RETURN)]
++ [(unspec_volatile [(use (reg:SI 0))] UNSPECV_SPLIT_STACK_RETURN)]
+ ""
+ "blr"
+ [(set_attr "type" "jmpreg")])
+@@ -13166,7 +13216,7 @@
+ operands[3] = gen_rtx_REG (<FP128_64>mode, dest_hi);
+ operands[4] = gen_rtx_REG (<FP128_64>mode, dest_lo);
+ }
+- [(set_attr "type" "fp,fp")
++ [(set_attr "type" "fpsimple,fp")
+ (set_attr "length" "4,8")])
+
+ (define_insn "unpack<mode>"
+@@ -13205,7 +13255,8 @@
+ (match_operand:IEEE128 2 "altivec_register_operand" "v")))]
+ "TARGET_FLOAT128_HW && FLOAT128_IEEE_P (<MODE>mode)"
+ "xsaddqp %0,%1,%2"
+- [(set_attr "type" "vecfloat")])
++ [(set_attr "type" "vecfloat")
++ (set_attr "size" "128")])
+
+ (define_insn "sub<mode>3"
+ [(set (match_operand:IEEE128 0 "altivec_register_operand" "=v")
+@@ -13214,7 +13265,8 @@
+ (match_operand:IEEE128 2 "altivec_register_operand" "v")))]
+ "TARGET_FLOAT128_HW && FLOAT128_IEEE_P (<MODE>mode)"
+ "xssubqp %0,%1,%2"
+- [(set_attr "type" "vecfloat")])
++ [(set_attr "type" "vecfloat")
++ (set_attr "size" "128")])
+
+ (define_insn "mul<mode>3"
+ [(set (match_operand:IEEE128 0 "altivec_register_operand" "=v")
+@@ -13223,7 +13275,8 @@
+ (match_operand:IEEE128 2 "altivec_register_operand" "v")))]
+ "TARGET_FLOAT128_HW && FLOAT128_IEEE_P (<MODE>mode)"
+ "xsmulqp %0,%1,%2"
+- [(set_attr "type" "vecfloat")])
++ [(set_attr "type" "vecfloat")
++ (set_attr "size" "128")])
+
+ (define_insn "div<mode>3"
+ [(set (match_operand:IEEE128 0 "altivec_register_operand" "=v")
+@@ -13232,7 +13285,8 @@
+ (match_operand:IEEE128 2 "altivec_register_operand" "v")))]
+ "TARGET_FLOAT128_HW && FLOAT128_IEEE_P (<MODE>mode)"
+ "xsdivqp %0,%1,%2"
+- [(set_attr "type" "vecdiv")])
++ [(set_attr "type" "vecdiv")
++ (set_attr "size" "128")])
+
+ (define_insn "sqrt<mode>2"
+ [(set (match_operand:IEEE128 0 "altivec_register_operand" "=v")
+@@ -13240,9 +13294,28 @@
+ (match_operand:IEEE128 1 "altivec_register_operand" "v")))]
+ "TARGET_FLOAT128_HW && FLOAT128_IEEE_P (<MODE>mode)"
+ "xssqrtqp %0,%1"
+- [(set_attr "type" "vecdiv")])
++ [(set_attr "type" "vecdiv")
++ (set_attr "size" "128")])
+
+-(define_insn "copysign<mode>3"
++(define_expand "copysign<mode>3"
++ [(use (match_operand:IEEE128 0 "altivec_register_operand"))
++ (use (match_operand:IEEE128 1 "altivec_register_operand"))
++ (use (match_operand:IEEE128 2 "altivec_register_operand"))]
++ "FLOAT128_IEEE_P (<MODE>mode)"
++{
++ if (TARGET_FLOAT128_HW)
++ emit_insn (gen_copysign<mode>3_hard (operands[0], operands[1],
++ operands[2]));
++ else
++ {
++ rtx tmp = gen_reg_rtx (<MODE>mode);
++ emit_insn (gen_copysign<mode>3_soft (operands[0], operands[1],
++ operands[2], tmp));
++ }
++ DONE;
++})
++
++(define_insn "copysign<mode>3_hard"
+ [(set (match_operand:IEEE128 0 "altivec_register_operand" "=v")
+ (unspec:IEEE128
+ [(match_operand:IEEE128 1 "altivec_register_operand" "v")
+@@ -13250,7 +13323,20 @@
+ UNSPEC_COPYSIGN))]
+ "TARGET_FLOAT128_HW && FLOAT128_IEEE_P (<MODE>mode)"
+ "xscpsgnqp %0,%2,%1"
+- [(set_attr "type" "vecsimple")])
++ [(set_attr "type" "vecmove")
++ (set_attr "size" "128")])
++
++(define_insn "copysign<mode>3_soft"
++ [(set (match_operand:IEEE128 0 "altivec_register_operand" "=v")
++ (unspec:IEEE128
++ [(match_operand:IEEE128 1 "altivec_register_operand" "v")
++ (match_operand:IEEE128 2 "altivec_register_operand" "v")
++ (match_operand:IEEE128 3 "altivec_register_operand" "+v")]
++ UNSPEC_COPYSIGN))]
++ "!TARGET_FLOAT128_HW && FLOAT128_IEEE_P (<MODE>mode)"
++ "xscpsgndp %x3,%x2,%x1\;xxpermdi %x0,%x3,%x1,1"
++ [(set_attr "type" "veccomplex")
++ (set_attr "length" "8")])
+
+ (define_insn "neg<mode>2_hw"
+ [(set (match_operand:IEEE128 0 "altivec_register_operand" "=v")
+@@ -13258,7 +13344,8 @@
+ (match_operand:IEEE128 1 "altivec_register_operand" "v")))]
+ "TARGET_FLOAT128_HW && FLOAT128_IEEE_P (<MODE>mode)"
+ "xsnegqp %0,%1"
+- [(set_attr "type" "vecfloat")])
++ [(set_attr "type" "vecmove")
++ (set_attr "size" "128")])
+
+
+ (define_insn "abs<mode>2_hw"
+@@ -13267,7 +13354,8 @@
+ (match_operand:IEEE128 1 "altivec_register_operand" "v")))]
+ "TARGET_FLOAT128_HW && FLOAT128_IEEE_P (<MODE>mode)"
+ "xsabsqp %0,%1"
+- [(set_attr "type" "vecfloat")])
++ [(set_attr "type" "vecmove")
++ (set_attr "size" "128")])
+
+
+ (define_insn "*nabs<mode>2_hw"
+@@ -13277,7 +13365,8 @@
+ (match_operand:IEEE128 1 "altivec_register_operand" "v"))))]
+ "TARGET_FLOAT128_HW && FLOAT128_IEEE_P (<MODE>mode)"
+ "xsnabsqp %0,%1"
+- [(set_attr "type" "vecfloat")])
++ [(set_attr "type" "vecmove")
++ (set_attr "size" "128")])
+
+ ;; Initially don't worry about doing fusion
+ (define_insn "*fma<mode>4_hw"
+@@ -13288,7 +13377,8 @@
+ (match_operand:IEEE128 3 "altivec_register_operand" "0")))]
+ "TARGET_FLOAT128_HW && FLOAT128_IEEE_P (<MODE>mode)"
+ "xsmaddqp %0,%1,%2"
+- [(set_attr "type" "vecfloat")])
++ [(set_attr "type" "vecfloat")
++ (set_attr "size" "128")])
+
+ (define_insn "*fms<mode>4_hw"
+ [(set (match_operand:IEEE128 0 "altivec_register_operand" "=v")
+@@ -13299,7 +13389,8 @@
+ (match_operand:IEEE128 3 "altivec_register_operand" "0"))))]
+ "TARGET_FLOAT128_HW && FLOAT128_IEEE_P (<MODE>mode)"
+ "xsmsubqp %0,%1,%2"
+- [(set_attr "type" "vecfloat")])
++ [(set_attr "type" "vecfloat")
++ (set_attr "size" "128")])
+
+ (define_insn "*nfma<mode>4_hw"
+ [(set (match_operand:IEEE128 0 "altivec_register_operand" "=v")
+@@ -13310,7 +13401,8 @@
+ (match_operand:IEEE128 3 "altivec_register_operand" "0"))))]
+ "TARGET_FLOAT128_HW && FLOAT128_IEEE_P (<MODE>mode)"
+ "xsnmaddqp %0,%1,%2"
+- [(set_attr "type" "vecfloat")])
++ [(set_attr "type" "vecfloat")
++ (set_attr "size" "128")])
+
+ (define_insn "*nfms<mode>4_hw"
+ [(set (match_operand:IEEE128 0 "altivec_register_operand" "=v")
+@@ -13322,7 +13414,8 @@
+ (match_operand:IEEE128 3 "altivec_register_operand" "0")))))]
+ "TARGET_FLOAT128_HW && FLOAT128_IEEE_P (<MODE>mode)"
+ "xsnmsubqp %0,%1,%2"
+- [(set_attr "type" "vecfloat")])
++ [(set_attr "type" "vecfloat")
++ (set_attr "size" "128")])
+
+ (define_insn "extend<SFDF:mode><IEEE128:mode>2_hw"
+ [(set (match_operand:IEEE128 0 "altivec_register_operand" "=v")
+@@ -13330,7 +13423,8 @@
+ (match_operand:SFDF 1 "altivec_register_operand" "v")))]
+ "TARGET_FLOAT128_HW && FLOAT128_IEEE_P (<IEEE128:MODE>mode)"
+ "xscvdpqp %0,%1"
+- [(set_attr "type" "vecfloat")])
++ [(set_attr "type" "vecfloat")
++ (set_attr "size" "128")])
+
+ ;; Conversion between KFmode and TFmode if TFmode is ieee 128-bit floating
+ ;; point is a simple copy.
+@@ -13347,7 +13441,7 @@
+ emit_note (NOTE_INSN_DELETED);
+ DONE;
+ }
+- [(set_attr "type" "*,vecsimple")
++ [(set_attr "type" "*,veclogical")
+ (set_attr "length" "0,4")])
+
+ (define_insn_and_split "trunctfkf2"
+@@ -13363,7 +13457,7 @@
+ emit_note (NOTE_INSN_DELETED);
+ DONE;
+ }
+- [(set_attr "type" "*,vecsimple")
++ [(set_attr "type" "*,veclogical")
+ (set_attr "length" "0,4")])
+
+ (define_insn "trunc<mode>df2_hw"
+@@ -13372,7 +13466,8 @@
+ (match_operand:IEEE128 1 "altivec_register_operand" "v")))]
+ "TARGET_FLOAT128_HW && FLOAT128_IEEE_P (<MODE>mode)"
+ "xscvqpdp %0,%1"
+- [(set_attr "type" "vecfloat")])
++ [(set_attr "type" "vecfloat")
++ (set_attr "size" "128")])
+
+ ;; There is no KFmode -> SFmode instruction. Preserve the accuracy by doing
+ ;; the KFmode -> DFmode conversion using round to odd rather than the normal
+@@ -13469,7 +13564,8 @@
+ UNSPEC_IEEE128_CONVERT))]
+ "TARGET_FLOAT128_HW && FLOAT128_IEEE_P (<MODE>mode)"
+ "xscvqp<su>wz %0,%1"
+- [(set_attr "type" "vecfloat")])
++ [(set_attr "type" "vecfloat")
++ (set_attr "size" "128")])
+
+ (define_insn "*xscvqp<su>dz_<mode>"
+ [(set (match_operand:V2DI 0 "altivec_register_operand" "=v")
+@@ -13479,7 +13575,8 @@
+ UNSPEC_IEEE128_CONVERT))]
+ "TARGET_FLOAT128_HW && FLOAT128_IEEE_P (<MODE>mode)"
+ "xscvqp<su>dz %0,%1"
+- [(set_attr "type" "vecfloat")])
++ [(set_attr "type" "vecfloat")
++ (set_attr "size" "128")])
+
+ (define_insn "*xscv<su>dqp_<mode>"
+ [(set (match_operand:IEEE128 0 "altivec_register_operand" "=v")
+@@ -13488,7 +13585,8 @@
+ UNSPEC_IEEE128_CONVERT)))]
+ "TARGET_FLOAT128_HW && FLOAT128_IEEE_P (<MODE>mode)"
+ "xscv<su>dqp %0,%1"
+- [(set_attr "type" "vecfloat")])
++ [(set_attr "type" "vecfloat")
++ (set_attr "size" "128")])
+
+ (define_insn "*ieee128_mfvsrd_64bit"
+ [(set (match_operand:DI 0 "reg_or_indexed_operand" "=wr,Z,wi")
+@@ -13499,7 +13597,7 @@
+ mfvsrd %0,%x1
+ stxsdx %x1,%y0
+ xxlor %x0,%x1,%x1"
+- [(set_attr "type" "mftgpr,fpstore,vecsimple")])
++ [(set_attr "type" "mftgpr,fpstore,veclogical")])
+
+
+ (define_insn "*ieee128_mfvsrd_32bit"
+@@ -13510,7 +13608,7 @@
+ "@
+ stxsdx %x1,%y0
+ xxlor %x0,%x1,%x1"
+- [(set_attr "type" "fpstore,vecsimple")])
++ [(set_attr "type" "fpstore,veclogical")])
+
+ (define_insn "*ieee128_mfvsrwz"
+ [(set (match_operand:SI 0 "reg_or_indexed_operand" "=r,Z")
+@@ -13546,7 +13644,7 @@
+ mtvsrd %x0,%1
+ lxsdx %x0,%y1
+ xxlor %x0,%x1,%x1"
+- [(set_attr "type" "mffgpr,fpload,vecsimple")])
++ [(set_attr "type" "mffgpr,fpload,veclogical")])
+
+ (define_insn "*ieee128_mtvsrd_32bit"
+ [(set (match_operand:V2DI 0 "altivec_register_operand" "=v,v")
+@@ -13556,7 +13654,7 @@
+ "@
+ lxsdx %x0,%y1
+ xxlor %x0,%x1,%x1"
+- [(set_attr "type" "fpload,vecsimple")])
++ [(set_attr "type" "fpload,veclogical")])
+
+ ;; IEEE 128-bit instructions with round to odd semantics
+ (define_insn "*trunc<mode>df2_odd"
+@@ -13565,7 +13663,8 @@
+ UNSPEC_ROUND_TO_ODD))]
+ "TARGET_FLOAT128_HW && FLOAT128_IEEE_P (<MODE>mode)"
+ "xscvqpdpo %0,%1"
+- [(set_attr "type" "vecfloat")])
++ [(set_attr "type" "vecfloat")
++ (set_attr "size" "128")])
+
+ ;; IEEE 128-bit comparisons
+ (define_insn "*cmp<mode>_hw"
+@@ -13574,7 +13673,8 @@
+ (match_operand:IEEE128 2 "altivec_register_operand" "v")))]
+ "TARGET_FLOAT128_HW && FLOAT128_IEEE_P (<MODE>mode)"
+ "xscmpuqp %0,%1,%2"
+- [(set_attr "type" "fpcompare")])
++ [(set_attr "type" "veccmp")
++ (set_attr "size" "128")])
+
+
+
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/config/rs6000/rs6000.opt gcc-6-20160721/gcc/config/rs6000/rs6000.opt
+--- gcc-6.1.0/gcc/config/rs6000/rs6000.opt 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/gcc/config/rs6000/rs6000.opt 2016-07-07 19:42:07.000000000 +0000
+@@ -470,8 +470,8 @@
+ -mlong-double-<n> Specify size of long double (64 or 128 bits).
+
+ mlra
+-Target Report Var(rs6000_lra_flag) Init(0) Save
+-Use LRA instead of reload.
++Target Report Mask(LRA) Var(rs6000_isa_flags)
++Enable Local Register Allocation.
+
+ msched-costly-dep=
+ Target RejectNegative Joined Var(rs6000_sched_costly_dep_str)
+@@ -605,13 +605,25 @@
+ Target Report Mask(P9_FUSION) Var(rs6000_isa_flags)
+ Fuse certain operations together for better performance on power9.
+
++mpower9-misc
++Target Undocumented Report Mask(P9_MISC) Var(rs6000_isa_flags)
++Use/do not use certain scalar instructions added in ISA 3.0.
++
+ mpower9-vector
+ Target Report Mask(P9_VECTOR) Var(rs6000_isa_flags)
+-Use/do not use vector and scalar instructions added in ISA 3.0.
++Use/do not use vector instructions added in ISA 3.0.
++
++mpower9-dform-scalar
++Target Undocumented Mask(P9_DFORM_SCALAR) Var(rs6000_isa_flags)
++Use/do not use scalar register+offset memory instructions added in ISA 3.0.
++
++mpower9-dform-vector
++Target Undocumented Mask(P9_DFORM_VECTOR) Var(rs6000_isa_flags)
++Use/do not use vector register+offset memory instructions added in ISA 3.0.
+
+ mpower9-dform
+-Target Undocumented Mask(P9_DFORM) Var(rs6000_isa_flags)
+-Use/do not use vector and scalar instructions added in ISA 3.0.
++Target Report Var(TARGET_P9_DFORM_BOTH) Init(-1) Save
++Use/do not use register+offset memory instructions added in ISA 3.0.
+
+ mpower9-minmax
+ Target Undocumented Mask(P9_MINMAX) Var(rs6000_isa_flags)
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/config/rs6000/rs64.md gcc-6-20160721/gcc/config/rs6000/rs64.md
+--- gcc-6.1.0/gcc/config/rs6000/rs64.md 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/gcc/config/rs6000/rs64.md 2016-07-05 19:19:42.000000000 +0000
+@@ -111,7 +111,7 @@
+ "mciu_rs64,fpu_rs64,bpu_rs64")
+
+ (define_insn_reservation "rs64a-fp" 4
+- (and (eq_attr "type" "fp,dmul")
++ (and (eq_attr "type" "fp,fpsimple,dmul")
+ (eq_attr "cpu" "rs64a"))
+ "mciu_rs64,fpu_rs64")
+
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/config/rs6000/sysv4.h gcc-6-20160721/gcc/config/rs6000/sysv4.h
+--- gcc-6.1.0/gcc/config/rs6000/sysv4.h 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/gcc/config/rs6000/sysv4.h 2016-05-16 13:47:47.000000000 +0000
+@@ -744,21 +744,32 @@
+ %{!mnewlib: %{pthread:-lpthread} %{shared:-lc} \
+ %{!shared: %{profile:-lc_p} %{!profile:-lc}}}"
+
++#if ENABLE_OFFLOADING == 1
++#define CRTOFFLOADBEGIN "%{fopenacc|fopenmp:crtoffloadbegin%O%s}"
++#define CRTOFFLOADEND "%{fopenacc|fopenmp:crtoffloadend%O%s}"
++#else
++#define CRTOFFLOADBEGIN ""
++#define CRTOFFLOADEND ""
++#endif
++
+ #ifdef HAVE_LD_PIE
+ #define STARTFILE_LINUX_SPEC "\
+ %{!shared: %{pg|p|profile:gcrt1.o%s;pie:Scrt1.o%s;:crt1.o%s}} \
+ %{mnewlib:ecrti.o%s;:crti.o%s} \
+-%{static:crtbeginT.o%s;shared|pie:crtbeginS.o%s;:crtbegin.o%s}"
++%{static:crtbeginT.o%s;shared|pie:crtbeginS.o%s;:crtbegin.o%s} \
++" CRTOFFLOADBEGIN
+ #else
+ #define STARTFILE_LINUX_SPEC "\
+ %{!shared: %{pg|p|profile:gcrt1.o%s;:crt1.o%s}} \
+ %{mnewlib:ecrti.o%s;:crti.o%s} \
+-%{static:crtbeginT.o%s;shared|pie:crtbeginS.o%s;:crtbegin.o%s}"
++%{static:crtbeginT.o%s;shared|pie:crtbeginS.o%s;:crtbegin.o%s} \
++" CRTOFFLOADBEGIN
+ #endif
+
+ #define ENDFILE_LINUX_SPEC "\
+ %{shared|pie:crtendS.o%s;:crtend.o%s} \
+-%{mnewlib:ecrtn.o%s;:crtn.o%s}"
++%{mnewlib:ecrtn.o%s;:crtn.o%s} \
++" CRTOFFLOADEND
+
+ #define LINK_START_LINUX_SPEC ""
+
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/config/rs6000/t-rs6000 gcc-6-20160721/gcc/config/rs6000/t-rs6000
+--- gcc-6.1.0/gcc/config/rs6000/t-rs6000 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/gcc/config/rs6000/t-rs6000 2016-07-06 02:31:08.000000000 +0000
+@@ -50,6 +50,7 @@
+ $(srcdir)/config/rs6000/power6.md \
+ $(srcdir)/config/rs6000/power7.md \
+ $(srcdir)/config/rs6000/power8.md \
++ $(srcdir)/config/rs6000/power9.md \
+ $(srcdir)/config/rs6000/cell.md \
+ $(srcdir)/config/rs6000/xfpu.md \
+ $(srcdir)/config/rs6000/a2.md \
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/config/rs6000/titan.md gcc-6-20160721/gcc/config/rs6000/titan.md
+--- gcc-6.1.0/gcc/config/rs6000/titan.md 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/gcc/config/rs6000/titan.md 2016-07-05 19:19:42.000000000 +0000
+@@ -156,7 +156,7 @@
+ ;; Make sure the "titan_fp" rule stays last, as it's a catch all for
+ ;; double-precision and unclassified (e.g. fsel) FP-instructions
+ (define_insn_reservation "titan_fp" 10
+- (and (eq_attr "type" "fpcompare,fp,dmul")
++ (and (eq_attr "type" "fpcompare,fp,fpsimple,dmul")
+ (eq_attr "cpu" "titan"))
+ "titan_issue,titan_fp0*2,nothing*8,titan_fpwb")
+
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/config/rs6000/vector.md gcc-6-20160721/gcc/config/rs6000/vector.md
+--- gcc-6.1.0/gcc/config/rs6000/vector.md 2016-01-20 19:39:08.000000000 +0000
++++ gcc-6-20160721/gcc/config/rs6000/vector.md 2016-06-01 23:23:42.000000000 +0000
+@@ -26,6 +26,13 @@
+ ;; Vector int modes
+ (define_mode_iterator VEC_I [V16QI V8HI V4SI V2DI])
+
++;; Vector int modes for parity
++(define_mode_iterator VEC_IP [V8HI
++ V4SI
++ V2DI
++ V1TI
++ (TI "TARGET_VSX_TIMODE")])
++
+ ;; Vector float modes
+ (define_mode_iterator VEC_F [V4SF V2DF])
+
+@@ -738,12 +745,24 @@
+ (clz:VEC_I (match_operand:VEC_I 1 "register_operand" "")))]
+ "TARGET_P8_VECTOR")
+
++;; Vector count trailing zeros
++(define_expand "ctz<mode>2"
++ [(set (match_operand:VEC_I 0 "register_operand" "")
++ (ctz:VEC_I (match_operand:VEC_I 1 "register_operand" "")))]
++ "TARGET_P9_VECTOR")
++
+ ;; Vector population count
+ (define_expand "popcount<mode>2"
+ [(set (match_operand:VEC_I 0 "register_operand" "")
+ (popcount:VEC_I (match_operand:VEC_I 1 "register_operand" "")))]
+ "TARGET_P8_VECTOR")
+
++;; Vector parity
++(define_expand "parity<mode>2"
++ [(set (match_operand:VEC_IP 0 "register_operand" "")
++ (parity:VEC_IP (match_operand:VEC_IP 1 "register_operand" "")))]
++ "TARGET_P9_VECTOR")
++
+
+ ;; Same size conversions
+ (define_expand "float<VEC_int><mode>2"
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/config/rs6000/vsx.md gcc-6-20160721/gcc/config/rs6000/vsx.md
+--- gcc-6.1.0/gcc/config/rs6000/vsx.md 2016-02-15 23:29:17.000000000 +0000
++++ gcc-6-20160721/gcc/config/rs6000/vsx.md 2016-07-07 22:44:15.000000000 +0000
+@@ -55,8 +55,7 @@
+ (KF "FLOAT128_VECTOR_P (KFmode)")
+ (TF "FLOAT128_VECTOR_P (TFmode)")])
+
+-;; Iterator for memory move. Handle TImode specially to allow
+-;; it to use gprs as well as vsx registers.
++;; Iterator for memory moves.
+ (define_mode_iterator VSX_M [V16QI
+ V8HI
+ V4SI
+@@ -65,18 +64,8 @@
+ V2DF
+ V1TI
+ (KF "FLOAT128_VECTOR_P (KFmode)")
+- (TF "FLOAT128_VECTOR_P (TFmode)")])
+-
+-(define_mode_iterator VSX_M2 [V16QI
+- V8HI
+- V4SI
+- V2DI
+- V4SF
+- V2DF
+- V1TI
+- (KF "FLOAT128_VECTOR_P (KFmode)")
+- (TF "FLOAT128_VECTOR_P (TFmode)")
+- (TI "TARGET_VSX_TIMODE")])
++ (TF "FLOAT128_VECTOR_P (TFmode)")
++ (TI "TARGET_VSX_TIMODE")])
+
+ ;; Map into the appropriate load/store name based on the type
+ (define_mode_attr VSm [(V16QI "vw4")
+@@ -270,6 +259,10 @@
+ (define_mode_attr VS_64reg [(V2DF "ws")
+ (V2DI "wi")])
+
++;; Iterators for loading constants with xxspltib
++(define_mode_iterator VSINT_84 [V4SI V2DI])
++(define_mode_iterator VSINT_842 [V8HI V4SI V2DI])
++
+ ;; Constants for creating unspecs
+ (define_c_enum "unspec"
+ [UNSPEC_VSX_CONCAT
+@@ -299,26 +292,9 @@
+ UNSPEC_VSX_XVCVUXDDP
+ UNSPEC_VSX_XVCVDPSXDS
+ UNSPEC_VSX_XVCVDPUXDS
++ UNSPEC_VSX_SIGN_EXTEND
+ ])
+
+-;; VSX (P9) moves
+-
+-(define_insn "*p9_vecload_<mode>"
+- [(set (match_operand:VSX_M2 0 "vsx_register_operand" "=<VSa>")
+- (match_operand:VSX_M2 1 "memory_operand" "Z"))]
+- "TARGET_P9_VECTOR"
+- "lxvx %x0,%y1"
+- [(set_attr "type" "vecload")
+- (set_attr "length" "4")])
+-
+-(define_insn "*p9_vecstore_<mode>"
+- [(set (match_operand:VSX_M2 0 "memory_operand" "=Z")
+- (match_operand:VSX_M2 1 "vsx_register_operand" "<VSa>"))]
+- "TARGET_P9_VECTOR"
+- "stxvx %x1,%y0"
+- [(set_attr "type" "vecstore")
+- (set_attr "length" "4")])
+-
+ ;; VSX moves
+
+ ;; The patterns for LE permuted loads and stores come before the general
+@@ -709,7 +685,7 @@
+ }
+ }
+ [(set_attr "length" "0,4")
+- (set_attr "type" "vecsimple")])
++ (set_attr "type" "veclogical")])
+
+ (define_insn_and_split "*vsx_le_perm_load_<mode>"
+ [(set (match_operand:VSX_LE_128 0 "vsx_register_operand" "=<VSa>")
+@@ -787,92 +763,141 @@
+ (const_int 64)))]
+ "")
+
+-(define_insn "*vsx_mov<mode>"
+- [(set (match_operand:VSX_M 0 "nonimmediate_operand" "=Z,<VSr>,<VSr>,?Z,?<VSa>,?<VSa>,r,we,wQ,?&r,??Y,??r,??r,<VSr>,?<VSa>,*r,v,wZ,v")
+- (match_operand:VSX_M 1 "input_operand" "<VSr>,Z,<VSr>,<VSa>,Z,<VSa>,we,b,r,wQ,r,Y,r,j,j,j,W,v,wZ"))]
+- "VECTOR_MEM_VSX_P (<MODE>mode)
+- && (register_operand (operands[0], <MODE>mode)
+- || register_operand (operands[1], <MODE>mode))"
++;; Vector constants that can be generated with XXSPLTIB that was added in ISA
++;; 3.0. Both (const_vector [..]) and (vec_duplicate ...) forms are recognized.
++(define_insn "xxspltib_v16qi"
++ [(set (match_operand:V16QI 0 "vsx_register_operand" "=wa")
++ (vec_duplicate:V16QI (match_operand:SI 1 "s8bit_cint_operand" "n")))]
++ "TARGET_P9_VECTOR"
+ {
+- return rs6000_output_move_128bit (operands);
++ operands[2] = GEN_INT (INTVAL (operands[1]) & 0xff);
++ return "xxspltib %x0,%2";
+ }
+- [(set_attr "type" "vecstore,vecload,vecsimple,vecstore,vecload,vecsimple,mffgpr,mftgpr,load,store,store,load, *,vecsimple,vecsimple,*, *,vecstore,vecload")
+- (set_attr "length" "4,4,4,4,4,4,8,4,12,12,12,12,16,4,4,*,16,4,4")])
++ [(set_attr "type" "vecperm")])
+
+-;; Unlike other VSX moves, allow the GPRs even for reloading, since a normal
+-;; use of TImode is for unions. However for plain data movement, slightly
+-;; favor the vector loads
+-(define_insn "*vsx_movti_64bit"
+- [(set (match_operand:TI 0 "nonimmediate_operand" "=Z,wa,wa,wa,r,we,v,v,wZ,wQ,&r,Y,r,r,?r")
+- (match_operand:TI 1 "input_operand" "wa,Z,wa,O,we,b,W,wZ,v,r,wQ,r,Y,r,n"))]
+- "TARGET_POWERPC64 && VECTOR_MEM_VSX_P (TImode)
+- && (register_operand (operands[0], TImode)
+- || register_operand (operands[1], TImode))"
++(define_insn "xxspltib_<mode>_nosplit"
++ [(set (match_operand:VSINT_842 0 "vsx_register_operand" "=wa,wa")
++ (match_operand:VSINT_842 1 "xxspltib_constant_nosplit" "jwM,wE"))]
++ "TARGET_P9_VECTOR"
+ {
+- return rs6000_output_move_128bit (operands);
++ rtx op1 = operands[1];
++ int value = 256;
++ int num_insns = -1;
++
++ if (!xxspltib_constant_p (op1, <MODE>mode, &num_insns, &value)
++ || num_insns != 1)
++ gcc_unreachable ();
++
++ operands[2] = GEN_INT (value & 0xff);
++ return "xxspltib %x0,%2";
+ }
+- [(set_attr "type" "vecstore,vecload,vecsimple,vecsimple,mffgpr,mftgpr,vecsimple,vecstore,vecload,store,load,store,load,*,*")
+- (set_attr "length" "4,4,4,4,8,4,16,4,4,8,8,8,8,8,8")])
++ [(set_attr "type" "vecperm")])
+
+-(define_insn "*vsx_movti_32bit"
+- [(set (match_operand:TI 0 "nonimmediate_operand" "=Z,wa,wa,wa,v, v,wZ,Q,Y,????r,????r,????r,r")
+- (match_operand:TI 1 "input_operand" "wa, Z,wa, O,W,wZ, v,r,r, Q, Y, r,n"))]
+- "! TARGET_POWERPC64 && VECTOR_MEM_VSX_P (TImode)
+- && (register_operand (operands[0], TImode)
+- || register_operand (operands[1], TImode))"
++(define_insn_and_split "*xxspltib_<mode>_split"
++ [(set (match_operand:VSINT_842 0 "altivec_register_operand" "=v")
++ (match_operand:VSINT_842 1 "xxspltib_constant_split" "wS"))]
++ "TARGET_P9_VECTOR"
++ "#"
++ "&& 1"
++ [(const_int 0)]
+ {
+- switch (which_alternative)
+- {
+- case 0:
+- return "stxvd2x %x1,%y0";
++ int value = 256;
++ int num_insns = -1;
++ rtx op0 = operands[0];
++ rtx op1 = operands[1];
++ rtx tmp = ((can_create_pseudo_p ())
++ ? gen_reg_rtx (V16QImode)
++ : gen_lowpart (V16QImode, op0));
+
+- case 1:
+- return "lxvd2x %x0,%y1";
++ if (!xxspltib_constant_p (op1, <MODE>mode, &num_insns, &value)
++ || num_insns != 2)
++ gcc_unreachable ();
+
+- case 2:
+- return "xxlor %x0,%x1,%x1";
++ emit_insn (gen_xxspltib_v16qi (tmp, GEN_INT (value)));
+
+- case 3:
+- return "xxlxor %x0,%x0,%x0";
++ if (<MODE>mode == V2DImode)
++ emit_insn (gen_vsx_sign_extend_qi_v2di (op0, tmp));
+
+- case 4:
+- return output_vec_const_move (operands);
++ else if (<MODE>mode == V4SImode)
++ emit_insn (gen_vsx_sign_extend_qi_v4si (op0, tmp));
+
+- case 5:
+- return "stvx %1,%y0";
++ else if (<MODE>mode == V8HImode)
++ emit_insn (gen_altivec_vupkhsb (op0, tmp));
+
+- case 6:
+- return "lvx %0,%y1";
+-
+- case 7:
+- if (TARGET_STRING)
+- return \"stswi %1,%P0,16\";
+-
+- case 8:
+- return \"#\";
+-
+- case 9:
+- /* If the address is not used in the output, we can use lsi. Otherwise,
+- fall through to generating four loads. */
+- if (TARGET_STRING
+- && ! reg_overlap_mentioned_p (operands[0], operands[1]))
+- return \"lswi %0,%P1,16\";
+- /* ... fall through ... */
+-
+- case 10:
+- case 11:
+- case 12:
+- return \"#\";
+- default:
+- gcc_unreachable ();
+- }
++ else
++ gcc_unreachable ();
++
++ DONE;
+ }
+- [(set_attr "type" "vecstore,vecload,vecsimple,vecsimple,vecsimple,vecstore,vecload,store,store,load,load, *, *")
+- (set_attr "update" " *, *, *, *, *, *, *, yes, yes, yes, yes, *, *")
+- (set_attr "length" " 4, 4, 4, 4, 8, 4, 4, 16, 16, 16, 16,16,16")
+- (set (attr "cell_micro") (if_then_else (match_test "TARGET_STRING")
+- (const_string "always")
+- (const_string "conditional")))])
++ [(set_attr "type" "vecperm")
++ (set_attr "length" "8")])
++
++
++;; Prefer using vector registers over GPRs. Prefer using ISA 3.0's XXSPLTISB
++;; or Altivec VSPLITW 0/-1 over XXLXOR/XXLORC to set a register to all 0's or
++;; all 1's, since the machine does not have to wait for the previous
++;; instruction using the register being set (such as a store waiting on a slow
++;; instruction). But generate XXLXOR/XXLORC if it will avoid a register move.
++
++;; VSX store VSX load VSX move VSX->GPR GPR->VSX LQ (GPR)
++;; STQ (GPR) GPR load GPR store GPR move XXSPLTIB VSPLTISW
++;; VSX 0/-1 GPR 0/-1 VMX const GPR const LVX (VMX) STVX (VMX)
++(define_insn "*vsx_mov<mode>_64bit"
++ [(set (match_operand:VSX_M 0 "nonimmediate_operand"
++ "=ZwO, <VSa>, <VSa>, r, we, ?wQ,
++ ?&r, ??r, ??Y, ??r, wo, v,
++ ?<VSa>, *r, v, ??r, wZ, v")
++
++ (match_operand:VSX_M 1 "input_operand"
++ "<VSa>, ZwO, <VSa>, we, r, r,
++ wQ, Y, r, r, wE, jwM,
++ ?jwM, jwM, W, W, v, wZ"))]
++
++ "TARGET_POWERPC64 && VECTOR_MEM_VSX_P (<MODE>mode)
++ && (register_operand (operands[0], <MODE>mode)
++ || register_operand (operands[1], <MODE>mode))"
++{
++ return rs6000_output_move_128bit (operands);
++}
++ [(set_attr "type"
++ "vecstore, vecload, vecsimple, mffgpr, mftgpr, load,
++ store, load, store, *, vecsimple, vecsimple,
++ vecsimple, *, *, *, vecstore, vecload")
++
++ (set_attr "length"
++ "4, 4, 4, 8, 4, 8,
++ 8, 8, 8, 8, 4, 4,
++ 4, 8, 20, 20, 4, 4")])
++
++;; VSX store VSX load VSX move GPR load GPR store GPR move
++;; XXSPLTIB VSPLTISW VSX 0/-1 GPR 0/-1 VMX const GPR const
++;; LVX (VMX) STVX (VMX)
++(define_insn "*vsx_mov<mode>_32bit"
++ [(set (match_operand:VSX_M 0 "nonimmediate_operand"
++ "=ZwO, <VSa>, <VSa>, ??r, ??Y, ??r,
++ wo, v, ?<VSa>, *r, v, ??r,
++ wZ, v")
++
++ (match_operand:VSX_M 1 "input_operand"
++ "<VSa>, ZwO, <VSa>, Y, r, r,
++ wE, jwM, ?jwM, jwM, W, W,
++ v, wZ"))]
++
++ "!TARGET_POWERPC64 && VECTOR_MEM_VSX_P (<MODE>mode)
++ && (register_operand (operands[0], <MODE>mode)
++ || register_operand (operands[1], <MODE>mode))"
++{
++ return rs6000_output_move_128bit (operands);
++}
++ [(set_attr "type"
++ "vecstore, vecload, vecsimple, load, store, *,
++ vecsimple, vecsimple, vecsimple, *, *, *,
++ vecstore, vecload")
++
++ (set_attr "length"
++ "4, 4, 4, 16, 16, 16,
++ 4, 4, 4, 16, 20, 32,
++ 4, 4")])
+
+ ;; Explicit load/store expanders for the builtin functions
+ (define_expand "vsx_load_<mode>"
+@@ -887,6 +912,140 @@
+ "VECTOR_MEM_VSX_P (<MODE>mode)"
+ "")
+
++;; Explicit load/store expanders for the builtin functions for lxvd2x, etc.,
++;; when you really want their element-reversing behavior.
++(define_insn "vsx_ld_elemrev_v2di"
++ [(set (match_operand:V2DI 0 "vsx_register_operand" "=wa")
++ (vec_select:V2DI
++ (match_operand:V2DI 1 "memory_operand" "Z")
++ (parallel [(const_int 1) (const_int 0)])))]
++ "VECTOR_MEM_VSX_P (V2DImode) && !BYTES_BIG_ENDIAN"
++ "lxvd2x %x0,%y1"
++ [(set_attr "type" "vecload")])
++
++(define_insn "vsx_ld_elemrev_v2df"
++ [(set (match_operand:V2DF 0 "vsx_register_operand" "=wa")
++ (vec_select:V2DF
++ (match_operand:V2DF 1 "memory_operand" "Z")
++ (parallel [(const_int 1) (const_int 0)])))]
++ "VECTOR_MEM_VSX_P (V2DFmode) && !BYTES_BIG_ENDIAN"
++ "lxvd2x %x0,%y1"
++ [(set_attr "type" "vecload")])
++
++(define_insn "vsx_ld_elemrev_v4si"
++ [(set (match_operand:V4SI 0 "vsx_register_operand" "=wa")
++ (vec_select:V4SI
++ (match_operand:V4SI 1 "memory_operand" "Z")
++ (parallel [(const_int 3) (const_int 2)
++ (const_int 1) (const_int 0)])))]
++ "VECTOR_MEM_VSX_P (V4SImode) && !BYTES_BIG_ENDIAN"
++ "lxvw4x %x0,%y1"
++ [(set_attr "type" "vecload")])
++
++(define_insn "vsx_ld_elemrev_v4sf"
++ [(set (match_operand:V4SF 0 "vsx_register_operand" "=wa")
++ (vec_select:V4SF
++ (match_operand:V4SF 1 "memory_operand" "Z")
++ (parallel [(const_int 3) (const_int 2)
++ (const_int 1) (const_int 0)])))]
++ "VECTOR_MEM_VSX_P (V4SFmode) && !BYTES_BIG_ENDIAN"
++ "lxvw4x %x0,%y1"
++ [(set_attr "type" "vecload")])
++
++(define_insn "vsx_ld_elemrev_v8hi"
++ [(set (match_operand:V8HI 0 "vsx_register_operand" "=wa")
++ (vec_select:V8HI
++ (match_operand:V8HI 1 "memory_operand" "Z")
++ (parallel [(const_int 7) (const_int 6)
++ (const_int 5) (const_int 4)
++ (const_int 3) (const_int 2)
++ (const_int 1) (const_int 0)])))]
++ "VECTOR_MEM_VSX_P (V8HImode) && !BYTES_BIG_ENDIAN && TARGET_P9_VECTOR"
++ "lxvh8x %x0,%y1"
++ [(set_attr "type" "vecload")])
++
++(define_insn "vsx_ld_elemrev_v16qi"
++ [(set (match_operand:V16QI 0 "vsx_register_operand" "=wa")
++ (vec_select:V16QI
++ (match_operand:V16QI 1 "memory_operand" "Z")
++ (parallel [(const_int 15) (const_int 14)
++ (const_int 13) (const_int 12)
++ (const_int 11) (const_int 10)
++ (const_int 9) (const_int 8)
++ (const_int 7) (const_int 6)
++ (const_int 5) (const_int 4)
++ (const_int 3) (const_int 2)
++ (const_int 1) (const_int 0)])))]
++ "VECTOR_MEM_VSX_P (V16QImode) && !BYTES_BIG_ENDIAN && TARGET_P9_VECTOR"
++ "lxvb16x %x0,%y1"
++ [(set_attr "type" "vecload")])
++
++(define_insn "vsx_st_elemrev_v2df"
++ [(set (match_operand:V2DF 0 "memory_operand" "=Z")
++ (vec_select:V2DF
++ (match_operand:V2DF 1 "vsx_register_operand" "wa")
++ (parallel [(const_int 1) (const_int 0)])))]
++ "VECTOR_MEM_VSX_P (V2DFmode) && !BYTES_BIG_ENDIAN"
++ "stxvd2x %x1,%y0"
++ [(set_attr "type" "vecstore")])
++
++(define_insn "vsx_st_elemrev_v2di"
++ [(set (match_operand:V2DI 0 "memory_operand" "=Z")
++ (vec_select:V2DI
++ (match_operand:V2DI 1 "vsx_register_operand" "wa")
++ (parallel [(const_int 1) (const_int 0)])))]
++ "VECTOR_MEM_VSX_P (V2DImode) && !BYTES_BIG_ENDIAN"
++ "stxvd2x %x1,%y0"
++ [(set_attr "type" "vecstore")])
++
++(define_insn "vsx_st_elemrev_v4sf"
++ [(set (match_operand:V4SF 0 "memory_operand" "=Z")
++ (vec_select:V4SF
++ (match_operand:V4SF 1 "vsx_register_operand" "wa")
++ (parallel [(const_int 3) (const_int 2)
++ (const_int 1) (const_int 0)])))]
++ "VECTOR_MEM_VSX_P (V4SFmode) && !BYTES_BIG_ENDIAN"
++ "stxvw4x %x1,%y0"
++ [(set_attr "type" "vecstore")])
++
++(define_insn "vsx_st_elemrev_v4si"
++ [(set (match_operand:V4SI 0 "memory_operand" "=Z")
++ (vec_select:V4SI
++ (match_operand:V4SI 1 "vsx_register_operand" "wa")
++ (parallel [(const_int 3) (const_int 2)
++ (const_int 1) (const_int 0)])))]
++ "VECTOR_MEM_VSX_P (V4SImode) && !BYTES_BIG_ENDIAN"
++ "stxvw4x %x1,%y0"
++ [(set_attr "type" "vecstore")])
++
++(define_insn "vsx_st_elemrev_v8hi"
++ [(set (match_operand:V8HI 0 "memory_operand" "=Z")
++ (vec_select:V8HI
++ (match_operand:V8HI 1 "vsx_register_operand" "wa")
++ (parallel [(const_int 7) (const_int 6)
++ (const_int 5) (const_int 4)
++ (const_int 3) (const_int 2)
++ (const_int 1) (const_int 0)])))]
++ "VECTOR_MEM_VSX_P (V8HImode) && !BYTES_BIG_ENDIAN && TARGET_P9_VECTOR"
++ "stxvh8x %x1,%y0"
++ [(set_attr "type" "vecstore")])
++
++(define_insn "vsx_st_elemrev_v16qi"
++ [(set (match_operand:V16QI 0 "memory_operand" "=Z")
++ (vec_select:V16QI
++ (match_operand:V16QI 1 "vsx_register_operand" "wa")
++ (parallel [(const_int 15) (const_int 14)
++ (const_int 13) (const_int 12)
++ (const_int 11) (const_int 10)
++ (const_int 9) (const_int 8)
++ (const_int 7) (const_int 6)
++ (const_int 5) (const_int 4)
++ (const_int 3) (const_int 2)
++ (const_int 1) (const_int 0)])))]
++ "VECTOR_MEM_VSX_P (V16QImode) && !BYTES_BIG_ENDIAN && TARGET_P9_VECTOR"
++ "stxvb16x %x1,%y0"
++ [(set_attr "type" "vecstore")])
++
+
+ ;; VSX vector floating point arithmetic instructions. The VSX scalar
+ ;; instructions are now combined with the insn for the traditional floating
+@@ -1333,7 +1492,7 @@
+ (match_operand:VSX_L 3 "vsx_register_operand" "<VSr>,<VSa>")))]
+ "VECTOR_MEM_VSX_P (<MODE>mode)"
+ "xxsel %x0,%x3,%x2,%x1"
+- [(set_attr "type" "vecperm")])
++ [(set_attr "type" "vecmove")])
+
+ (define_insn "*vsx_xxsel<mode>_uns"
+ [(set (match_operand:VSX_L 0 "vsx_register_operand" "=<VSr>,?<VSa>")
+@@ -1344,7 +1503,7 @@
+ (match_operand:VSX_L 3 "vsx_register_operand" "<VSr>,<VSa>")))]
+ "VECTOR_MEM_VSX_P (<MODE>mode)"
+ "xxsel %x0,%x3,%x2,%x1"
+- [(set_attr "type" "vecperm")])
++ [(set_attr "type" "vecmove")])
+
+ ;; Copy sign
+ (define_insn "vsx_copysign<mode>3"
+@@ -1583,10 +1742,15 @@
+ {
+ rtx op0 = operands[0];
+ rtx op1 = operands[1];
+- rtx tmp = gen_reg_rtx (V2DFmode);
+- int scale = INTVAL(operands[2]);
+- if (scale != 0)
+- rs6000_scale_v2df (tmp, op1, scale);
++ rtx tmp;
++ int scale = INTVAL (operands[2]);
++ if (scale == 0)
++ tmp = op1;
++ else
++ {
++ tmp = gen_reg_rtx (V2DFmode);
++ rs6000_scale_v2df (tmp, op1, scale);
++ }
+ emit_insn (gen_vsx_xvcvdpsxds (op0, tmp));
+ DONE;
+ })
+@@ -1607,10 +1771,15 @@
+ {
+ rtx op0 = operands[0];
+ rtx op1 = operands[1];
+- rtx tmp = gen_reg_rtx (V2DFmode);
+- int scale = INTVAL(operands[2]);
+- if (scale != 0)
+- rs6000_scale_v2df (tmp, op1, scale);
++ rtx tmp;
++ int scale = INTVAL (operands[2]);
++ if (scale == 0)
++ tmp = op1;
++ else
++ {
++ tmp = gen_reg_rtx (V2DFmode);
++ rs6000_scale_v2df (tmp, op1, scale);
++ }
+ emit_insn (gen_vsx_xvcvdpuxds (op0, tmp));
+ DONE;
+ })
+@@ -1960,7 +2129,7 @@
+
+ return "xxlor %x0,%x1,%x1";
+ }
+- [(set_attr "type" "fp,vecsimple,mftgpr,mftgpr")
++ [(set_attr "type" "fpsimple,veclogical,mftgpr,mftgpr")
+ (set_attr "length" "4")])
+
+ (define_insn "*vsx_extract_<mode>_internal2"
+@@ -1995,7 +2164,7 @@
+ operands[3] = GEN_INT (fldDM);
+ return "xxpermdi %x0,%x1,%x1,%3";
+ }
+- [(set_attr "type" "fp,vecsimple,vecperm")
++ [(set_attr "type" "fpsimple,veclogical,vecperm")
+ (set_attr "length" "4")])
+
+ ;; Optimize extracting a single scalar element from memory if the scalar is in
+@@ -2215,20 +2384,61 @@
+
+ ;; V2DF/V2DI splat
+ (define_insn "vsx_splat_<mode>"
+- [(set (match_operand:VSX_D 0 "vsx_register_operand" "=wd,wd,wd,?<VSa>,?<VSa>,?<VSa>")
++ [(set (match_operand:VSX_D 0 "vsx_register_operand" "=<VSa>,<VSa>,we")
+ (vec_duplicate:VSX_D
+- (match_operand:<VS_scalar> 1 "splat_input_operand" "<VS_64reg>,f,Z,<VSa>,<VSa>,Z")))]
++ (match_operand:<VS_scalar> 1 "splat_input_operand" "<VS_64reg>,Z,b")))]
+ "VECTOR_MEM_VSX_P (<MODE>mode)"
+ "@
+ xxpermdi %x0,%x1,%x1,0
+- xxpermdi %x0,%x1,%x1,0
+ lxvdsx %x0,%y1
+- xxpermdi %x0,%x1,%x1,0
+- xxpermdi %x0,%x1,%x1,0
+- lxvdsx %x0,%y1"
+- [(set_attr "type" "vecperm,vecperm,vecload,vecperm,vecperm,vecload")])
++ mtvsrdd %x0,%1,%1"
++ [(set_attr "type" "vecperm,vecload,mftgpr")])
++
++;; V4SI splat (ISA 3.0)
++;; When SI's are allowed in VSX registers, add XXSPLTW support
++(define_expand "vsx_splat_<mode>"
++ [(set (match_operand:VSX_W 0 "vsx_register_operand" "")
++ (vec_duplicate:VSX_W
++ (match_operand:<VS_scalar> 1 "splat_input_operand" "")))]
++ "TARGET_P9_VECTOR"
++{
++ if (MEM_P (operands[1]))
++ operands[1] = rs6000_address_for_fpconvert (operands[1]);
++ else if (!REG_P (operands[1]))
++ operands[1] = force_reg (<VS_scalar>mode, operands[1]);
++})
+
+-;; V4SF/V4SI splat
++(define_insn "*vsx_splat_v4si_internal"
++ [(set (match_operand:V4SI 0 "vsx_register_operand" "=wa,wa")
++ (vec_duplicate:V4SI
++ (match_operand:SI 1 "splat_input_operand" "r,Z")))]
++ "TARGET_P9_VECTOR"
++ "@
++ mtvsrws %x0,%1
++ lxvwsx %x0,%y1"
++ [(set_attr "type" "mftgpr,vecload")])
++
++;; V4SF splat (ISA 3.0)
++(define_insn_and_split "*vsx_splat_v4sf_internal"
++ [(set (match_operand:V4SF 0 "vsx_register_operand" "=wa,wa,wa")
++ (vec_duplicate:V4SF
++ (match_operand:SF 1 "splat_input_operand" "Z,wy,r")))]
++ "TARGET_P9_VECTOR"
++ "@
++ lxvwsx %x0,%y1
++ #
++ mtvsrws %x0,%1"
++ "&& reload_completed && vsx_register_operand (operands[1], SFmode)"
++ [(set (match_dup 0)
++ (unspec:V4SF [(match_dup 1)] UNSPEC_VSX_CVDPSPN))
++ (set (match_dup 0)
++ (unspec:V4SF [(match_dup 0)
++ (const_int 0)] UNSPEC_VSX_XXSPLTW))]
++ ""
++ [(set_attr "type" "vecload,vecperm,mftgpr")
++ (set_attr "length" "4,8,4")])
++
++;; V4SF/V4SI splat from a vector element
+ (define_insn "vsx_xxspltw_<mode>"
+ [(set (match_operand:VSX_W 0 "vsx_register_operand" "=wf,?<VSa>")
+ (vec_duplicate:VSX_W
+@@ -2471,21 +2681,50 @@
+ (define_peephole
+ [(set (match_operand:P 0 "base_reg_operand" "")
+ (match_operand:P 1 "short_cint_operand" ""))
+- (set (match_operand:VSX_M2 2 "vsx_register_operand" "")
+- (mem:VSX_M2 (plus:P (match_dup 0)
+- (match_operand:P 3 "int_reg_operand" ""))))]
++ (set (match_operand:VSX_M 2 "vsx_register_operand" "")
++ (mem:VSX_M (plus:P (match_dup 0)
++ (match_operand:P 3 "int_reg_operand" ""))))]
+ "TARGET_VSX && TARGET_P8_FUSION && !TARGET_P9_VECTOR"
+- "li %0,%1\t\t\t# vector load fusion\;lx<VSX_M2:VSm>x %x2,%0,%3"
++ "li %0,%1\t\t\t# vector load fusion\;lx<VSX_M:VSm>x %x2,%0,%3"
+ [(set_attr "length" "8")
+ (set_attr "type" "vecload")])
+
+ (define_peephole
+ [(set (match_operand:P 0 "base_reg_operand" "")
+ (match_operand:P 1 "short_cint_operand" ""))
+- (set (match_operand:VSX_M2 2 "vsx_register_operand" "")
+- (mem:VSX_M2 (plus:P (match_operand:P 3 "int_reg_operand" "")
+- (match_dup 0))))]
++ (set (match_operand:VSX_M 2 "vsx_register_operand" "")
++ (mem:VSX_M (plus:P (match_operand:P 3 "int_reg_operand" "")
++ (match_dup 0))))]
+ "TARGET_VSX && TARGET_P8_FUSION && !TARGET_P9_VECTOR"
+- "li %0,%1\t\t\t# vector load fusion\;lx<VSX_M2:VSm>x %x2,%0,%3"
++ "li %0,%1\t\t\t# vector load fusion\;lx<VSX_M:VSm>x %x2,%0,%3"
+ [(set_attr "length" "8")
+ (set_attr "type" "vecload")])
++
++
++;; ISA 3.0 vector extend sign support
++
++(define_insn "vsx_sign_extend_qi_<mode>"
++ [(set (match_operand:VSINT_84 0 "vsx_register_operand" "=v")
++ (unspec:VSINT_84
++ [(match_operand:V16QI 1 "vsx_register_operand" "v")]
++ UNSPEC_VSX_SIGN_EXTEND))]
++ "TARGET_P9_VECTOR"
++ "vextsb2<wd> %0,%1"
++ [(set_attr "type" "vecexts")])
++
++(define_insn "*vsx_sign_extend_hi_<mode>"
++ [(set (match_operand:VSINT_84 0 "vsx_register_operand" "=v")
++ (unspec:VSINT_84
++ [(match_operand:V8HI 1 "vsx_register_operand" "v")]
++ UNSPEC_VSX_SIGN_EXTEND))]
++ "TARGET_P9_VECTOR"
++ "vextsh2<wd> %0,%1"
++ [(set_attr "type" "vecexts")])
++
++(define_insn "*vsx_sign_extend_si_v2di"
++ [(set (match_operand:V2DI 0 "vsx_register_operand" "=v")
++ (unspec:V2DI [(match_operand:V4SI 1 "vsx_register_operand" "v")]
++ UNSPEC_VSX_SIGN_EXTEND))]
++ "TARGET_P9_VECTOR"
++ "vextsw2d %0,%1"
++ [(set_attr "type" "vecexts")])
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/config/rs6000/xfpu.md gcc-6-20160721/gcc/config/rs6000/xfpu.md
+--- gcc-6.1.0/gcc/config/rs6000/xfpu.md 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/gcc/config/rs6000/xfpu.md 2016-07-05 19:19:42.000000000 +0000
+@@ -55,7 +55,7 @@
+
+ (define_insn_reservation "fp-default" 2
+ (and (and
+- (eq_attr "type" "fp")
++ (eq_attr "type" "fp,fpsimple")
+ (eq_attr "fp_type" "fp_default"))
+ (eq_attr "cpu" "ppc405"))
+ "Xfpu_issue*2")
+@@ -67,14 +67,14 @@
+
+ (define_insn_reservation "fp-addsub-s" 14
+ (and (and
+- (eq_attr "type" "fp")
++ (eq_attr "type" "fp,fpsimple")
+ (eq_attr "fp_type" "fp_addsub_s"))
+ (eq_attr "cpu" "ppc405"))
+ "Xfpu_issue*2,Xfpu_addsub")
+
+ (define_insn_reservation "fp-addsub-d" 18
+ (and (and
+- (eq_attr "type" "fp")
++ (eq_attr "type" "fp,fpsimple")
+ (eq_attr "fp_type" "fp_addsub_d"))
+ (eq_attr "cpu" "ppc405"))
+ "Xfpu_issue*2,Xfpu_addsub")
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/config/rtems.h gcc-6-20160721/gcc/config/rtems.h
+--- gcc-6.1.0/gcc/config/rtems.h 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/gcc/config/rtems.h 2016-05-10 07:03:07.000000000 +0000
+@@ -45,6 +45,6 @@
+ #define LIB_SPEC "%{!qrtems: " STD_LIB_SPEC "} " \
+ "%{!nostdlib: %{qrtems: --start-group \
+ -lrtemsbsp -lrtemscpu \
+- -lc -lgcc --end-group %{!qnolinkcmds: -T linkcmds%s}}}"
++ -latomic -lc -lgcc --end-group %{!qnolinkcmds: -T linkcmds%s}}}"
+
+ #define TARGET_POSIX_IO
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/config/s390/s390.c gcc-6-20160721/gcc/config/s390/s390.c
+--- gcc-6.1.0/gcc/config/s390/s390.c 2016-04-20 07:16:03.000000000 +0000
++++ gcc-6-20160721/gcc/config/s390/s390.c 2016-07-20 18:35:04.000000000 +0000
+@@ -791,7 +791,7 @@
+ machine_mode mode ATTRIBUTE_UNUSED,
+ int ignore ATTRIBUTE_UNUSED)
+ {
+-#define MAX_ARGS 5
++#define MAX_ARGS 6
+
+ tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
+ unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
+@@ -12405,17 +12405,13 @@
+ {
+ /* Store the alignment to be able to check if we can use
+ a larl/load-relative instruction. We only handle the cases
+- that can go wrong (i.e. no FUNC_DECLs). If a symref does
+- not have any flag we assume it to be correctly aligned. */
+-
+- if (DECL_ALIGN (decl) % 64)
+- SYMBOL_FLAG_SET_NOTALIGN8 (XEXP (rtl, 0));
+-
+- if (DECL_ALIGN (decl) % 32)
+- SYMBOL_FLAG_SET_NOTALIGN4 (XEXP (rtl, 0));
+-
++ that can go wrong (i.e. no FUNC_DECLs). */
+ if (DECL_ALIGN (decl) == 0 || DECL_ALIGN (decl) % 16)
+ SYMBOL_FLAG_SET_NOTALIGN2 (XEXP (rtl, 0));
++ else if (DECL_ALIGN (decl) % 32)
++ SYMBOL_FLAG_SET_NOTALIGN4 (XEXP (rtl, 0));
++ else if (DECL_ALIGN (decl) % 64)
++ SYMBOL_FLAG_SET_NOTALIGN8 (XEXP (rtl, 0));
+ }
+
+ /* Literal pool references don't have a decl so they are handled
+@@ -12423,18 +12419,14 @@
+ entry to decide upon the alignment. */
+ if (MEM_P (rtl)
+ && GET_CODE (XEXP (rtl, 0)) == SYMBOL_REF
+- && TREE_CONSTANT_POOL_ADDRESS_P (XEXP (rtl, 0))
+- && MEM_ALIGN (rtl) != 0
+- && GET_MODE_BITSIZE (GET_MODE (rtl)) != 0)
++ && TREE_CONSTANT_POOL_ADDRESS_P (XEXP (rtl, 0)))
+ {
+- if (MEM_ALIGN (rtl) % 64)
+- SYMBOL_FLAG_SET_NOTALIGN8 (XEXP (rtl, 0));
+-
+- if (MEM_ALIGN (rtl) % 32)
+- SYMBOL_FLAG_SET_NOTALIGN4 (XEXP (rtl, 0));
+-
+ if (MEM_ALIGN (rtl) == 0 || MEM_ALIGN (rtl) % 16)
+ SYMBOL_FLAG_SET_NOTALIGN2 (XEXP (rtl, 0));
++ else if (MEM_ALIGN (rtl) % 32)
++ SYMBOL_FLAG_SET_NOTALIGN4 (XEXP (rtl, 0));
++ else if (MEM_ALIGN (rtl) % 64)
++ SYMBOL_FLAG_SET_NOTALIGN8 (XEXP (rtl, 0));
+ }
+ }
+
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/config/s390/s390.md gcc-6-20160721/gcc/config/s390/s390.md
+--- gcc-6.1.0/gcc/config/s390/s390.md 2016-04-20 07:16:03.000000000 +0000
++++ gcc-6-20160721/gcc/config/s390/s390.md 2016-05-10 09:02:37.000000000 +0000
+@@ -1295,7 +1295,7 @@
+ (compare:VFCMP (match_operand:DF 0 "register_operand" "v")
+ (match_operand:DF 1 "register_operand" "v")))
+ (clobber (match_scratch:V2DI 2 "=v"))]
+- "TARGET_Z13 && TARGET_HARD_FLOAT"
++ "TARGET_VX && TARGET_HARD_FLOAT"
+ "wfc<asm_fcmp>dbs\t%v2,%v0,%v1"
+ [(set_attr "op_type" "VRR")])
+
+@@ -4649,7 +4649,7 @@
+ (unsigned_fix:DI (match_operand:DF 1 "register_operand" "f,v")))
+ (unspec:DI [(match_operand:DI 2 "immediate_operand" "K,K")] UNSPEC_ROUND)
+ (clobber (reg:CC CC_REGNUM))]
+- "TARGET_Z13 && TARGET_HARD_FLOAT"
++ "TARGET_VX && TARGET_HARD_FLOAT"
+ "@
+ clgdbr\t%0,%h2,%1,0
+ wclgdb\t%v0,%v1,0,%h2"
+@@ -4664,7 +4664,7 @@
+ (unspec:GPR [(match_operand:GPR 2 "immediate_operand" "K")] UNSPEC_ROUND)
+ (clobber (reg:CC CC_REGNUM))]
+ "TARGET_Z196 && TARGET_HARD_FLOAT
+- && (!TARGET_Z13 || <GPR:MODE>mode != DImode || <FP:MODE>mode != DFmode)"
++ && (!TARGET_VX || <GPR:MODE>mode != DImode || <FP:MODE>mode != DFmode)"
+ "cl<GPR:gf><FP:xde><FP:bt>r\t%0,%h2,%1,0"
+ [(set_attr "op_type" "RRF")
+ (set_attr "type" "ftoi")])
+@@ -4684,7 +4684,7 @@
+ (fix:DI (match_operand:DF 1 "register_operand" "f,v")))
+ (unspec:DI [(match_operand:DI 2 "immediate_operand" "K,K")] UNSPEC_ROUND)
+ (clobber (reg:CC CC_REGNUM))]
+- "TARGET_Z13 && TARGET_HARD_FLOAT"
++ "TARGET_VX && TARGET_HARD_FLOAT"
+ "@
+ cgdbr\t%0,%h2,%1
+ wcgdb\t%v0,%v1,0,%h2"
+@@ -4792,7 +4792,7 @@
+ (define_insn "*floatunsdidf2_z13"
+ [(set (match_operand:DF 0 "register_operand" "=f,v")
+ (unsigned_float:DF (match_operand:DI 1 "register_operand" "d,v")))]
+- "TARGET_Z13 && TARGET_HARD_FLOAT"
++ "TARGET_VX && TARGET_HARD_FLOAT"
+ "@
+ cdlgbr\t%0,0,%1,0
+ wcdlgb\t%v0,%v1,0,0"
+@@ -4896,7 +4896,7 @@
+ (define_insn "*extendsfdf2_z13"
+ [(set (match_operand:DF 0 "register_operand" "=f,f,v")
+ (float_extend:DF (match_operand:SF 1 "nonimmediate_operand" "f,R,v")))]
+- "TARGET_Z13 && TARGET_HARD_FLOAT"
++ "TARGET_VX && TARGET_HARD_FLOAT"
+ "@
+ ldebr\t%0,%1
+ ldeb\t%0,%1
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/config/sparc/driver-sparc.c gcc-6-20160721/gcc/config/sparc/driver-sparc.c
+--- gcc-6.1.0/gcc/config/sparc/driver-sparc.c 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/gcc/config/sparc/driver-sparc.c 2016-06-08 19:13:37.000000000 +0000
+@@ -75,6 +75,8 @@
+ { "UltraSparc T4", "niagara4" },
+ { "LEON", "leon3" },
+ #endif
++ { "SPARC-M7", "niagara7" },
++ { "SPARC-S7", "niagara7" },
+ { NULL, NULL }
+ };
+
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/config/sparc/linux64.h gcc-6-20160721/gcc/config/sparc/linux64.h
+--- gcc-6.1.0/gcc/config/sparc/linux64.h 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/gcc/config/sparc/linux64.h 2016-06-08 13:34:25.000000000 +0000
+@@ -164,22 +164,42 @@
+ #endif
+
+ /* Support for a compile-time default CPU, et cetera. The rules are:
+- --with-cpu is ignored if -mcpu is specified.
+- --with-tune is ignored if -mtune is specified.
++ --with-cpu is ignored if -mcpu is specified; likewise --with-cpu-32
++ and --with-cpu-64.
++ --with-tune is ignored if -mtune is specified; likewise --with-tune-32
++ and --with-tune-64.
+ --with-float is ignored if -mhard-float, -msoft-float, -mfpu, or -mno-fpu
+ are specified.
+ In the SPARC_BI_ARCH compiler we cannot pass %{!mcpu=*:-mcpu=%(VALUE)}
+ here, otherwise say -mcpu=v7 would be passed even when -m64.
+- CC1_SPEC above takes care of this instead. */
++ CC1_SPEC above takes care of this instead.
++
++ Note that the order of the cpu* and tune* options matters: the
++ config.gcc file always sets with_cpu to some value, even if the
++ user didn't use --with-cpu when invoking the configure script.
++ This value is based on the target name. Therefore we have to make
++ sure that --with-cpu-32 takes precedence to --with-cpu in < v9
++ systems, and that --with-cpu-64 takes precedence to --with-cpu in
++ >= v9 systems. As for the tune* options, in some platforms
++ config.gcc also sets a default value for it if the user didn't use
++ --with-tune when invoking the configure script. */
+ #undef OPTION_DEFAULT_SPECS
+ #if DEFAULT_ARCH32_P
+ #define OPTION_DEFAULT_SPECS \
++ {"cpu_32", "%{!m64:%{!mcpu=*:-mcpu=%(VALUE)}}" }, \
++ {"cpu_64", "%{m64:%{!mcpu=*:-mcpu=%(VALUE)}}" }, \
+ {"cpu", "%{!m64:%{!mcpu=*:-mcpu=%(VALUE)}}" }, \
++ {"tune_32", "%{!m64:%{!mtune=*:-mtune=%(VALUE)}}" }, \
++ {"tune_64", "%{m64:%{!mtune=*:-mtune=%(VALUE)}}" }, \
+ {"tune", "%{!mtune=*:-mtune=%(VALUE)}" }, \
+ {"float", "%{!msoft-float:%{!mhard-float:%{!mfpu:%{!mno-fpu:-m%(VALUE)-float}}}}" }
+ #else
+ #define OPTION_DEFAULT_SPECS \
++ {"cpu_32", "%{m32:%{!mcpu=*:-mcpu=%(VALUE)}}" }, \
++ {"cpu_64", "%{!m32:%{!mcpu=*:-mcpu=%(VALUE)}}" }, \
+ {"cpu", "%{!m32:%{!mcpu=*:-mcpu=%(VALUE)}}" }, \
++ {"tune_32", "%{m32:%{!mtune=*:-mtune=%(VALUE)}}" }, \
++ {"tune_64", "%{!m32:%{!mtune=*:-mtune=%(VALUE)}}" }, \
+ {"tune", "%{!mtune=*:-mtune=%(VALUE)}" }, \
+ {"float", "%{!msoft-float:%{!mhard-float:%{!mfpu:%{!mno-fpu:-m%(VALUE)-float}}}}" }
+ #endif
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/config/sparc/niagara4.md gcc-6-20160721/gcc/config/sparc/niagara4.md
+--- gcc-6.1.0/gcc/config/sparc/niagara4.md 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/gcc/config/sparc/niagara4.md 2016-06-08 13:34:25.000000000 +0000
+@@ -75,6 +75,13 @@
+ (eq_attr "fptype" "double")))
+ "n4_slot1")
+
++;; The latency numbers for VIS instructions in the reservations below
++;; reflect empirical results, and don't match with the documented
++;; latency numbers in the T4 Processor Supplement. This is because
++;; the HW chaps didn't feel it necessary to document the complexity in
++;; the PRM, and just assigned a latency of 11 to all/most of the VIS
++;; instructions.
++
+ (define_insn_reservation "n4_vis_move_11cycle" 11
+ (and (eq_attr "cpu" "niagara4")
+ (and (eq_attr "type" "vismv")
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/config/sparc/niagara7.md gcc-6-20160721/gcc/config/sparc/niagara7.md
+--- gcc-6.1.0/gcc/config/sparc/niagara7.md 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/config/sparc/niagara7.md 2016-06-08 13:34:25.000000000 +0000
+@@ -0,0 +1,136 @@
++;; Scheduling description for Niagara-7
++;; Copyright (C) 2016 Free Software Foundation, Inc.
++;;
++;; This file is part of GCC.
++;;
++;; GCC is free software; you can redistribute it and/or modify
++;; it under the terms of the GNU General Public License as published by
++;; the Free Software Foundation; either version 3, or (at your option)
++;; any later version.
++;;
++;; GCC is distributed in the hope that it will be useful,
++;; but WITHOUT ANY WARRANTY; without even the implied warranty of
++;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++;; GNU General Public License for more details.
++;;
++;; You should have received a copy of the GNU General Public License
++;; along with GCC; see the file COPYING3. If not see
++;; <http://www.gnu.org/licenses/>.
++
++(define_automaton "niagara7_0")
++
++(define_cpu_unit "n7_slot0,n7_slot1,n7_slot2" "niagara7_0")
++(define_reservation "n7_single_issue" "n7_slot0 + n7_slot1 + n7_slot2")
++
++(define_cpu_unit "n7_load_store" "niagara7_0")
++
++(define_insn_reservation "n7_single" 1
++ (and (eq_attr "cpu" "niagara7")
++ (eq_attr "type" "multi,savew,flushw,trap"))
++ "n7_single_issue")
++
++(define_insn_reservation "n7_iflush" 27
++ (and (eq_attr "cpu" "niagara7")
++ (eq_attr "type" "iflush"))
++ "(n7_slot0 | n7_slot1), nothing*26")
++
++(define_insn_reservation "n7_integer" 1
++ (and (eq_attr "cpu" "niagara7")
++ (eq_attr "type" "ialu,ialuX,shift,cmove,compare"))
++ "(n7_slot0 | n7_slot1)")
++
++(define_insn_reservation "n7_imul" 12
++ (and (eq_attr "cpu" "niagara7")
++ (eq_attr "type" "imul"))
++ "n7_slot1, nothing*11")
++
++(define_insn_reservation "n7_idiv" 35
++ (and (eq_attr "cpu" "niagara7")
++ (eq_attr "type" "idiv"))
++ "n7_slot1, nothing*34")
++
++(define_insn_reservation "n7_load" 5
++ (and (eq_attr "cpu" "niagara7")
++ (eq_attr "type" "load,fpload,sload"))
++ "(n7_slot0 + n7_load_store), nothing*4")
++
++(define_insn_reservation "n7_store" 1
++ (and (eq_attr "cpu" "niagara7")
++ (eq_attr "type" "store,fpstore"))
++ "(n7_slot0 | n7_slot2) + n7_load_store")
++
++(define_insn_reservation "n7_cti" 1
++ (and (eq_attr "cpu" "niagara7")
++ (eq_attr "type" "cbcond,uncond_cbcond,branch,call,sibcall,call_no_delay_slot,uncond_branch,return"))
++ "n7_slot1")
++
++(define_insn_reservation "n7_fp" 11
++ (and (eq_attr "cpu" "niagara7")
++ (eq_attr "type" "fpmove,fpcmove,fpcrmove,fp,fpcmp,fpmul"))
++ "n7_slot1, nothing*10")
++
++(define_insn_reservation "n7_array" 12
++ (and (eq_attr "cpu" "niagara7")
++ (eq_attr "type" "array,edge,edgen"))
++ "n7_slot1, nothing*11")
++
++(define_insn_reservation "n7_fpdivs" 24
++ (and (eq_attr "cpu" "niagara7")
++ (eq_attr "type" "fpdivs,fpsqrts"))
++ "n7_slot1, nothing*23")
++
++(define_insn_reservation "n7_fpdivd" 37
++ (and (eq_attr "cpu" "niagara7")
++ (eq_attr "type" "fpdivd,fpsqrtd"))
++ "n7_slot1, nothing*36")
++
++(define_insn_reservation "n7_lzd" 12
++ (and (eq_attr "cpu" "niagara7")
++ (eq_attr "type" "lzd"))
++ "(n7_slot0 | n7_slot1), nothing*11")
++
++;; There is an internal unit called the "V3 pipe", that was originally
++;; intended to process some of the short cryptographic instructions.
++;; However, as soon as in the T4 several of the VIS instructions
++;; (notably non-FP instructions) have been moved to the V3 pipe.
++;; Consequently, these instructions feature a latency of 3 instead of
++;; 11 or 12 cycles, provided their consumers also execute in the V3
++;; pipe.
++;;
++;; This is modelled here with a bypass.
++
++(define_insn_reservation "n7_vis_fga" 11
++ (and (eq_attr "cpu" "niagara7")
++ (eq_attr "type" "fga,gsr"))
++ "n7_slot1, nothing*10")
++
++(define_insn_reservation "n7_vis_fgm" 11
++ (and (eq_attr "cpu" "niagara7")
++ (eq_attr "type" "fgm_pack,fgm_mul,pdist"))
++ "n7_slot1, nothing*10")
++
++(define_insn_reservation "n7_vis_move_v3pipe" 11
++ (and (eq_attr "cpu" "niagara7")
++ (and (eq_attr "type" "vismv")
++ (eq_attr "v3pipe" "true")))
++ "n7_slot1")
++
++(define_insn_reservation "n7_vis_move_11cycle" 11
++ (and (eq_attr "cpu" "niagara7")
++ (and (eq_attr "type" "vismv")
++ (eq_attr "v3pipe" "false")))
++ "n7_slot1, nothing*10")
++
++(define_insn_reservation "n7_vis_logical_v3pipe" 11
++ (and (eq_attr "cpu" "niagara7")
++ (and (eq_attr "type" "visl,pdistn")
++ (eq_attr "v3pipe" "true")))
++ "n7_slot1, nothing*2")
++
++(define_insn_reservation "n7_vis_logical_11cycle" 11
++ (and (eq_attr "cpu" "niagara7")
++ (and (eq_attr "type" "visl")
++ (eq_attr "v3pipe" "false")))
++ "n7_slot1, nothing*10")
++
++(define_bypass 3 "*_v3pipe" "*_v3pipe")
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/config/sparc/sol2.h gcc-6-20160721/gcc/config/sparc/sol2.h
+--- gcc-6.1.0/gcc/config/sparc/sol2.h 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/gcc/config/sparc/sol2.h 2016-06-08 13:34:25.000000000 +0000
+@@ -165,13 +165,22 @@
+ #define ASM_CPU64_DEFAULT_SPEC AS_SPARC64_FLAG AS_NIAGARA4_FLAG
+ #endif
+
++#if TARGET_CPU_DEFAULT == TARGET_CPU_niagara7
++#undef CPP_CPU64_DEFAULT_SPEC
++#define CPP_CPU64_DEFAULT_SPEC ""
++#undef ASM_CPU32_DEFAULT_SPEC
++#define ASM_CPU32_DEFAUILT_SPEC AS_SPARC32_FLAG AS_NIAGARA7_FLAG
++#undef ASM_CPU64_DEFAULT_SPEC
++#define ASM_CPU64_DEFAULT_SPEC AS_SPARC64_FLAG AS_NIAGARA7_FLAG
++#endif
++
+ #undef CPP_CPU_SPEC
+ #define CPP_CPU_SPEC "\
+ %{mcpu=sparclet|mcpu=tsc701:-D__sparclet__} \
+ %{mcpu=sparclite|mcpu-f930|mcpu=f934:-D__sparclite__} \
+ %{mcpu=v8:" DEF_ARCH32_SPEC("-D__sparcv8") "} \
+ %{mcpu=supersparc:-D__supersparc__ " DEF_ARCH32_SPEC("-D__sparcv8") "} \
+-%{mcpu=v9|mcpu=ultrasparc|mcpu=ultrasparc3|mcpu=niagara|mcpu=niagara2|mcpu=niagara3|mcpu=niagara4:" DEF_ARCH32_SPEC("-D__sparcv8") "} \
++%{mcpu=v9|mcpu=ultrasparc|mcpu=ultrasparc3|mcpu=niagara|mcpu=niagara2|mcpu=niagara3|mcpu=niagara4|mcpu=niagara7:" DEF_ARCH32_SPEC("-D__sparcv8") "} \
+ %{!mcpu*:%(cpp_cpu_default)} \
+ "
+
+@@ -231,22 +240,42 @@
+ #endif
+
+ /* Support for a compile-time default CPU, et cetera. The rules are:
+- --with-cpu is ignored if -mcpu is specified.
+- --with-tune is ignored if -mtune is specified.
++ --with-cpu is ignored if -mcpu is specified; likewise --with-cpu-32
++ and --with-cpu-64.
++ --with-tune is ignored if -mtune is specified; likewise --with-tune-32
++ and --with-tune-64.
+ --with-float is ignored if -mhard-float, -msoft-float, -mfpu, or -mno-fpu
+ are specified.
+ In the SPARC_BI_ARCH compiler we cannot pass %{!mcpu=*:-mcpu=%(VALUE)}
+ here, otherwise say -mcpu=v7 would be passed even when -m64.
+- CC1_SPEC above takes care of this instead. */
++ CC1_SPEC above takes care of this instead.
++
++ Note that the order of the cpu* and tune* options matters: the
++ config.gcc file always sets with_cpu to some value, even if the
++ user didn't use --with-cpu when invoking the configure script.
++ This value is based on the target name. Therefore we have to make
++ sure that --with-cpu-32 takes precedence to --with-cpu in < v9
++ systems, and that --with-cpu-64 takes precedence to --with-cpu in
++ >= v9 systems. As for the tune* options, in some platforms
++ config.gcc also sets a default value for it if the user didn't use
++ --with-tune when invoking the configure script. */
+ #undef OPTION_DEFAULT_SPECS
+ #if DEFAULT_ARCH32_P
+ #define OPTION_DEFAULT_SPECS \
++ {"cpu_32", "%{!m64:%{!mcpu=*:-mcpu=%(VALUE)}}" }, \
++ {"cpu_64", "%{m64:%{!mcpu=*:-mcpu=%(VALUE)}}" }, \
+ {"cpu", "%{!m64:%{!mcpu=*:-mcpu=%(VALUE)}}" }, \
++ {"tune_32", "%{!m64:%{!mtune=*:-mtune=%(VALUE)}}" }, \
++ {"tune_64", "%{m64:%{!mtune=*:-mtune=%(VALUE)}}" }, \
+ {"tune", "%{!mtune=*:-mtune=%(VALUE)}" }, \
+ {"float", "%{!msoft-float:%{!mhard-float:%{!mfpu:%{!mno-fpu:-m%(VALUE)-float}}}}" }
+ #else
+ #define OPTION_DEFAULT_SPECS \
++ {"cpu_32", "%{m32:%{!mcpu=*:-mcpu=%(VALUE)}}" }, \
++ {"cpu_64", "%{!m32:%{!mcpu=*:-mcpu=%(VALUE)}}" }, \
+ {"cpu", "%{!m32:%{!mcpu=*:-mcpu=%(VALUE)}}" }, \
++ {"tune_32", "%{m32:%{!mtune=*:-mtune=%(VALUE)}}" }, \
++ {"tune_64", "%{!m32:%{!mtune=*:-mtune=%(VALUE)}}" }, \
+ {"tune", "%{!mtune=*:-mtune=%(VALUE)}" }, \
+ {"float", "%{!msoft-float:%{!mhard-float:%{!mfpu:%{!mno-fpu:-m%(VALUE)-float}}}}" }
+ #endif
+@@ -260,7 +289,8 @@
+ %{mcpu=niagara2:" DEF_ARCH32_SPEC("-xarch=v8plusb") DEF_ARCH64_SPEC("-xarch=v9b") "} \
+ %{mcpu=niagara3:" DEF_ARCH32_SPEC("-xarch=v8plus" AS_NIAGARA3_FLAG) DEF_ARCH64_SPEC("-xarch=v9" AS_NIAGARA3_FLAG) "} \
+ %{mcpu=niagara4:" DEF_ARCH32_SPEC(AS_SPARC32_FLAG AS_NIAGARA4_FLAG) DEF_ARCH64_SPEC(AS_SPARC64_FLAG AS_NIAGARA4_FLAG) "} \
+-%{!mcpu=niagara4:%{!mcpu=niagara3:%{!mcpu=niagara2:%{!mcpu=niagara:%{!mcpu=ultrasparc3:%{!mcpu=ultrasparc:%{!mcpu=v9:%{mcpu*:" DEF_ARCH32_SPEC("-xarch=v8") DEF_ARCH64_SPEC("-xarch=v9") "}}}}}}}} \
++%{mcpu=niagara7:" DEF_ARCH32_SPEC(AS_SPARC32_FLAG AS_NIAGARA7_FLAG) DEF_ARCH64_SPEC(AS_SPARC64_FLAG AS_NIAGARA7_FLAG) "} \
++%{!mcpu=niagara7:%{!mcpu=niagara4:%{!mcpu=niagara3:%{!mcpu=niagara2:%{!mcpu=niagara:%{!mcpu=ultrasparc3:%{!mcpu=ultrasparc:%{!mcpu=v9:%{mcpu*:" DEF_ARCH32_SPEC("-xarch=v8") DEF_ARCH64_SPEC("-xarch=v9") "}}}}}}}}} \
+ %{!mcpu*:%(asm_cpu_default)} \
+ "
+
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/config/sparc/sparc-c.c gcc-6-20160721/gcc/config/sparc/sparc-c.c
+--- gcc-6.1.0/gcc/config/sparc/sparc-c.c 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/gcc/config/sparc/sparc-c.c 2016-06-08 13:34:25.000000000 +0000
+@@ -40,7 +40,12 @@
+ cpp_assert (parse_in, "machine=sparc");
+ }
+
+- if (TARGET_VIS3)
++ if (TARGET_VIS4)
++ {
++ cpp_define (parse_in, "__VIS__=0x400");
++ cpp_define (parse_in, "__VIS__=0x400");
++ }
++ else if (TARGET_VIS3)
+ {
+ cpp_define (parse_in, "__VIS__=0x300");
+ cpp_define (parse_in, "__VIS=0x300");
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/config/sparc/sparc-opts.h gcc-6-20160721/gcc/config/sparc/sparc-opts.h
+--- gcc-6.1.0/gcc/config/sparc/sparc-opts.h 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/gcc/config/sparc/sparc-opts.h 2016-06-08 13:34:25.000000000 +0000
+@@ -45,6 +45,7 @@
+ PROCESSOR_NIAGARA2,
+ PROCESSOR_NIAGARA3,
+ PROCESSOR_NIAGARA4,
++ PROCESSOR_NIAGARA7,
+ PROCESSOR_NATIVE
+ };
+
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/config/sparc/sparc.c gcc-6-20160721/gcc/config/sparc/sparc.c
+--- gcc-6.1.0/gcc/config/sparc/sparc.c 2016-04-12 20:55:05.000000000 +0000
++++ gcc-6-20160721/gcc/config/sparc/sparc.c 2016-06-08 13:34:25.000000000 +0000
+@@ -423,6 +423,30 @@
+ 0, /* shift penalty */
+ };
+
++static const
++struct processor_costs niagara7_costs = {
++ COSTS_N_INSNS (5), /* int load */
++ COSTS_N_INSNS (5), /* int signed load */
++ COSTS_N_INSNS (5), /* int zeroed load */
++ COSTS_N_INSNS (5), /* float load */
++ COSTS_N_INSNS (11), /* fmov, fneg, fabs */
++ COSTS_N_INSNS (11), /* fadd, fsub */
++ COSTS_N_INSNS (11), /* fcmp */
++ COSTS_N_INSNS (11), /* fmov, fmovr */
++ COSTS_N_INSNS (11), /* fmul */
++ COSTS_N_INSNS (24), /* fdivs */
++ COSTS_N_INSNS (37), /* fdivd */
++ COSTS_N_INSNS (24), /* fsqrts */
++ COSTS_N_INSNS (37), /* fsqrtd */
++ COSTS_N_INSNS (12), /* imul */
++ COSTS_N_INSNS (12), /* imulX */
++ 0, /* imul bit factor */
++ COSTS_N_INSNS (51), /* idiv, average of 42 - 61 cycle range */
++ COSTS_N_INSNS (35), /* idivX, average of 26 - 44 cycle range */
++ COSTS_N_INSNS (1), /* movcc/movr */
++ 0, /* shift penalty */
++};
++
+ static const struct processor_costs *sparc_costs = &cypress_costs;
+
+ #ifdef HAVE_AS_RELAX_OPTION
+@@ -1175,6 +1199,8 @@
+ fprintf (stderr, "VIS2 ");
+ if (flags & MASK_VIS3)
+ fprintf (stderr, "VIS3 ");
++ if (flags & MASK_VIS4)
++ fprintf (stderr, "VIS4 ");
+ if (flags & MASK_CBCOND)
+ fprintf (stderr, "CBCOND ");
+ if (flags & MASK_DEPRECATED_V8_INSNS)
+@@ -1238,6 +1264,7 @@
+ { TARGET_CPU_niagara2, PROCESSOR_NIAGARA2 },
+ { TARGET_CPU_niagara3, PROCESSOR_NIAGARA3 },
+ { TARGET_CPU_niagara4, PROCESSOR_NIAGARA4 },
++ { TARGET_CPU_niagara7, PROCESSOR_NIAGARA7 },
+ { -1, PROCESSOR_V7 }
+ };
+ const struct cpu_default *def;
+@@ -1287,6 +1314,9 @@
+ /* UltraSPARC T4 */
+ { "niagara4", MASK_ISA,
+ MASK_V9|MASK_POPC|MASK_VIS2|MASK_VIS3|MASK_FMAF|MASK_CBCOND },
++ /* UltraSPARC M7 */
++ { "niagara7", MASK_ISA,
++ MASK_V9|MASK_POPC|MASK_VIS2|MASK_VIS3|MASK_VIS4|MASK_FMAF|MASK_CBCOND },
+ };
+ const struct cpu_table *cpu;
+ unsigned int i;
+@@ -1416,6 +1446,9 @@
+ #ifndef HAVE_AS_SPARC4
+ & ~MASK_CBCOND
+ #endif
++#ifndef HAVE_AS_SPARC5_VIS4
++ & ~MASK_VIS4
++#endif
+ #ifndef HAVE_AS_LEON
+ & ~(MASK_LEON | MASK_LEON3)
+ #endif
+@@ -1434,10 +1467,15 @@
+ if (TARGET_VIS3)
+ target_flags |= MASK_VIS2 | MASK_VIS;
+
+- /* Don't allow -mvis, -mvis2, -mvis3, or -mfmaf if FPU is
++ /* -mvis4 implies -mvis3, -mvis2 and -mvis */
++ if (TARGET_VIS4)
++ target_flags |= MASK_VIS3 | MASK_VIS2 | MASK_VIS;
++
++ /* Don't allow -mvis, -mvis2, -mvis3, -mvis4 or -mfmaf if FPU is
+ disabled. */
+ if (! TARGET_FPU)
+- target_flags &= ~(MASK_VIS | MASK_VIS2 | MASK_VIS3 | MASK_FMAF);
++ target_flags &= ~(MASK_VIS | MASK_VIS2 | MASK_VIS3 | MASK_VIS4
++ | MASK_FMAF);
+
+ /* -mvis assumes UltraSPARC+, so we are sure v9 instructions
+ are available.
+@@ -1471,7 +1509,8 @@
+ || sparc_cpu == PROCESSOR_NIAGARA
+ || sparc_cpu == PROCESSOR_NIAGARA2
+ || sparc_cpu == PROCESSOR_NIAGARA3
+- || sparc_cpu == PROCESSOR_NIAGARA4))
++ || sparc_cpu == PROCESSOR_NIAGARA4
++ || sparc_cpu == PROCESSOR_NIAGARA7))
+ align_functions = 32;
+
+ /* Validate PCC_STRUCT_RETURN. */
+@@ -1535,6 +1574,9 @@
+ case PROCESSOR_NIAGARA4:
+ sparc_costs = &niagara4_costs;
+ break;
++ case PROCESSOR_NIAGARA7:
++ sparc_costs = &niagara7_costs;
++ break;
+ case PROCESSOR_NATIVE:
+ gcc_unreachable ();
+ };
+@@ -1566,6 +1608,29 @@
+ if (TARGET_DEBUG_OPTIONS)
+ dump_target_flags ("Final target_flags", target_flags);
+
++ /* PARAM_SIMULTANEOUS_PREFETCHES is the number of prefetches that
++ can run at the same time. More important, it is the threshold
++ defining when additional prefetches will be dropped by the
++ hardware.
++
++ The UltraSPARC-III features a documented prefetch queue with a
++ size of 8. Additional prefetches issued in the cpu are
++ dropped.
++
++ Niagara processors are different. In these processors prefetches
++ are handled much like regular loads. The L1 miss buffer is 32
++ entries, but prefetches start getting affected when 30 entries
++ become occupied. That occupation could be a mix of regular loads
++ and prefetches though. And that buffer is shared by all threads.
++ Once the threshold is reached, if the core is running a single
++ thread the prefetch will retry. If more than one thread is
++ running, the prefetch will be dropped.
++
++ All this makes it very difficult to determine how many
++ simultaneous prefetches can be issued simultaneously, even in a
++ single-threaded program. Experimental results show that setting
++ this parameter to 32 works well when the number of threads is not
++ high. */
+ maybe_set_param_value (PARAM_SIMULTANEOUS_PREFETCHES,
+ ((sparc_cpu == PROCESSOR_ULTRASPARC
+ || sparc_cpu == PROCESSOR_NIAGARA
+@@ -1574,20 +1639,55 @@
+ || sparc_cpu == PROCESSOR_NIAGARA4)
+ ? 2
+ : (sparc_cpu == PROCESSOR_ULTRASPARC3
+- ? 8 : 3)),
++ ? 8 : (sparc_cpu == PROCESSOR_NIAGARA7
++ ? 32 : 3))),
+ global_options.x_param_values,
+ global_options_set.x_param_values);
+- maybe_set_param_value (PARAM_L1_CACHE_LINE_SIZE,
++
++ /* For PARAM_L1_CACHE_LINE_SIZE we use the default 32 bytes (see
++ params.def), so no maybe_set_param_value is needed.
++
++ The Oracle SPARC Architecture (previously the UltraSPARC
++ Architecture) specification states that when a PREFETCH[A]
++ instruction is executed an implementation-specific amount of data
++ is prefetched, and that it is at least 64 bytes long (aligned to
++ at least 64 bytes).
++
++ However, this is not correct. The M7 (and implementations prior
++ to that) does not guarantee a 64B prefetch into a cache if the
++ line size is smaller. A single cache line is all that is ever
++ prefetched. So for the M7, where the L1D$ has 32B lines and the
++ L2D$ and L3 have 64B lines, a prefetch will prefetch 64B into the
++ L2 and L3, but only 32B are brought into the L1D$. (Assuming it
++ is a read_n prefetch, which is the only type which allocates to
++ the L1.) */
++
++ /* PARAM_L1_CACHE_SIZE is the size of the L1D$ (most SPARC chips use
++ Hardvard level-1 caches) in kilobytes. Both UltraSPARC and
++ Niagara processors feature a L1D$ of 16KB. */
++ maybe_set_param_value (PARAM_L1_CACHE_SIZE,
+ ((sparc_cpu == PROCESSOR_ULTRASPARC
+ || sparc_cpu == PROCESSOR_ULTRASPARC3
+ || sparc_cpu == PROCESSOR_NIAGARA
+ || sparc_cpu == PROCESSOR_NIAGARA2
+ || sparc_cpu == PROCESSOR_NIAGARA3
+- || sparc_cpu == PROCESSOR_NIAGARA4)
+- ? 64 : 32),
++ || sparc_cpu == PROCESSOR_NIAGARA4
++ || sparc_cpu == PROCESSOR_NIAGARA7)
++ ? 16 : 64),
+ global_options.x_param_values,
+ global_options_set.x_param_values);
+
++
++ /* PARAM_L2_CACHE_SIZE is the size fo the L2 in kilobytes. Note
++ that 512 is the default in params.def. */
++ maybe_set_param_value (PARAM_L2_CACHE_SIZE,
++ (sparc_cpu == PROCESSOR_NIAGARA4
++ ? 128 : (sparc_cpu == PROCESSOR_NIAGARA7
++ ? 256 : 512)),
++ global_options.x_param_values,
++ global_options_set.x_param_values);
++
++
+ /* Disable save slot sharing for call-clobbered registers by default.
+ The IRA sharing algorithm works on single registers only and this
+ pessimizes for double floating-point registers. */
+@@ -9178,7 +9278,8 @@
+ && sparc_cpu != PROCESSOR_NIAGARA
+ && sparc_cpu != PROCESSOR_NIAGARA2
+ && sparc_cpu != PROCESSOR_NIAGARA3
+- && sparc_cpu != PROCESSOR_NIAGARA4)
++ && sparc_cpu != PROCESSOR_NIAGARA4
++ && sparc_cpu != PROCESSOR_NIAGARA7)
+ emit_insn (gen_flushsi (validize_mem (adjust_address (m_tramp, SImode, 8))));
+
+ /* Call __enable_execute_stack after writing onto the stack to make sure
+@@ -9223,7 +9324,8 @@
+ && sparc_cpu != PROCESSOR_NIAGARA
+ && sparc_cpu != PROCESSOR_NIAGARA2
+ && sparc_cpu != PROCESSOR_NIAGARA3
+- && sparc_cpu != PROCESSOR_NIAGARA4)
++ && sparc_cpu != PROCESSOR_NIAGARA4
++ && sparc_cpu != PROCESSOR_NIAGARA7)
+ emit_insn (gen_flushdi (validize_mem (adjust_address (m_tramp, DImode, 8))));
+
+ /* Call __enable_execute_stack after writing onto the stack to make sure
+@@ -9419,7 +9521,8 @@
+ || sparc_cpu == PROCESSOR_NIAGARA2
+ || sparc_cpu == PROCESSOR_NIAGARA3)
+ return 0;
+- if (sparc_cpu == PROCESSOR_NIAGARA4)
++ if (sparc_cpu == PROCESSOR_NIAGARA4
++ || sparc_cpu == PROCESSOR_NIAGARA7)
+ return 2;
+ if (sparc_cpu == PROCESSOR_ULTRASPARC
+ || sparc_cpu == PROCESSOR_ULTRASPARC3)
+@@ -9442,6 +9545,7 @@
+ default:
+ return 1;
+ case PROCESSOR_NIAGARA4:
++ case PROCESSOR_NIAGARA7:
+ case PROCESSOR_V9:
+ /* Assume V9 processors are capable of at least dual-issue. */
+ return 2;
+@@ -10007,6 +10111,34 @@
+ SPARC_BUILTIN_XMULX,
+ SPARC_BUILTIN_XMULXHI,
+
++ /* VIS 4.0 builtins. */
++ SPARC_BUILTIN_FPADD8,
++ SPARC_BUILTIN_FPADDS8,
++ SPARC_BUILTIN_FPADDUS8,
++ SPARC_BUILTIN_FPADDUS16,
++ SPARC_BUILTIN_FPCMPLE8,
++ SPARC_BUILTIN_FPCMPGT8,
++ SPARC_BUILTIN_FPCMPULE16,
++ SPARC_BUILTIN_FPCMPUGT16,
++ SPARC_BUILTIN_FPCMPULE32,
++ SPARC_BUILTIN_FPCMPUGT32,
++ SPARC_BUILTIN_FPMAX8,
++ SPARC_BUILTIN_FPMAX16,
++ SPARC_BUILTIN_FPMAX32,
++ SPARC_BUILTIN_FPMAXU8,
++ SPARC_BUILTIN_FPMAXU16,
++ SPARC_BUILTIN_FPMAXU32,
++ SPARC_BUILTIN_FPMIN8,
++ SPARC_BUILTIN_FPMIN16,
++ SPARC_BUILTIN_FPMIN32,
++ SPARC_BUILTIN_FPMINU8,
++ SPARC_BUILTIN_FPMINU16,
++ SPARC_BUILTIN_FPMINU32,
++ SPARC_BUILTIN_FPSUB8,
++ SPARC_BUILTIN_FPSUBS8,
++ SPARC_BUILTIN_FPSUBUS8,
++ SPARC_BUILTIN_FPSUBUS16,
++
+ SPARC_BUILTIN_MAX
+ };
+
+@@ -10483,6 +10615,83 @@
+ def_builtin_const ("__builtin_vis_xmulxhi", CODE_FOR_xmulxhi_vis,
+ SPARC_BUILTIN_XMULXHI, di_ftype_di_di);
+ }
++
++ if (TARGET_VIS4)
++ {
++ def_builtin_const ("__builtin_vis_fpadd8", CODE_FOR_addv8qi3,
++ SPARC_BUILTIN_FPADD8, v8qi_ftype_v8qi_v8qi);
++ def_builtin_const ("__builtin_vis_fpadds8", CODE_FOR_ssaddv8qi3,
++ SPARC_BUILTIN_FPADDS8, v8qi_ftype_v8qi_v8qi);
++ def_builtin_const ("__builtin_vis_fpaddus8", CODE_FOR_usaddv8qi3,
++ SPARC_BUILTIN_FPADDUS8, v8qi_ftype_v8qi_v8qi);
++ def_builtin_const ("__builtin_vis_fpaddus16", CODE_FOR_usaddv4hi3,
++ SPARC_BUILTIN_FPADDUS16, v4hi_ftype_v4hi_v4hi);
++
++
++ if (TARGET_ARCH64)
++ {
++ def_builtin_const ("__builtin_vis_fpcmple8", CODE_FOR_fpcmple8di_vis,
++ SPARC_BUILTIN_FPCMPLE8, di_ftype_v8qi_v8qi);
++ def_builtin_const ("__builtin_vis_fpcmpgt8", CODE_FOR_fpcmpgt8di_vis,
++ SPARC_BUILTIN_FPCMPGT8, di_ftype_v8qi_v8qi);
++ def_builtin_const ("__builtin_vis_fpcmpule16", CODE_FOR_fpcmpule16di_vis,
++ SPARC_BUILTIN_FPCMPULE16, di_ftype_v4hi_v4hi);
++ def_builtin_const ("__builtin_vis_fpcmpugt16", CODE_FOR_fpcmpugt16di_vis,
++ SPARC_BUILTIN_FPCMPUGT16, di_ftype_v4hi_v4hi);
++ def_builtin_const ("__builtin_vis_fpcmpule32", CODE_FOR_fpcmpule32di_vis,
++ SPARC_BUILTIN_FPCMPULE32, di_ftype_v2si_v2si);
++ def_builtin_const ("__builtin_vis_fpcmpugt32", CODE_FOR_fpcmpugt32di_vis,
++ SPARC_BUILTIN_FPCMPUGT32, di_ftype_v2si_v2si);
++ }
++ else
++ {
++ def_builtin_const ("__builtin_vis_fpcmple8", CODE_FOR_fpcmple8si_vis,
++ SPARC_BUILTIN_FPCMPLE8, si_ftype_v8qi_v8qi);
++ def_builtin_const ("__builtin_vis_fpcmpgt8", CODE_FOR_fpcmpgt8si_vis,
++ SPARC_BUILTIN_FPCMPGT8, si_ftype_v8qi_v8qi);
++ def_builtin_const ("__builtin_vis_fpcmpule16", CODE_FOR_fpcmpule16si_vis,
++ SPARC_BUILTIN_FPCMPULE16, si_ftype_v4hi_v4hi);
++ def_builtin_const ("__builtin_vis_fpcmpugt16", CODE_FOR_fpcmpugt16si_vis,
++ SPARC_BUILTIN_FPCMPUGT16, si_ftype_v4hi_v4hi);
++ def_builtin_const ("__builtin_vis_fpcmpule32", CODE_FOR_fpcmpule32si_vis,
++ SPARC_BUILTIN_FPCMPULE32, di_ftype_v2si_v2si);
++ def_builtin_const ("__builtin_vis_fpcmpugt32", CODE_FOR_fpcmpugt32si_vis,
++ SPARC_BUILTIN_FPCMPUGT32, di_ftype_v2si_v2si);
++ }
++
++ def_builtin_const ("__builtin_vis_fpmax8", CODE_FOR_maxv8qi3,
++ SPARC_BUILTIN_FPMAX8, v8qi_ftype_v8qi_v8qi);
++ def_builtin_const ("__builtin_vis_fpmax16", CODE_FOR_maxv4hi3,
++ SPARC_BUILTIN_FPMAX16, v4hi_ftype_v4hi_v4hi);
++ def_builtin_const ("__builtin_vis_fpmax32", CODE_FOR_maxv2si3,
++ SPARC_BUILTIN_FPMAX32, v2si_ftype_v2si_v2si);
++ def_builtin_const ("__builtin_vis_fpmaxu8", CODE_FOR_maxuv8qi3,
++ SPARC_BUILTIN_FPMAXU8, v8qi_ftype_v8qi_v8qi);
++ def_builtin_const ("__builtin_vis_fpmaxu16", CODE_FOR_maxuv4hi3,
++ SPARC_BUILTIN_FPMAXU16, v4hi_ftype_v4hi_v4hi);
++ def_builtin_const ("__builtin_vis_fpmaxu32", CODE_FOR_maxuv2si3,
++ SPARC_BUILTIN_FPMAXU32, v2si_ftype_v2si_v2si);
++ def_builtin_const ("__builtin_vis_fpmin8", CODE_FOR_minv8qi3,
++ SPARC_BUILTIN_FPMIN8, v8qi_ftype_v8qi_v8qi);
++ def_builtin_const ("__builtin_vis_fpmin16", CODE_FOR_minv4hi3,
++ SPARC_BUILTIN_FPMIN16, v4hi_ftype_v4hi_v4hi);
++ def_builtin_const ("__builtin_vis_fpmin32", CODE_FOR_minv2si3,
++ SPARC_BUILTIN_FPMIN32, v2si_ftype_v2si_v2si);
++ def_builtin_const ("__builtin_vis_fpminu8", CODE_FOR_minuv8qi3,
++ SPARC_BUILTIN_FPMINU8, v8qi_ftype_v8qi_v8qi);
++ def_builtin_const ("__builtin_vis_fpminu16", CODE_FOR_minuv4hi3,
++ SPARC_BUILTIN_FPMINU16, v4hi_ftype_v4hi_v4hi);
++ def_builtin_const ("__builtin_vis_fpminu32", CODE_FOR_minuv2si3,
++ SPARC_BUILTIN_FPMINU32, v2si_ftype_v2si_v2si);
++ def_builtin_const ("__builtin_vis_fpsub8", CODE_FOR_subv8qi3,
++ SPARC_BUILTIN_FPSUB8, v8qi_ftype_v8qi_v8qi);
++ def_builtin_const ("__builtin_vis_fpsubs8", CODE_FOR_sssubv8qi3,
++ SPARC_BUILTIN_FPSUBS8, v8qi_ftype_v8qi_v8qi);
++ def_builtin_const ("__builtin_vis_fpsubus8", CODE_FOR_ussubv8qi3,
++ SPARC_BUILTIN_FPSUBUS8, v8qi_ftype_v8qi_v8qi);
++ def_builtin_const ("__builtin_vis_fpsubus16", CODE_FOR_ussubv4hi3,
++ SPARC_BUILTIN_FPSUBUS16, v4hi_ftype_v4hi_v4hi);
++ }
+ }
+
+ /* Implement TARGET_BUILTIN_DECL hook. */
+@@ -11042,7 +11251,8 @@
+ || sparc_cpu == PROCESSOR_NIAGARA
+ || sparc_cpu == PROCESSOR_NIAGARA2
+ || sparc_cpu == PROCESSOR_NIAGARA3
+- || sparc_cpu == PROCESSOR_NIAGARA4)
++ || sparc_cpu == PROCESSOR_NIAGARA4
++ || sparc_cpu == PROCESSOR_NIAGARA7)
+ return 12;
+
+ return 6;
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/config/sparc/sparc.h gcc-6-20160721/gcc/config/sparc/sparc.h
+--- gcc-6.1.0/gcc/config/sparc/sparc.h 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/gcc/config/sparc/sparc.h 2016-06-08 13:34:25.000000000 +0000
+@@ -142,6 +142,7 @@
+ #define TARGET_CPU_niagara2 14
+ #define TARGET_CPU_niagara3 15
+ #define TARGET_CPU_niagara4 16
++#define TARGET_CPU_niagara7 19
+
+ #if TARGET_CPU_DEFAULT == TARGET_CPU_v9 \
+ || TARGET_CPU_DEFAULT == TARGET_CPU_ultrasparc \
+@@ -149,7 +150,8 @@
+ || TARGET_CPU_DEFAULT == TARGET_CPU_niagara \
+ || TARGET_CPU_DEFAULT == TARGET_CPU_niagara2 \
+ || TARGET_CPU_DEFAULT == TARGET_CPU_niagara3 \
+- || TARGET_CPU_DEFAULT == TARGET_CPU_niagara4
++ || TARGET_CPU_DEFAULT == TARGET_CPU_niagara4 \
++ || TARGET_CPU_DEFAULT == TARGET_CPU_niagara7
+
+ #define CPP_CPU32_DEFAULT_SPEC ""
+ #define ASM_CPU32_DEFAULT_SPEC ""
+@@ -186,6 +188,10 @@
+ #define CPP_CPU64_DEFAULT_SPEC "-D__sparc_v9__"
+ #define ASM_CPU64_DEFAULT_SPEC AS_NIAGARA4_FLAG
+ #endif
++#if TARGET_CPU_DEFAULT == TARGET_CPU_niagara7
++#define CPP_CPU64_DEFAULT_SPEC "-D__sparc_v9__"
++#define ASM_CPU64_DEFAULT_SPEC AS_NIAGARA7_FLAG
++#endif
+
+ #else
+
+@@ -288,6 +294,7 @@
+ %{mcpu=niagara2:-D__sparc_v9__} \
+ %{mcpu=niagara3:-D__sparc_v9__} \
+ %{mcpu=niagara4:-D__sparc_v9__} \
++%{mcpu=niagara7:-D__sparc_v9__} \
+ %{!mcpu*:%(cpp_cpu_default)} \
+ "
+ #define CPP_ARCH32_SPEC ""
+@@ -339,6 +346,7 @@
+ %{mcpu=niagara2:%{!mv8plus:-Av9b}} \
+ %{mcpu=niagara3:%{!mv8plus:-Av9" AS_NIAGARA3_FLAG "}} \
+ %{mcpu=niagara4:%{!mv8plus:" AS_NIAGARA4_FLAG "}} \
++%{mcpu=niagara7:%{!mv8plus:" AS_NIAGARA7_FLAG "}} \
+ %{!mcpu*:%(asm_cpu_default)} \
+ "
+
+@@ -1777,6 +1785,12 @@
+ #define AS_NIAGARA4_FLAG "-Av9" AS_NIAGARA3_FLAG
+ #endif
+
++#ifdef HAVE_AS_SPARC5_VIS4
++#define AS_NIAGARA7_FLAG "-xarch=sparc5"
++#else
++#define AS_NIAGARA7_FLAG AS_NIAGARA4_FLAG
++#endif
++
+ #ifdef HAVE_AS_LEON
+ #define AS_LEON_FLAG "-Aleon"
+ #define AS_LEONV7_FLAG "-Aleon"
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/config/sparc/sparc.md gcc-6-20160721/gcc/config/sparc/sparc.md
+--- gcc-6.1.0/gcc/config/sparc/sparc.md 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/gcc/config/sparc/sparc.md 2016-06-08 13:34:25.000000000 +0000
+@@ -234,7 +234,8 @@
+ niagara,
+ niagara2,
+ niagara3,
+- niagara4"
++ niagara4,
++ niagara7"
+ (const (symbol_ref "sparc_cpu_attr")))
+
+ ;; Attribute for the instruction set.
+@@ -247,7 +248,7 @@
+ (symbol_ref "TARGET_SPARCLET") (const_string "sparclet")]
+ (const_string "v7"))))
+
+-(define_attr "cpu_feature" "none,fpu,fpunotv9,v9,vis,vis3" (const_string "none"))
++(define_attr "cpu_feature" "none,fpu,fpunotv9,v9,vis,vis3,vis4" (const_string "none"))
+
+ (define_attr "enabled" ""
+ (cond [(eq_attr "cpu_feature" "none") (const_int 1)
+@@ -255,7 +256,8 @@
+ (eq_attr "cpu_feature" "fpunotv9") (symbol_ref "TARGET_FPU && ! TARGET_V9")
+ (eq_attr "cpu_feature" "v9") (symbol_ref "TARGET_V9")
+ (eq_attr "cpu_feature" "vis") (symbol_ref "TARGET_VIS")
+- (eq_attr "cpu_feature" "vis3") (symbol_ref "TARGET_VIS3")]
++ (eq_attr "cpu_feature" "vis3") (symbol_ref "TARGET_VIS3")
++ (eq_attr "cpu_feature" "vis4") (symbol_ref "TARGET_VIS4")]
+ (const_int 0)))
+
+ ;; Insn type.
+@@ -274,7 +276,7 @@
+ fga,visl,vismv,fgm_pack,fgm_mul,pdist,pdistn,edge,edgen,gsr,array,
+ cmove,
+ ialuX,
+- multi,savew,flushw,iflush,trap"
++ multi,savew,flushw,iflush,trap,lzd"
+ (const_string "ialu"))
+
+ ;; True if branch/call has empty delay slot and will emit a nop in it
+@@ -476,6 +478,10 @@
+ (const_string "true")
+ ] (const_string "false")))
+
++;; True if the instruction executes in the V3 pipeline, in M7 and
++;; later processors.
++(define_attr "v3pipe" "false,true" (const_string "false"))
++
+ (define_delay (eq_attr "type" "call")
+ [(eq_attr "in_call_delay" "true") (nil) (nil)])
+
+@@ -504,6 +510,7 @@
+ (include "niagara.md")
+ (include "niagara2.md")
+ (include "niagara4.md")
++(include "niagara7.md")
+
+
+ ;; Operand and operator predicates and constraints
+@@ -1457,6 +1464,7 @@
+ fzeros\t%0
+ fones\t%0"
+ [(set_attr "type" "*,*,load,store,vismv,vismv,fpmove,fpload,fpstore,visl,visl")
++ (set_attr "v3pipe" "*,*,*,*,true,true,*,*,*,true,true")
+ (set_attr "cpu_feature" "*,*,*,*,vis3,vis3,*,*,*,vis,vis")])
+
+ (define_insn "*movsi_lo_sum"
+@@ -1622,6 +1630,7 @@
+ fzero\t%0
+ fone\t%0"
+ [(set_attr "type" "store,store,store,load,*,*,*,*,fpstore,fpload,*,*,fpmove,*,*,*,fpload,fpstore,visl,visl")
++ (set_attr "v3pipe" "false, false, false, false,false,false,false,false,false,false,false,false,false,false,false,false,false,false, true, true")
+ (set_attr "length" "*,2,*,*,2,2,2,2,*,*,2,2,*,2,2,2,*,*,*,*")
+ (set_attr "fptype" "*,*,*,*,*,*,*,*,*,*,*,*,double,*,*,*,*,*,double,double")
+ (set_attr "cpu_feature" "v9,*,*,*,*,*,*,*,fpu,fpu,fpu,fpu,v9,fpunotv9,vis3,vis3,fpu,fpu,vis,vis")])
+@@ -1645,6 +1654,7 @@
+ fzero\t%0
+ fone\t%0"
+ [(set_attr "type" "*,*,load,store,vismv,vismv,fpmove,fpload,fpstore,visl,visl")
++ (set_attr "v3pipe" "*, *, *, *, *, *, *, *, *, true, true")
+ (set_attr "fptype" "*,*,*,*,*,*,double,*,*,double,double")
+ (set_attr "cpu_feature" "*,*,*,*,vis3,vis3,*,*,*,vis,vis")])
+
+@@ -2208,6 +2218,7 @@
+ }
+ }
+ [(set_attr "type" "visl,visl,fpmove,*,*,*,vismv,vismv,fpload,load,fpstore,store")
++ (set_attr "v3pipe" "true, true, *, *, *, *, true, true, *, *, *, *")
+ (set_attr "cpu_feature" "vis,vis,fpu,*,*,*,vis3,vis3,fpu,*,fpu,*")])
+
+ ;; The following 3 patterns build SFmode constants in integer registers.
+@@ -2276,6 +2287,7 @@
+ #
+ #"
+ [(set_attr "type" "visl,visl,fpmove,*,*,*,fpload,store,fpstore,load,store,*,*,*,*")
++ (set_attr "v3pipe" "true, true, *, *, *, *, *, *, *, *, *, *, *, *, *")
+ (set_attr "length" "*,*,*,2,2,2,*,*,*,*,*,2,2,2,2")
+ (set_attr "fptype" "double,double,double,*,*,*,*,*,*,*,*,*,*,*,*")
+ (set_attr "cpu_feature" "vis,vis,v9,fpunotv9,vis3,vis3,fpu,v9,fpu,*,*,fpu,*,*,fpu")])
+@@ -2299,6 +2311,7 @@
+ stx\t%r1, %0
+ #"
+ [(set_attr "type" "visl,visl,fpmove,vismv,vismv,load,store,*,load,store,*")
++ (set_attr "v3pipe" "true, true, *, *, *, *, *, *, *, *, *")
+ (set_attr "length" "*,*,*,*,*,*,*,*,*,*,2")
+ (set_attr "fptype" "double,double,double,double,double,*,*,*,*,*,*")
+ (set_attr "cpu_feature" "vis,vis,fpu,vis3,vis3,fpu,fpu,*,*,*,*")])
+@@ -2980,6 +2993,7 @@
+ lduw\t%1, %0
+ movstouw\t%1, %0"
+ [(set_attr "type" "shift,load,*")
++ (set_attr "v3pipe" "*,*,true")
+ (set_attr "cpu_feature" "*,*,vis3")])
+
+ (define_insn_and_split "*zero_extendsidi2_insn_sp32"
+@@ -3294,6 +3308,7 @@
+ ldsw\t%1, %0
+ movstosw\t%1, %0"
+ [(set_attr "type" "shift,sload,*")
++ (set_attr "v3pipe" "*,*,true")
+ (set_attr "us3load_type" "*,3cycle,*")
+ (set_attr "cpu_feature" "*,*,vis3")])
+
+@@ -6770,7 +6785,8 @@
+ [(set (match_operand:DI 0 "register_operand" "=r")
+ (clz:DI (match_operand:DI 1 "register_operand" "r")))]
+ "TARGET_VIS3 && TARGET_ARCH64"
+- "lzd\t%1, %0")
++ "lzd\t%1, %0"
++ [(set_attr "type" "lzd")])
+
+ (define_insn "clzdi_v8plus"
+ [(set (match_operand:DI 0 "register_operand" "=r")
+@@ -6811,7 +6827,8 @@
+ (truncate:SI
+ (clz:DI (match_operand:DI 1 "register_operand" "r"))))]
+ "TARGET_VIS3 && TARGET_ARCH64"
+- "lzd\t%1, %0")
++ "lzd\t%1, %0"
++ [(set_attr "type" "lzd")])
+
+ (define_insn "clzsi_v8plus"
+ [(set (match_operand:SI 0 "register_operand" "=r")
+@@ -7777,7 +7794,7 @@
+ (define_mode_iterator VM64 [V1DI V2SI V4HI V8QI])
+ (define_mode_iterator VMALL [V1SI V2HI V4QI V1DI V2SI V4HI V8QI])
+
+-(define_mode_attr vbits [(V2SI "32") (V4HI "16") (V1SI "32s") (V2HI "16s")])
++(define_mode_attr vbits [(V2SI "32") (V4HI "16") (V1SI "32s") (V2HI "16s") (V8QI "8")])
+ (define_mode_attr vconstr [(V1SI "f") (V2HI "f") (V4QI "f")
+ (V1DI "e") (V2SI "e") (V4HI "e") (V8QI "e")])
+ (define_mode_attr vfptype [(V1SI "single") (V2HI "single") (V4QI "single")
+@@ -7812,6 +7829,7 @@
+ movstouw\t%1, %0
+ movwtos\t%1, %0"
+ [(set_attr "type" "visl,visl,vismv,fpload,fpstore,store,load,store,*,vismv,vismv")
++ (set_attr "v3pipe" "true,true,true,false,false,false,false,false,false,true,true")
+ (set_attr "cpu_feature" "vis,vis,vis,*,*,*,*,*,*,vis3,vis3")])
+
+ (define_insn "*mov<VM64:mode>_insn_sp64"
+@@ -7834,6 +7852,7 @@
+ movxtod\t%1, %0
+ mov\t%1, %0"
+ [(set_attr "type" "visl,visl,vismv,fpload,fpstore,store,load,store,vismv,vismv,*")
++ (set_attr "v3pipe" "true, true, true, false, false, false, false, false, false, false, false")
+ (set_attr "cpu_feature" "vis,vis,vis,*,*,*,*,*,vis3,vis3,*")])
+
+ (define_insn "*mov<VM64:mode>_insn_sp32"
+@@ -7857,6 +7876,7 @@
+ #
+ #"
+ [(set_attr "type" "visl,visl,vismv,*,*,fpload,fpstore,store,load,store,*,*")
++ (set_attr "v3pipe" "true, true, true, false, false, false, false, false, false, false, false, false")
+ (set_attr "length" "*,*,*,2,2,*,*,*,*,*,2,2")
+ (set_attr "cpu_feature" "vis,vis,vis,vis3,vis3,*,*,*,*,*,*,*")])
+
+@@ -7936,7 +7956,8 @@
+ "TARGET_VIS"
+ "fp<plusminus_insn><vbits>\t%1, %2, %0"
+ [(set_attr "type" "fga")
+- (set_attr "fptype" "<vfptype>")])
++ (set_attr "fptype" "<vfptype>")
++ (set_attr "v3pipe" "true")])
+
+ (define_mode_iterator VL [V1SI V2HI V4QI V1DI V2SI V4HI V8QI])
+ (define_mode_attr vlsuf [(V1SI "s") (V2HI "s") (V4QI "s")
+@@ -7952,6 +7973,7 @@
+ "TARGET_VIS"
+ "f<vlinsn><vlsuf>\t%1, %2, %0"
+ [(set_attr "type" "visl")
++ (set_attr "v3pipe" "true")
+ (set_attr "fptype" "<vfptype>")])
+
+ (define_insn "*not_<code><mode>3"
+@@ -7961,6 +7983,7 @@
+ "TARGET_VIS"
+ "f<vlninsn><vlsuf>\t%1, %2, %0"
+ [(set_attr "type" "visl")
++ (set_attr "v3pipe" "true")
+ (set_attr "fptype" "<vfptype>")])
+
+ ;; (ior (not (op1)) (not (op2))) is the canonical form of NAND.
+@@ -7971,6 +7994,7 @@
+ "TARGET_VIS"
+ "fnand<vlsuf>\t%1, %2, %0"
+ [(set_attr "type" "visl")
++ (set_attr "v3pipe" "true")
+ (set_attr "fptype" "<vfptype>")])
+
+ (define_code_iterator vlnotop [ior and])
+@@ -7982,6 +8006,7 @@
+ "TARGET_VIS"
+ "f<vlinsn>not1<vlsuf>\t%1, %2, %0"
+ [(set_attr "type" "visl")
++ (set_attr "v3pipe" "true")
+ (set_attr "fptype" "<vfptype>")])
+
+ (define_insn "*<code>_not2<mode>_vis"
+@@ -7991,6 +8016,7 @@
+ "TARGET_VIS"
+ "f<vlinsn>not2<vlsuf>\t%1, %2, %0"
+ [(set_attr "type" "visl")
++ (set_attr "v3pipe" "true")
+ (set_attr "fptype" "<vfptype>")])
+
+ (define_insn "one_cmpl<mode>2"
+@@ -7999,6 +8025,7 @@
+ "TARGET_VIS"
+ "fnot1<vlsuf>\t%1, %0"
+ [(set_attr "type" "visl")
++ (set_attr "v3pipe" "true")
+ (set_attr "fptype" "<vfptype>")])
+
+ ;; Hard to generate VIS instructions. We have builtins for these.
+@@ -8225,7 +8252,8 @@
+ "TARGET_VIS"
+ "faligndata\t%1, %2, %0"
+ [(set_attr "type" "fga")
+- (set_attr "fptype" "double")])
++ (set_attr "fptype" "double")
++ (set_attr "v3pipe" "true")])
+
+ (define_insn "alignaddrsi_vis"
+ [(set (match_operand:SI 0 "register_operand" "=r")
+@@ -8235,7 +8263,8 @@
+ (zero_extend:DI (plus:SI (match_dup 1) (match_dup 2))))]
+ "TARGET_VIS"
+ "alignaddr\t%r1, %r2, %0"
+- [(set_attr "type" "gsr")])
++ [(set_attr "type" "gsr")
++ (set_attr "v3pipe" "true")])
+
+ (define_insn "alignaddrdi_vis"
+ [(set (match_operand:DI 0 "register_operand" "=r")
+@@ -8245,7 +8274,8 @@
+ (plus:DI (match_dup 1) (match_dup 2)))]
+ "TARGET_VIS"
+ "alignaddr\t%r1, %r2, %0"
+- [(set_attr "type" "gsr")])
++ [(set_attr "type" "gsr")
++ (set_attr "v3pipe" "true")])
+
+ (define_insn "alignaddrlsi_vis"
+ [(set (match_operand:SI 0 "register_operand" "=r")
+@@ -8256,7 +8286,8 @@
+ (const_int 7)))]
+ "TARGET_VIS"
+ "alignaddrl\t%r1, %r2, %0"
+- [(set_attr "type" "gsr")])
++ [(set_attr "type" "gsr")
++ (set_attr "v3pipe" "true")])
+
+ (define_insn "alignaddrldi_vis"
+ [(set (match_operand:DI 0 "register_operand" "=r")
+@@ -8267,7 +8298,8 @@
+ (const_int 7)))]
+ "TARGET_VIS"
+ "alignaddrl\t%r1, %r2, %0"
+- [(set_attr "type" "gsr")])
++ [(set_attr "type" "gsr")
++ (set_attr "v3pipe" "true")])
+
+ (define_insn "pdist_vis"
+ [(set (match_operand:DI 0 "register_operand" "=e")
+@@ -8360,6 +8392,17 @@
+ "TARGET_VIS"
+ "fcmp<code><GCM:gcm_name>\t%1, %2, %0"
+ [(set_attr "type" "visl")
++ (set_attr "v3pipe" "true")
++ (set_attr "fptype" "double")])
++
++(define_insn "fpcmp<code>8<P:mode>_vis"
++ [(set (match_operand:P 0 "register_operand" "=r")
++ (unspec:P [(gcond:V8QI (match_operand:V8QI 1 "register_operand" "e")
++ (match_operand:V8QI 2 "register_operand" "e"))]
++ UNSPEC_FCMP))]
++ "TARGET_VIS4"
++ "fpcmp<code>8\t%1, %2, %0"
++ [(set_attr "type" "visl")
+ (set_attr "fptype" "double")])
+
+ (define_expand "vcond<mode><mode>"
+@@ -8427,7 +8470,8 @@
+ (plus:DI (match_dup 1) (match_dup 2)))]
+ "TARGET_VIS2"
+ "bmask\t%r1, %r2, %0"
+- [(set_attr "type" "array")])
++ [(set_attr "type" "array")
++ (set_attr "v3pipe" "true")])
+
+ (define_insn "bmasksi_vis"
+ [(set (match_operand:SI 0 "register_operand" "=r")
+@@ -8437,7 +8481,8 @@
+ (zero_extend:DI (plus:SI (match_dup 1) (match_dup 2))))]
+ "TARGET_VIS2"
+ "bmask\t%r1, %r2, %0"
+- [(set_attr "type" "array")])
++ [(set_attr "type" "array")
++ (set_attr "v3pipe" "true")])
+
+ (define_insn "bshuffle<VM64:mode>_vis"
+ [(set (match_operand:VM64 0 "register_operand" "=e")
+@@ -8448,7 +8493,8 @@
+ "TARGET_VIS2"
+ "bshuffle\t%1, %2, %0"
+ [(set_attr "type" "fga")
+- (set_attr "fptype" "double")])
++ (set_attr "fptype" "double")
++ (set_attr "v3pipe" "true")])
+
+ ;; The rtl expanders will happily convert constant permutations on other
+ ;; modes down to V8QI. Rely on this to avoid the complexity of the byte
+@@ -8550,7 +8596,8 @@
+ UNSPEC_CMASK8))]
+ "TARGET_VIS3"
+ "cmask8\t%r0"
+- [(set_attr "type" "fga")])
++ [(set_attr "type" "fga")
++ (set_attr "v3pipe" "true")])
+
+ (define_insn "cmask16<P:mode>_vis"
+ [(set (reg:DI GSR_REG)
+@@ -8559,7 +8606,8 @@
+ UNSPEC_CMASK16))]
+ "TARGET_VIS3"
+ "cmask16\t%r0"
+- [(set_attr "type" "fga")])
++ [(set_attr "type" "fga")
++ (set_attr "v3pipe" "true")])
+
+ (define_insn "cmask32<P:mode>_vis"
+ [(set (reg:DI GSR_REG)
+@@ -8568,7 +8616,8 @@
+ UNSPEC_CMASK32))]
+ "TARGET_VIS3"
+ "cmask32\t%r0"
+- [(set_attr "type" "fga")])
++ [(set_attr "type" "fga")
++ (set_attr "v3pipe" "true")])
+
+ (define_insn "fchksm16_vis"
+ [(set (match_operand:V4HI 0 "register_operand" "=e")
+@@ -8601,6 +8650,7 @@
+ "TARGET_VIS3"
+ "pdistn\t%1, %2, %0"
+ [(set_attr "type" "pdistn")
++ (set_attr "v3pipe" "true")
+ (set_attr "fptype" "double")])
+
+ (define_insn "fmean16_vis"
+@@ -8628,6 +8678,14 @@
+ "fp<plusminus_insn>64\t%1, %2, %0"
+ [(set_attr "type" "fga")])
+
++(define_insn "<plusminus_insn>v8qi3"
++ [(set (match_operand:V8QI 0 "register_operand" "=e")
++ (plusminus:V8QI (match_operand:V8QI 1 "register_operand" "e")
++ (match_operand:V8QI 2 "register_operand" "e")))]
++ "TARGET_VIS4"
++ "fp<plusminus_insn>8\t%1, %2, %0"
++ [(set_attr "type" "fga")])
++
+ (define_mode_iterator VASS [V4HI V2SI V2HI V1SI])
+ (define_code_iterator vis3_addsub_ss [ss_plus ss_minus])
+ (define_code_attr vis3_addsub_ss_insn
+@@ -8641,8 +8699,63 @@
+ (match_operand:VASS 2 "register_operand" "<vconstr>")))]
+ "TARGET_VIS3"
+ "<vis3_addsub_ss_insn><vbits>\t%1, %2, %0"
++ [(set_attr "type" "fga")
++ (set_attr "v3pipe" "true")])
++
++(define_mode_iterator VMMAX [V8QI V4HI V2SI])
++(define_code_iterator vis4_minmax [smin smax])
++(define_code_attr vis4_minmax_insn
++ [(smin "fpmin") (smax "fpmax")])
++(define_code_attr vis4_minmax_patname
++ [(smin "min") (smax "max")])
++
++(define_insn "<vis4_minmax_patname><mode>3"
++ [(set (match_operand:VMMAX 0 "register_operand" "=<vconstr>")
++ (vis4_minmax:VMMAX (match_operand:VMMAX 1 "register_operand" "<vconstr>")
++ (match_operand:VMMAX 2 "register_operand" "<vconstr>")))]
++ "TARGET_VIS4"
++ "<vis4_minmax_insn><vbits>\t%1, %2, %0"
++ [(set_attr "type" "fga")])
++
++(define_code_iterator vis4_uminmax [umin umax])
++(define_code_attr vis4_uminmax_insn
++ [(umin "fpminu") (umax "fpmaxu")])
++(define_code_attr vis4_uminmax_patname
++ [(umin "minu") (umax "maxu")])
++
++(define_insn "<vis4_uminmax_patname><mode>3"
++ [(set (match_operand:VMMAX 0 "register_operand" "=<vconstr>")
++ (vis4_uminmax:VMMAX (match_operand:VMMAX 1 "register_operand" "<vconstr>")
++ (match_operand:VMMAX 2 "register_operand" "<vconstr>")))]
++ "TARGET_VIS4"
++ "<vis4_uminmax_insn><vbits>\t%1, %2, %0"
++ [(set_attr "type" "fga")])
++
++;; The use of vis3_addsub_ss_patname in the VIS4 instruction below is
++;; intended.
++(define_insn "<vis3_addsub_ss_patname>v8qi3"
++ [(set (match_operand:V8QI 0 "register_operand" "=e")
++ (vis3_addsub_ss:V8QI (match_operand:V8QI 1 "register_operand" "e")
++ (match_operand:V8QI 2 "register_operand" "e")))]
++ "TARGET_VIS4"
++ "<vis3_addsub_ss_insn>8\t%1, %2, %0"
+ [(set_attr "type" "fga")])
+
++(define_mode_iterator VAUS [V4HI V8QI])
++(define_code_iterator vis4_addsub_us [us_plus us_minus])
++(define_code_attr vis4_addsub_us_insn
++ [(us_plus "fpaddus") (us_minus "fpsubus")])
++(define_code_attr vis4_addsub_us_patname
++ [(us_plus "usadd") (us_minus "ussub")])
++
++(define_insn "<vis4_addsub_us_patname><mode>3"
++ [(set (match_operand:VAUS 0 "register_operand" "=<vconstr>")
++ (vis4_addsub_us:VAUS (match_operand:VAUS 1 "register_operand" "<vconstr>")
++ (match_operand:VAUS 2 "register_operand" "<vconstr>")))]
++ "TARGET_VIS4"
++ "<vis4_addsub_us_insn><vbits>\t%1, %2, %0"
++ [(set_attr "type" "fga")])
++
+ (define_insn "fucmp<code>8<P:mode>_vis"
+ [(set (match_operand:P 0 "register_operand" "=r")
+ (unspec:P [(gcond:V8QI (match_operand:V8QI 1 "register_operand" "e")
+@@ -8650,7 +8763,18 @@
+ UNSPEC_FUCMP))]
+ "TARGET_VIS3"
+ "fucmp<code>8\t%1, %2, %0"
+- [(set_attr "type" "visl")])
++ [(set_attr "type" "visl")
++ (set_attr "v3pipe" "true")])
++
++(define_insn "fpcmpu<code><GCM:gcm_name><P:mode>_vis"
++ [(set (match_operand:P 0 "register_operand" "=r")
++ (unspec:P [(gcond:GCM (match_operand:GCM 1 "register_operand" "e")
++ (match_operand:GCM 2 "register_operand" "e"))]
++ UNSPEC_FUCMP))]
++ "TARGET_VIS4"
++ "fpcmpu<code><GCM:gcm_name>\t%1, %2, %0"
++ [(set_attr "type" "visl")
++ (set_attr "fptype" "double")])
+
+ (define_insn "*naddsf3"
+ [(set (match_operand:SF 0 "register_operand" "=f")
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/config/sparc/sparc.opt gcc-6-20160721/gcc/config/sparc/sparc.opt
+--- gcc-6.1.0/gcc/config/sparc/sparc.opt 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/gcc/config/sparc/sparc.opt 2016-06-08 13:34:25.000000000 +0000
+@@ -73,6 +73,10 @@
+ Target Report Mask(VIS3)
+ Use UltraSPARC Visual Instruction Set version 3.0 extensions.
+
++mvis4
++Target Report Mask(VIS4)
++Use UltraSPARC Visual Instruction Set version 4.0 extensions.
++
+ mcbcond
+ Target Report Mask(CBCOND)
+ Use UltraSPARC Compare-and-Branch extensions.
+@@ -194,6 +198,9 @@
+ EnumValue
+ Enum(sparc_processor_type) String(niagara4) Value(PROCESSOR_NIAGARA4)
+
++EnumValue
++Enum(sparc_processor_type) String(niagara7) Value(PROCESSOR_NIAGARA7)
++
+ mcmodel=
+ Target RejectNegative Joined Var(sparc_cmodel_string)
+ Use given SPARC-V9 code model.
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/config/sparc/visintrin.h gcc-6-20160721/gcc/config/sparc/visintrin.h
+--- gcc-6.1.0/gcc/config/sparc/visintrin.h 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/gcc/config/sparc/visintrin.h 2016-06-08 13:34:25.000000000 +0000
+@@ -704,6 +704,192 @@
+
+ #endif /* __VIS__ >= 0x300 */
+
++#if __VIS__ >= 0x400
++
++extern __inline __v8qi
++__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
++__vis_fpadd8 (__v8qi __A, __v8qi __B)
++{
++ return __builtin_vis_fpadd8 (__A, __B);
++}
++
++extern __inline __v8qi
++__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
++__vis_fpadds8 (__v8qi __A, __v8qi __B)
++{
++ return __builtin_vis_fpadds8 (__A, __B);
++}
++
++extern __inline __v8qi
++__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
++__vis_fpaddus8 (__v8qi __A, __v8qi __B)
++{
++ return __builtin_vis_fpaddus8 (__A, __B);
++}
++
++extern __inline __v4hi
++__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
++__vis_fpaddus16 (__v4hi __A, __v4hi __B)
++{
++ return __builtin_vis_fpaddus16 (__A, __B);
++}
++
++extern __inline long
++__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
++__vis_fpcmple8 (__v8qi __A, __v8qi __B)
++{
++ return __builtin_vis_fpcmple8 (__A, __B);
++}
++
++extern __inline long
++__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
++__vis_fpcmpgt8 (__v8qi __A, __v8qi __B)
++{
++ return __builtin_vis_fpcmpgt8 (__A, __B);
++}
++
++extern __inline long
++__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
++__vis_fpcmpule16 (__v4hi __A, __v4hi __B)
++{
++ return __builtin_vis_fpcmpule16 (__A, __B);
++}
++
++extern __inline long
++__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
++__vis_fpcmpugt16 (__v4hi __A, __v4hi __B)
++{
++ return __builtin_vis_fpcmpugt16 (__A, __B);
++}
++
++extern __inline long
++__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
++__vis_fpcmpule32 (__v2si __A, __v2si __B)
++{
++ return __builtin_vis_fpcmpule32 (__A, __B);
++}
++
++extern __inline long
++__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
++__vis_fpcmpugt32 (__v2si __A, __v2si __B)
++{
++ return __builtin_vis_fpcmpugt32 (__A, __B);
++}
++
++extern __inline __v8qi
++__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
++__vis_fpmax8 (__v8qi __A, __v8qi __B)
++{
++ return __builtin_vis_fpmax8 (__A, __B);
++}
++
++extern __inline __v4hi
++__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
++__vis_fpmax16 (__v4hi __A, __v4hi __B)
++{
++ return __builtin_vis_fpmax16 (__A, __B);
++}
++
++extern __inline __v2si
++__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
++__vis_fpmax32 (__v2si __A, __v2si __B)
++{
++ return __builtin_vis_fpmax32 (__A, __B);
++}
++
++extern __inline __v8qi
++__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
++__vis_fpmaxu8 (__v8qi __A, __v8qi __B)
++{
++ return __builtin_vis_fpmaxu8 (__A, __B);
++}
++
++extern __inline __v4hi
++__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
++__vis_fpmaxu16 (__v4hi __A, __v4hi __B)
++{
++ return __builtin_vis_fpmaxu16 (__A, __B);
++}
++
++extern __inline __v2si
++__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
++__vis_fpmaxu32 (__v2si __A, __v2si __B)
++{
++ return __builtin_vis_fpmaxu32 (__A, __B);
++}
++
++extern __inline __v8qi
++__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
++__vis_fpmin8 (__v8qi __A, __v8qi __B)
++{
++ return __builtin_vis_fpmin8 (__A, __B);
++}
++
++extern __inline __v4hi
++__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
++__vis_fpmin16 (__v4hi __A, __v4hi __B)
++{
++ return __builtin_vis_fpmin16 (__A, __B);
++}
++
++extern __inline __v2si
++__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
++__vis_fpmin32 (__v2si __A, __v2si __B)
++{
++ return __builtin_vis_fpmin32 (__A, __B);
++}
++
++extern __inline __v8qi
++__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
++__vis_fpminu8 (__v8qi __A, __v8qi __B)
++{
++ return __builtin_vis_fpminu8 (__A, __B);
++}
++
++extern __inline __v4hi
++__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
++__vis_fpminu16 (__v4hi __A, __v4hi __B)
++{
++ return __builtin_vis_fpminu16 (__A, __B);
++}
++
++extern __inline __v2si
++__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
++__vis_fpminu32 (__v2si __A, __v2si __B)
++{
++ return __builtin_vis_fpminu32 (__A, __B);
++}
++
++extern __inline __v8qi
++__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
++__vis_fpsub8 (__v8qi __A, __v8qi __B)
++{
++ return __builtin_vis_fpsub8 (__A, __B);
++}
++
++extern __inline __v8qi
++__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
++__vis_fpsubs8 (__v8qi __A, __v8qi __B)
++{
++ return __builtin_vis_fpsubs8 (__A, __B);
++}
++
++extern __inline __v8qi
++__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
++__vis_fpsubus8 (__v8qi __A, __v8qi __B)
++{
++ return __builtin_vis_fpsubus8 (__A, __B);
++}
++
++extern __inline __v4hi
++__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
++__vis_fpsubus16 (__v4hi __A, __v4hi __B)
++{
++ return __builtin_vis_fpsubus16 (__A, __B);
++}
++
++#endif /* __VIS__ >= 0x400 */
++
+ #endif /* __VIS__ */
+
+ #endif /* _VISINTRIN_H_INCLUDED */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/config/visium/visium-protos.h gcc-6-20160721/gcc/config/visium/visium-protos.h
+--- gcc-6.1.0/gcc/config/visium/visium-protos.h 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/gcc/config/visium/visium-protos.h 2016-05-27 15:09:38.000000000 +0000
+@@ -49,7 +49,8 @@
+ extern const char *output_ubranch (rtx, rtx_insn *);
+ extern const char *output_cbranch (rtx, enum rtx_code, enum machine_mode, int,
+ rtx_insn *);
+-extern void split_double_move (rtx *, enum machine_mode);
++extern void visium_split_double_move (rtx *, enum machine_mode);
++extern void visium_split_double_add (enum rtx_code, rtx, rtx, rtx);
+ extern void visium_expand_copysign (rtx *, enum machine_mode);
+ extern void visium_expand_int_cstore (rtx *, enum machine_mode);
+ extern void visium_expand_fp_cstore (rtx *, enum machine_mode);
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/config/visium/visium.c gcc-6-20160721/gcc/config/visium/visium.c
+--- gcc-6.1.0/gcc/config/visium/visium.c 2016-02-17 11:17:15.000000000 +0000
++++ gcc-6-20160721/gcc/config/visium/visium.c 2016-05-30 08:48:32.000000000 +0000
+@@ -2026,7 +2026,7 @@
+ /* Split a double move of OPERANDS in MODE. */
+
+ void
+-split_double_move (rtx *operands, enum machine_mode mode)
++visium_split_double_move (rtx *operands, enum machine_mode mode)
+ {
+ bool swap = false;
+
+@@ -2076,14 +2076,74 @@
+ }
+ }
+
++/* Split a double addition or subtraction of operands. */
++
++void
++visium_split_double_add (enum rtx_code code, rtx op0, rtx op1, rtx op2)
++{
++ rtx op3 = gen_lowpart (SImode, op0);
++ rtx op4 = gen_lowpart (SImode, op1);
++ rtx op5;
++ rtx op6 = gen_highpart (SImode, op0);
++ rtx op7 = (op1 == const0_rtx ? op1 : gen_highpart (SImode, op1));
++ rtx op8;
++ rtx x, pat, flags;
++
++ /* If operand #2 is a small constant, then its high part is null. */
++ if (CONST_INT_P (op2))
++ {
++ HOST_WIDE_INT val = INTVAL (op2);
++
++ if (val < 0)
++ {
++ code = (code == MINUS ? PLUS : MINUS);
++ val = -val;
++ }
++
++ op5 = gen_int_mode (val, SImode);
++ op8 = const0_rtx;
++ }
++ else
++ {
++ op5 = gen_lowpart (SImode, op2);
++ op8 = gen_highpart (SImode, op2);
++ }
++
++ /* This is the {add,sub,neg}si3_insn_set_flags pattern. */
++ if (op4 == const0_rtx)
++ x = gen_rtx_NEG (SImode, op5);
++ else
++ x = gen_rtx_fmt_ee (code, SImode, op4, op5);
++ pat = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (2));
++ XVECEXP (pat, 0, 0) = gen_rtx_SET (op3, x);
++ flags = gen_rtx_REG (CC_NOOVmode, FLAGS_REGNUM);
++ x = gen_rtx_COMPARE (CC_NOOVmode, shallow_copy_rtx (x), const0_rtx);
++ XVECEXP (pat, 0, 1) = gen_rtx_SET (flags, x);
++ emit_insn (pat);
++
++ /* This is the plus_[plus_]sltu_flags or minus_[minus_]sltu_flags pattern. */
++ if (op8 == const0_rtx)
++ x = op7;
++ else
++ x = gen_rtx_fmt_ee (code, SImode, op7, op8);
++ x = gen_rtx_fmt_ee (code, SImode, x, gen_rtx_LTU (SImode, flags, const0_rtx));
++ pat = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (2));
++ XVECEXP (pat, 0, 0) = gen_rtx_SET (op6, x);
++ flags = gen_rtx_REG (CCmode, FLAGS_REGNUM);
++ XVECEXP (pat, 0, 1) = gen_rtx_CLOBBER (VOIDmode, flags);
++ emit_insn (pat);
++
++ visium_flags_exposed = true;
++}
++
+ /* Expand a copysign of OPERANDS in MODE. */
+
+ void
+ visium_expand_copysign (rtx *operands, enum machine_mode mode)
+ {
+- rtx dest = operands[0];
+- rtx op0 = operands[1];
+- rtx op1 = operands[2];
++ rtx op0 = operands[0];
++ rtx op1 = operands[1];
++ rtx op2 = operands[2];
+ rtx mask = force_reg (SImode, GEN_INT (0x7fffffff));
+ rtx x;
+
+@@ -2091,37 +2151,37 @@
+ the FPU on the MCM have a non-standard behavior wrt NaNs. */
+ gcc_assert (mode == SFmode);
+
+- /* First get all the non-sign bits of OP0. */
+- if (GET_CODE (op0) == CONST_DOUBLE)
++ /* First get all the non-sign bits of op1. */
++ if (GET_CODE (op1) == CONST_DOUBLE)
+ {
+- if (real_isneg (CONST_DOUBLE_REAL_VALUE (op0)))
+- op0 = simplify_unary_operation (ABS, mode, op0, mode);
+- if (op0 != CONST0_RTX (mode))
++ if (real_isneg (CONST_DOUBLE_REAL_VALUE (op1)))
++ op1 = simplify_unary_operation (ABS, mode, op1, mode);
++ if (op1 != CONST0_RTX (mode))
+ {
+ long l;
+- REAL_VALUE_TO_TARGET_SINGLE (*CONST_DOUBLE_REAL_VALUE (op0), l);
+- op0 = force_reg (SImode, GEN_INT (trunc_int_for_mode (l, SImode)));
++ REAL_VALUE_TO_TARGET_SINGLE (*CONST_DOUBLE_REAL_VALUE (op1), l);
++ op1 = force_reg (SImode, gen_int_mode (l, SImode));
+ }
+ }
+ else
+ {
+- op0 = copy_to_mode_reg (SImode, gen_lowpart (SImode, op0));
+- op0 = force_reg (SImode, gen_rtx_AND (SImode, op0, mask));
++ op1 = copy_to_mode_reg (SImode, gen_lowpart (SImode, op1));
++ op1 = force_reg (SImode, gen_rtx_AND (SImode, op1, mask));
+ }
+
+- /* Then get the sign bit of OP1. */
++ /* Then get the sign bit of op2. */
+ mask = force_reg (SImode, gen_rtx_NOT (SImode, mask));
+- op1 = copy_to_mode_reg (SImode, gen_lowpart (SImode, op1));
+- op1 = force_reg (SImode, gen_rtx_AND (SImode, op1, mask));
++ op2 = copy_to_mode_reg (SImode, gen_lowpart (SImode, op2));
++ op2 = force_reg (SImode, gen_rtx_AND (SImode, op2, mask));
+
+ /* Finally OR the two values. */
+- if (op0 == CONST0_RTX (SFmode))
+- x = op1;
++ if (op1 == CONST0_RTX (SFmode))
++ x = op2;
+ else
+- x = force_reg (SImode, gen_rtx_IOR (SImode, op0, op1));
++ x = force_reg (SImode, gen_rtx_IOR (SImode, op1, op2));
+
+ /* And move the result to the destination. */
+- emit_insn (gen_rtx_SET (dest, gen_lowpart (SFmode, x)));
++ emit_insn (gen_rtx_SET (op0, gen_lowpart (SFmode, x)));
+ }
+
+ /* Expand a cstore of OPERANDS in MODE for EQ/NE/LTU/GTU/GEU/LEU. We generate
+@@ -3537,18 +3597,15 @@
+ int
+ visium_initial_elimination_offset (int from, int to ATTRIBUTE_UNUSED)
+ {
+- const int frame_size = visium_compute_frame_size (get_frame_size ());
+ const int save_fp = current_frame_info.save_fp;
+ const int save_lr = current_frame_info.save_lr;
+ const int lr_slot = current_frame_info.lr_slot;
+- const int local_frame_offset
+- = (save_fp + save_lr + lr_slot) * UNITS_PER_WORD;
+ int offset;
+
+ if (from == FRAME_POINTER_REGNUM)
+- offset = local_frame_offset;
++ offset = (save_fp + save_lr + lr_slot) * UNITS_PER_WORD;
+ else if (from == ARG_POINTER_REGNUM)
+- offset = frame_size;
++ offset = visium_compute_frame_size (get_frame_size ());
+ else
+ gcc_unreachable ();
+
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/config/visium/visium.md gcc-6-20160721/gcc/config/visium/visium.md
+--- gcc-6.1.0/gcc/config/visium/visium.md 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/gcc/config/visium/visium.md 2016-05-27 15:09:38.000000000 +0000
+@@ -627,7 +627,7 @@
+ [(set (match_dup 2) (match_dup 3))
+ (set (match_dup 4) (match_dup 5))]
+ {
+- split_double_move (operands, DImode);
++ visium_split_double_move (operands, DImode);
+ })
+
+ ;;
+@@ -726,7 +726,7 @@
+ [(set (match_dup 2) (match_dup 3))
+ (set (match_dup 4) (match_dup 5))]
+ {
+- split_double_move (operands, DFmode);
++ visium_split_double_move (operands, DFmode);
+ })
+
+ ;;
+@@ -815,31 +815,20 @@
+ (match_operand:DI 2 "add_operand" "")))]
+ "")
+
++; Disfavour the use of add.l because of the early clobber.
++
+ (define_insn_and_split "*addi3_insn"
+ [(set (match_operand:DI 0 "register_operand" "=r,r,&r")
+ (plus:DI (match_operand:DI 1 "register_operand" "%0,0, r")
+- (match_operand:DI 2 "add_operand" " J,L, r")))]
++ (match_operand:DI 2 "add_operand" " L,J, r")))]
+ "ok_for_simple_arith_logic_operands (operands, DImode)"
+ "#"
+ "reload_completed"
+- [(parallel [(set (match_dup 0)
+- (plus:DI (match_dup 1) (match_dup 2)))
+- (clobber (reg:CC R_FLAGS))])]
+- ""
+- [(set_attr "type" "arith2")])
+-
+-; Disfavour the use of add.l because of the early clobber.
+-
+-(define_insn "*adddi3_insn_flags"
+- [(set (match_operand:DI 0 "register_operand" "=r,r,&r")
+- (plus:DI (match_operand:DI 1 "register_operand" "%0,0, r")
+- (match_operand:DI 2 "add_operand" " J,L, r")))
+- (clobber (reg:CC R_FLAGS))]
+- "reload_completed"
+- "@
+- addi %d0,%2\n\tadc.l %0,%0,r0
+- subi %d0,%n2\n\tsubc.l %0,%0,r0
+- add.l %d0,%d1,%d2\n\tadc.l %0,%1,%2"
++ [(const_int 0)]
++{
++ visium_split_double_add (PLUS, operands[0], operands[1], operands[2]);
++ DONE;
++}
+ [(set_attr "type" "arith2")])
+
+ ;;
+@@ -847,7 +836,7 @@
+ ;;
+ ;; Integer Add with Carry
+ ;;
+-;; Only SI mode is supported as slt[u] for the sake of cstore.
++;; Only SI mode is supported.
+ ;;
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+ ;;
+@@ -869,6 +858,16 @@
+ "adc.l %0,%1,r0"
+ [(set_attr "type" "arith")])
+
++(define_insn "*plus_plus_sltu<subst_arith>"
++ [(set (match_operand:SI 0 "register_operand" "=r")
++ (plus:SI (plus:SI (match_operand:SI 1 "register_operand" "r")
++ (match_operand:SI 2 "register_operand" "r"))
++ (ltu:SI (reg R_FLAGS) (const_int 0))))
++ (clobber (reg:CC R_FLAGS))]
++ "reload_completed"
++ "adc.l %0,%1,%2"
++ [(set_attr "type" "arith")])
++
+ ;;
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+ ;;
+@@ -955,31 +954,20 @@
+ (match_operand:DI 2 "add_operand" "")))]
+ "")
+
++; Disfavour the use of the sub.l because of the early clobber.
++
+ (define_insn_and_split "*subdi3_insn"
+ [(set (match_operand:DI 0 "register_operand" "=r,r,&r")
+ (minus:DI (match_operand:DI 1 "register_operand" " 0,0, r")
+- (match_operand:DI 2 "add_operand" " J,L, r")))]
++ (match_operand:DI 2 "add_operand" " L,J, r")))]
+ "ok_for_simple_arith_logic_operands (operands, DImode)"
+ "#"
+ "reload_completed"
+- [(parallel [(set (match_dup 0)
+- (minus:DI (match_dup 1) (match_dup 2)))
+- (clobber (reg:CC R_FLAGS))])]
+- ""
+- [(set_attr "type" "arith2")])
+-
+-; Disfavour the use of the sub.l because of the early clobber.
+-
+-(define_insn "*subdi3_insn_flags"
+- [(set (match_operand:DI 0 "register_operand" "=r,r,&r")
+- (minus:DI (match_operand:DI 1 "register_operand" " 0,0, r")
+- (match_operand:DI 2 "add_operand" " J,L, r")))
+- (clobber (reg:CC R_FLAGS))]
+- "reload_completed"
+- "@
+- subi %d0,%2\n\tsubc.l %0,%0,r0
+- addi %d0,%n2\n\tadc.l %0,%0,r0
+- sub.l %d0,%d1,%d2\n\tsubc.l %0,%1,%2"
++ [(const_int 0)]
++{
++ visium_split_double_add (MINUS, operands[0], operands[1], operands[2]);
++ DONE;
++}
+ [(set_attr "type" "arith2")])
+
+ ;;
+@@ -987,7 +975,7 @@
+ ;;
+ ;; Integer Subtract with Carry
+ ;;
+-;; Only SI mode is supported as neg<slt[u]> for the sake of cstore.
++;; Only SI mode is supported.
+ ;;
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+ ;;
+@@ -1009,6 +997,16 @@
+ "subc.l %0,%1,r0"
+ [(set_attr "type" "arith")])
+
++(define_insn "*minus_minus_sltu<subst_arith>"
++ [(set (match_operand:SI 0 "register_operand" "=r")
++ (minus:SI (minus:SI (match_operand:SI 1 "reg_or_0_operand" "rO")
++ (match_operand:SI 2 "register_operand" "r"))
++ (ltu:SI (reg R_FLAGS) (const_int 0))))
++ (clobber (reg:CC R_FLAGS))]
++ "reload_completed"
++ "subc.l %0,%r1,%2"
++ [(set_attr "type" "arith")])
++
+ ;;
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+ ;;
+@@ -1054,17 +1052,11 @@
+ "ok_for_simple_arith_logic_operands (operands, DImode)"
+ "#"
+ "reload_completed"
+- [(parallel [(set (match_dup 0) (neg:DI (match_dup 1)))
+- (clobber (reg:CC R_FLAGS))])]
+- ""
+- [(set_attr "type" "arith2")])
+-
+-(define_insn "*negdi2_insn_flags"
+- [(set (match_operand:DI 0 "register_operand" "=&r")
+- (neg:DI (match_operand:DI 1 "register_operand" "r")))
+- (clobber (reg:CC R_FLAGS))]
+- "reload_completed"
+- "sub.l %d0,r0,%d1\n\tsubc.l %0,r0,%1"
++ [(const_int 0)]
++{
++ visium_split_double_add (MINUS, operands[0], const0_rtx, operands[1]);
++ DONE;
++}
+ [(set_attr "type" "arith2")])
+
+ ;;
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/config.gcc gcc-6-20160721/gcc/config.gcc
+--- gcc-6.1.0/gcc/config.gcc 2016-04-11 10:14:59.000000000 +0000
++++ gcc-6-20160721/gcc/config.gcc 2016-06-08 13:34:25.000000000 +0000
+@@ -1058,11 +1058,9 @@
+ case $target in
+ armv6*-*-freebsd*)
+ tm_defines="${tm_defines} TARGET_FREEBSD_ARMv6=1"
+- ;;
+- esac
+- case $target in
+- arm*hf-*-freebsd*)
+- tm_defines="${tm_defines} TARGET_FREEBSD_ARM_HARD_FLOAT=1"
++ if test $fbsd_major -ge 11; then
++ tm_defines="${tm_defines} TARGET_FREEBSD_ARM_HARD_FLOAT=1"
++ fi
+ ;;
+ esac
+ with_tls=${with_tls:-gnu}
+@@ -4280,9 +4278,9 @@
+ esac
+ ;;
+ sparc*-*-*)
+- supported_defaults="cpu float tune"
++ supported_defaults="cpu cpu_32 cpu_64 float tune tune_32 tune_64"
+
+- for which in cpu tune; do
++ for which in cpu cpu_32 cpu_64 tune tune_32 tune_64; do
+ eval "val=\$with_$which"
+ case ${val} in
+ "" | sparc | sparcv9 | sparc64 \
+@@ -4291,7 +4289,7 @@
+ | sparclite | f930 | f934 | sparclite86x \
+ | sparclet | tsc701 \
+ | v9 | ultrasparc | ultrasparc3 | niagara | niagara2 \
+- | niagara3 | niagara4)
++ | niagara3 | niagara4 | niagara7)
+ # OK
+ ;;
+ *)
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/config.in gcc-6-20160721/gcc/config.in
+--- gcc-6.1.0/gcc/config.in 2016-04-27 08:22:11.000000000 +0000
++++ gcc-6-20160721/gcc/config.in 2016-07-21 22:33:06.000000000 +0000
+@@ -622,6 +622,12 @@
+ #endif
+
+
++/* Define if your assembler supports SPARC5 and VIS 4.0 instructions. */
++#ifndef USED_FOR_TARGET
++#undef HAVE_AS_SPARC5_VIS4
++#endif
++
++
+ /* Define if your assembler and linker support GOTDATA_OP relocs. */
+ #ifndef USED_FOR_TARGET
+ #undef HAVE_AS_SPARC_GOTDATA_OP
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/configure gcc-6-20160721/gcc/configure
+--- gcc-6.1.0/gcc/configure 2016-01-27 16:54:48.000000000 +0000
++++ gcc-6-20160721/gcc/configure 2016-06-08 13:34:25.000000000 +0000
+@@ -25092,6 +25092,42 @@
+
+ fi
+
++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler for SPARC5 and VIS 4.0 instructions" >&5
++$as_echo_n "checking assembler for SPARC5 and VIS 4.0 instructions... " >&6; }
++if test "${gcc_cv_as_sparc_sparc5+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ gcc_cv_as_sparc_sparc5=no
++ if test x$gcc_cv_as != x; then
++ $as_echo '.text
++ .register %g2, #scratch
++ .register %g3, #scratch
++ .align 4
++ subxc %g1, %g2, %g3
++ fpadd8 %f0, %f2, %f4' > conftest.s
++ if { ac_try='$gcc_cv_as $gcc_cv_as_flags -xarch=sparc5 -o conftest.o conftest.s >&5'
++ { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
++ (eval $ac_try) 2>&5
++ ac_status=$?
++ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
++ test $ac_status = 0; }; }
++ then
++ gcc_cv_as_sparc_sparc5=yes
++ else
++ echo "configure: failed program was" >&5
++ cat conftest.s >&5
++ fi
++ rm -f conftest.o conftest.s
++ fi
++fi
++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gcc_cv_as_sparc_sparc5" >&5
++$as_echo "$gcc_cv_as_sparc_sparc5" >&6; }
++if test $gcc_cv_as_sparc_sparc5 = yes; then
++
++$as_echo "#define HAVE_AS_SPARC5_VIS4 1" >>confdefs.h
++
++fi
++
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler for LEON instructions" >&5
+ $as_echo_n "checking assembler for LEON instructions... " >&6; }
+ if test "${gcc_cv_as_sparc_leon+set}" = set; then :
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/configure.ac gcc-6-20160721/gcc/configure.ac
+--- gcc-6.1.0/gcc/configure.ac 2016-01-27 16:54:48.000000000 +0000
++++ gcc-6-20160721/gcc/configure.ac 2016-06-08 13:34:25.000000000 +0000
+@@ -3906,6 +3906,18 @@
+ [AC_DEFINE(HAVE_AS_SPARC4, 1,
+ [Define if your assembler supports SPARC4 instructions.])])
+
++ gcc_GAS_CHECK_FEATURE([SPARC5 and VIS 4.0 instructions],
++ gcc_cv_as_sparc_sparc5,,
++ [-xarch=sparc5],
++ [.text
++ .register %g2, #scratch
++ .register %g3, #scratch
++ .align 4
++ subxc %g1, %g2, %g3
++ fpadd8 %f0, %f2, %f4],,
++ [AC_DEFINE(HAVE_AS_SPARC5_VIS4, 1,
++ [Define if your assembler supports SPARC5 and VIS 4.0 instructions.])])
++
+ gcc_GAS_CHECK_FEATURE([LEON instructions],
+ gcc_cv_as_sparc_leon,,
+ [-Aleon],
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/cp/ChangeLog gcc-6-20160721/gcc/cp/ChangeLog
+--- gcc-6.1.0/gcc/cp/ChangeLog 2016-04-27 08:20:21.000000000 +0000
++++ gcc-6-20160721/gcc/cp/ChangeLog 2016-07-21 18:24:48.000000000 +0000
+@@ -1,3 +1,456 @@
++2016-07-21 Jakub Jelinek <jakub@redhat.com>
++
++ PR c++/71728
++ * constexpr.c (potential_constant_expression_1) <case GOTO_EXPR>:
++ Replace assert with test, return false if the goto isn't break
++ or continue. Formatting fix.
++
++2016-07-21 Jakub Jelinek <jakub@redhat.com>
++
++ PR c++/71941
++ * cp-gimplify.c (cp_genericize): For nested cp_genericize calls
++ save/restore bc_label array.
++
++2016-07-21 Patrick Palka <ppalka@gcc.gnu.org>
++
++ PR c++/70822
++ PR c++/70106
++ * cp-tree.h (REF_PARENTHESIZED_P): Make this flag apply to
++ SCOPE_REFs too.
++ * pt.c (tsubst_qualified_id): If REF_PARENTHESIZED_P is set
++ on the qualified_id then propagate it to the resulting
++ expression.
++ (do_auto_deduction): Check REF_PARENTHESIZED_P on SCOPE_REFs
++ too.
++ * semantics.c (force_paren_expr): If given a SCOPE_REF, just set
++ its REF_PARENTHESIZED_P flag.
++
++2016-07-21 Andrew Sutton <andrew.n.sutton@gmail.com>
++ Jason Merrill <jason@redhat.com>
++
++ Improving concepts performance and diagnostics.
++ PR c++/67565
++ PR c++/67579
++ PR c++/71843
++ * cp-tree.def (CHECK_CONSTR): New.
++ * cp-tree.h (CHECK_CONSTR_CONCEPT): New.
++ (CHECK_CONSTR_ARGS): New.
++ * constraint.cc (make_predicate_constraint): Remove in favor of
++ normalize_expression.
++ (resolve_constraint_check): Actually return error_mark_node when
++ resolution fails.
++ (resolve_variable_concept_check): Perform coercion as if processing
++ a template. Also return errors on resolution failure.
++ (lift_*): Remove all of these functions. Don't unnecessarily inline
++ concepts.
++ (learn_*): Add facilities to memoize implications for subsumption
++ during normalization.
++ (expanding_concept): New.
++ (expand_concept): New. Return the inlined and normalized definition
++ of a concept when needed.
++ (transform_*, xform_*): Rename to normalize_* to better reflect the
++ responsibility of those functions.
++ (normalize_template_id_expression): Check for non-boolean operands
++ when possible. Generate check constraints instead of normal variable
++ references.
++ (normalize_call_expression): Report errors when resolution fails.
++ (check_for_logical_overloads): Rewrite this check to more accurately
++ report the error.
++ (normalize_atom): Check for overloaded calls and invalid types before
++ determining if the expression refers to a concept.
++ (build_constraints): Don't cache normalized constraints or decomposed
++ assumptions.
++ (finish_shorthand_constraint): Return a normalized expression instead
++ of a predicate constraint.
++ (finish_template_introduction): Same.
++ (placeholder_extract_concept_and_args): Rewrite this since we only
++ ever get check constraints here.
++ (equivalent_placeholder_constraints): Rewrite in terms of check
++ constraints, and handle error_mark_nodes correctly.
++ (tsubst_check_constraint, tsubst_expr_constr, tsubst_type_constr)
++ (tsubst_implicit_conversion_constr)
++ (tsubst_argument_deduction_constr, tsubst_exception_constr)
++ (tsubst_parameterized_constraint, tsubst_constraint): New.
++ (tsbust_conjunection): Replace with tsubst_logical_operator and
++ actually generate the right kind of constraint.
++ (tsubst_requirement_body): Reverse the order of substituted arguments
++ so that they appear in the order written (helps diagnostics).
++ (satisfy_check_constraint): New.
++ (satisfy_conjunction): Simplify.
++ (satisfy_disjunction): Same.
++ (satisfy_constraint_1): Handle check constraints.
++ (eval_constr): New (private) global state.
++ (evaluating_constraints_sentinel): New. Manages eval_constr.
++ (satisfy_constraint): Add timing variables.
++ (satisfy_associated_constraints): Add hooks for memoization.
++ (evaluate_function_concept): Build a check constraint instead of
++ normalizing its definition.
++ (evaluate_variable_concept): Same.
++ (evaluate_constraint_expression): Normalize, but in the current
++ declaration processing context.
++ (evaluating_constraints_p): New.
++ (elide_constraint_failure_p): Actually emit constraint_thresh errors.
++ (diagnose_*): Remove artificial indentation. Add a new parameter to
++ each that tracks the current (complete) constraint prior to any
++ substitutions.
++ (diagnose_expression): Removed.
++ (diagnose_call_expression): Same.
++ (diagnose_template_id): Same.
++ (diagnose_template_id): New.
++ (diagnose_logical_constraint): New.
++ (diagnose_expression_constraint): Show the original expression.
++ (diagnose_type_constraint): Show the original type.
++ (diagnose_implicit_conversion_constraint): Be specific about
++ failures, don't re-diagnose a known-to-be-failed substitutions,
++ and manage elisions properly.
++ (diagnose_argument_deduction_constraint): Same.
++ (diagnose_exception_constraint): Same.
++ (diagnose_parameterized_constraint): Same.
++ (constraint_p): Allow EXPR_PACK_EXPANSION.
++ * logic.cc (next_by_distance): Removed. No longer used.
++ (any_p): Renamed from any_of.
++ (term_entry, term_hasher): New.
++ (term_list): Rewrite to include a hash table for quick lookup.
++ Also, make less stateful.
++ (proof_state): Extend to allow goals to be discharged once
++ satisfied.
++ (non_atomic_constraint_p): New.
++ (any_non_atomic_constraints_p): New.
++ (...rest...): Previous implementation completely replaced with an
++ iterative algorithm that opportunistically prunes the search space
++ before committing to using more memory.
++ * parser.c: (cp_parser_type_parameter): Normalize constraints.
++ (cp_parser_explicit_template_declaration): Same.
++ * pt.c: (finish_template_variable): Be less redundant with this error
++ message.
++ (template_args_equal): No longer static.
++ (tsubst_decl): Don't try to find specializations of variables that
++ have already been instantiated.
++ (build_non_dependent_expr): Avoid infinite recursion during concept
++ expansion.
++ (make_constrained_auto): Normalize constraints.
++ (do_auto_deduction): When doing auto deduction from a
++ partial-concept-id, be sure to include the explicit args checking
++ the constraints.
++ (constraint_sat_*): New. Memoize satisfied constraints.
++ (concept_spec_*): New. Memoize expressions associated with a concept
++ specialization.
++ (constraint_memos, concept_memos): New.
++ (lookup_constraint_satisfaction, memoize_constraint_satisfaction): New.
++ (lookup_concept_satisfaction, memoize_concept_satisfaction): New.
++ (get_concept_expansion, save_concept_expansion): New.
++ (hash_subsumption_args): New.
++ (comp_subsumption_args): New.
++ (subsumption_*): New. Memoize parts of the subsumption relation.
++ (lookup_subsumption_result, save_subsumption_result): New.
++ (init_constraint_processing): Initialize memo tables.
++ (get_constraints): Shortcut if !flag_concepts.
++ * decl.c (grokfndecl): Normalize constraints.
++ * error.c (dump_simple_decl): Print "concept" when appropriate.
++ (dump_function_decl): Same.
++ (dump_template_decl): Don't write requirements when we're not
++ printing the header.
++ (dump_expr): Handle fold expressions.
++ * cxx-pretty-print.c (cxx_pretty_printer::expression): Handle
++ fold expressions.
++ (get_fold_operator): New.
++ (pp_cxx_unary_left_fold_expression): New.
++ (pp_cxx_unary_right_fold_expression): New.
++ (pp_cxx_binary_fold_expression): New.
++ (pp_cxx_check_constraint): New.
++ (pp_cxx_*_constraint): Rewrite the grammar of internal constraints
++ to make them easier to read when debugging.
++ * search.c (accessible_p): Don't shortcut when evaluating constraints.
++ * tree.c (cp_tree_equal): Handle CHECK_CONSTR.
++
++2016-07-21 Jason Merrill <jason@redhat.com>
++
++ PR c++/70781
++ * parser.c (cp_parser_lambda_expression): Unset OK if there was an
++ error parsing the lambda-declarator.
++
++ PR c++/71896
++ * constexpr.c (cxx_eval_binary_expression): Handle comparison
++ between lowered and unlowered PTRMEM_CST.
++
++ PR c++/71092
++ * constexpr.c (cxx_eval_call_expression): Fail quietly when cgraph
++ threw away DECL_SAVED_TREE.
++
++ PR c++/71117
++ Core 2189
++ * call.c (add_template_conv_candidate): Disable if there are
++ viable candidates.
++
++ PR c++/71495
++ * call.c (convert_like_real): Mask complain.
++
++ PR c++/71511
++ * typeck2.c (cxx_incomplete_type_diagnostic): Handle DECLTYPE_TYPE.
++
++ PR c++/71513
++ * pt.c (tsubst_attributes): Fix loop logic.
++
++ PR c++/71604
++ PR c++/54430
++ * parser.c (cp_parser_range_for): Modify IDENTIFIER_BINDING directly.
++ (cp_parser_simple_declaration): Diagnose type definition in
++ for-range-declaration.
++
++ PR c++/71711
++ * operators.def: Add *_FOLD_EXPR.
++ * cp-tree.h (FOLD_EXPR_P): Parenthesize.
++ * mangle.c (write_expression): Handle fold-expressions.
++ * pt.c (tsubst_unary_left_fold, tsubst_binary_left_fold)
++ (tsubst_unary_right_fold, tsubst_binary_right_fold): Handle
++ partial instantiation.
++
++ PR c++/71814
++ * mangle.c (write_expression): Handle sizeof... an argument pack.
++
++ PR c++/71718
++ * pt.c (push_tinst_level_loc): Set at_eof before fatal_error.
++
++ PR c++/70824
++ * init.c (constant_value_1): Don't instantiated DECL_INITIAL of
++ artificial variables.
++
++ * lambda.c (maybe_add_lambda_conv_op): Fix null object argument.
++
++2016-07-20 Jakub Jelinek <jakub@redhat.com>
++
++ PR c++/71909
++ * parser.c (cp_parser_save_member_function_body): Consume
++ __transaction_relaxed or __transaction_atomic with optional
++ attribute. Only skip catch with block if try keyword is seen.
++
++2016-07-19 Jakub Jelinek <jakub@redhat.com>
++
++ Backported from mainline
++ 2016-07-18 Jakub Jelinek <jakub@redhat.com>
++
++ PR c++/71835
++ * call.c (build_op_call_1): Use convert_like_with_context only
++ if cand->fn is a decl.
++
++ PR c++/71828
++ * constexpr.c (cxx_eval_constant_expression) <case REALPART_EXPR>:
++ For lval don't use cxx_eval_unary_expression and instead recurse
++ and if needed rebuild the reference.
++
++ PR c++/71822
++ * cp-gimplify.c (cp_gimplify_expr) <case VEC_INIT_EXPR>: Recursively
++ fold *expr_p before genericizing it.
++
++ PR c++/71871
++ * typeck.c (build_x_conditional_expr): Revert the 2012-10-25 change.
++
++ 2016-07-07 Jakub Jelinek <jakub@redhat.com>
++ Kai Tietz <ktietz70@googlemail.com>
++
++ PR c++/70869
++ PR c++/71054
++ * cp-gimplify.c (cp_genericize_r): For DECL_EXPR for non-static
++ artificial vars, genericize their initializers.
++
++2016-06-21 Jakub Jelinek <jakub@redhat.com>
++
++ Backported from mainline
++ 2016-06-17 Jakub Jelinek <jakub@redhat.com>
++
++ * semantics.c (handle_omp_array_sections_1): Don't ICE when
++ processing_template_decl when checking for bitfields and unions.
++ Look through REFERENCE_REF_P as base of COMPONENT_REF.
++ (finish_omp_clauses): Look through REFERENCE_REF_P even for
++ array sections with COMPONENT_REF bases.
++
++ 2016-06-16 Jakub Jelinek <jakub@redhat.com>
++
++ * parser.c (cp_parser_omp_var_list_no_open): Call
++ convert_from_reference before cp_parser_postfix_dot_deref_expression.
++ * semantics.c (finish_omp_clauses): Don't ICE when
++ processing_template_decl when checking for bitfields and unions.
++ Look through REFERENCE_REF_P as base of COMPONENT_REF.
++
++ 2016-06-14 Jakub Jelinek <jakub@redhat.com>
++
++ PR c++/71528
++ * decl.c (duplicate_decls): For DECL_INITIALIZED_P non-external
++ olddecl vars, preserve their TREE_READONLY bit.
++
++2016-06-14 Paolo Carlini <paolo.carlini@oracle.com>
++
++ PR c++/70572
++ * decl.c (cp_finish_decl): Check do_auto_deduction return value
++ and return immediately in case of erroneous code.
++
++2016-06-14 Jakub Jelinek <jakub@redhat.com>
++
++ PR c++/71516
++ * decl.c (complete_vars): Handle gracefully type == error_mark_node.
++
++2016-06-10 Thomas Schwinge <thomas@codesourcery.com>
++
++ PR c/71381
++ Backport from trunk r237290:
++ * parser.c (cp_parser_omp_var_list_no_open) <OMP_CLAUSE__CACHE_>:
++ Loosen checking.
++
++2016-06-08 Jakub Jelinek <jakub@redhat.com>
++
++ PR c++/71442
++ * pt.c (tsubst_copy): Only set TREE_USED on DECLs.
++
++2016-06-06 Jakub Jelinek <jakub@redhat.com>
++ Patrick Palka <ppalka@gcc.gnu.org>
++
++ PR c++/70847
++ PR c++/71330
++ PR c++/71393
++ * cp-gimplify.c (cp_fold_r): Set *walk_subtrees = 0 and return NULL
++ right after cp_fold call if cp_fold has returned the same stmt
++ already in some earlier cp_fold_r call.
++ (cp_fold_function): Add pset automatic variable, pass its address
++ to cp_walk_tree.
++
++2016-06-02 Jakub Jelinek <jakub@redhat.com>
++
++ PR c++/71372
++ * cp-gimplify.c (cp_fold): For INDIRECT_REF, if the folded expression
++ is INDIRECT_REF or MEM_REF, copy over TREE_READONLY, TREE_SIDE_EFFECTS
++ and TREE_THIS_VOLATILE flags. For ARRAY_REF and ARRAY_RANGE_REF, copy
++ over TREE_READONLY, TREE_SIDE_EFFECTS and TREE_THIS_VOLATILE flags
++ to the newly built tree.
++
++2016-06-02 Paolo Carlini <paolo.carlini@oracle.com>
++
++ PR c++/70972
++ * method.c (forward_parm): Use cp_build_reference_type.
++
++2016-05-31 Jason Merrill <jason@redhat.com>
++
++ PR c++/71166
++ * decl2.c (c_parse_final_cleanups): Don't call fini_constexpr.
++
++ PR c++/71227
++ * pt.c (check_explicit_specialization): Give better diagnostic about
++ specializing a hidden friend.
++
++ PR c++/60095
++ PR c++/69515
++ PR c++/69009
++ * pt.c (instantiate_template_1): Don't put the partial
++ specialization in DECL_TI_TEMPLATE.
++ (partial_specialization_p, impartial_args): Remove.
++ (regenerate_decl_from_template): Add args parm.
++ (instantiate_decl): Look up the partial specialization again.
++
++ PR c++/71173
++ PR c++/70522
++ * cp-tree.h (enum tag_types): Add scope_type.
++ * parser.c (cp_parser_class_name): Use scope_type.
++ (prefer_type_arg): Handle scope_type.
++ (cp_parser_lookup_name): Use prefer_type_arg.
++ * name-lookup.c (lookup_qualified_name): Change bool is_type_p to
++ int prefer_type, use lookup_flags.
++ * name-lookup.h: Adjust.
++
++ PR c++/70584
++ * cp-gimplify.c (cp_fold_maybe_rvalue): Loop in case cp_fold
++ returns a decl.
++ (cp_fold) [INDIRECT_REF]: Call maybe_undo_parenthesized_ref.
++
++ PR c++/70735
++ * pt.c (tsubst_copy): Just return a local variable from
++ non-template context. Don't call rest_of_decl_compilation for
++ duplicated static locals.
++ (tsubst_decl): Set DECL_CONTEXT of local static from another
++ function.
++
++2016-05-31 Martin Sebor <msebor@redhat.com>
++
++ PR c++/71306
++ * init.c (warn_placement_new_too_small): Handle placement new arguments
++ that are elements of arrays more carefully. Remove a pointless loop.
++
++2016-05-30 Jakub Jelinek <jakub@redhat.com>
++
++ PR c++/71349
++ * parser.c (cp_parser_omp_for): Don't disallow nowait clause
++ when combined with target construct.
++ (cp_parser_omp_parallel): Pass cclauses == NULL as last argument
++ to cp_parser_omp_all_clauses.
++
++2016-05-29 Paolo Carlini <paolo.carlini@oracle.com>
++
++ PR c++/71105
++ * lambda.c (maybe_add_lambda_conv_op): Early return also when
++ LAMBDA_EXPR_DEFAULT_CAPTURE_MODE != CPLD_NONE.
++
++2016-05-24 Martin Sebor <msebor@redhat.com>
++
++ PR c++/71147
++ * decl.c (layout_var_decl, grokdeclarator): Use
++ complete_or_array_type_p.
++ * pt.c (instantiate_class_template_1): Try to complete the element
++ type of a flexible array member.
++ (can_complete_type_without_circularity): Handle arrays of unknown bound.
++ * typeck.c (complete_type): Also complete the type of the elements of
++ arrays with an unspecified bound.
++
++2016-05-24 Paolo Carlini <paolo.carlini@oracle.com>
++
++ PR c++/69872
++ * typeck2.c (check_narrowing): Check pedwarn return value.
++
++2016-05-24 Jakub Jelinek <jakub@redhat.com>
++
++ PR c++/71257
++ * semantics.c (finish_omp_clauses) <case OMP_CLAUSE_LINEAR>:
++ For OMP_CLAUSE_LINEAR_REF don't require type to be
++ integral or pointer.
++
++2016-05-23 Jason Merrill <jason@redhat.com>
++
++ PR c++/70344
++ * constexpr.c (cxx_eval_call_expression): Check for
++ fun == current_function_decl again.
++
++2016-05-19 David Malcolm <dmalcolm@redhat.com>
++
++ Backport from trunk r236483.
++ PR c++/71184
++ * parser.c (cp_parser_operator): For array new/delete, check that
++ cp_parser_require returned a non-NULL token before dereferencing
++ it.
++
++2016-05-19 Bernd Edlinger <bernd.edlinger@hotmail.de>
++
++ Backport from mainline
++ 2016-05-19 Bernd Edlinger <bernd.edlinger@hotmail.de>
++
++ * decl.c (finish_enum_value_list): Use the specified mode.
++
++2016-05-18 Paolo Carlini <paolo.carlini@oracle.com>
++
++ PR c++/70466
++ * call.c (convert_like_real): Check that we are actually converting
++ from an init list.
++
++2016-04-29 Cesar Philippidis <cesar@codesourcery.com>
++
++ PR middle-end/70626
++ * parser.c (cp_parser_oacc_loop): Don't augment mask with
++ OACC_LOOP_CLAUSE_MASK.
++ (cp_parser_oacc_kernels_parallel): Update call to
++ c_oacc_split_loop_clauses.
++
++2016-04-28 Paolo Carlini <paolo.carlini@oracle.com>
++
++ PR c++/70540
++ * semantics.c (process_outer_var_ref): Unconditionally return
++ error_mark_node when mark_used returns false.
++
+ 2016-04-27 Release Manager
+
+ * GCC 6.1.0 released.
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/cp/call.c gcc-6-20160721/gcc/cp/call.c
+--- gcc-6.1.0/gcc/cp/call.c 2016-04-14 16:23:06.000000000 +0000
++++ gcc-6-20160721/gcc/cp/call.c 2016-07-21 06:16:11.000000000 +0000
+@@ -3184,6 +3184,12 @@
+ tree return_type, tree access_path,
+ tree conversion_path, tsubst_flags_t complain)
+ {
++ /* Making this work broke PR 71117, so until the committee resolves core
++ issue 2189, let's disable this candidate if there are any viable call
++ operators. */
++ if (any_strictly_viable (*candidates))
++ return NULL;
++
+ return
+ add_template_candidate_real (candidates, tmpl, NULL_TREE, NULL_TREE,
+ NULL_TREE, arglist, return_type, access_path,
+@@ -4386,8 +4392,11 @@
+ result = build_over_call (cand, LOOKUP_NORMAL, complain);
+ else
+ {
+- obj = convert_like_with_context (cand->convs[0], obj, cand->fn, -1,
+- complain);
++ if (DECL_P (cand->fn))
++ obj = convert_like_with_context (cand->convs[0], obj, cand->fn,
++ -1, complain);
++ else
++ obj = convert_like (cand->convs[0], obj, complain);
+ obj = convert_from_reference (obj);
+ result = cp_build_function_call_vec (obj, args, complain);
+ }
+@@ -6360,8 +6369,9 @@
+ /* When converting from an init list we consider explicit
+ constructors, but actually trying to call one is an error. */
+ if (DECL_NONCONVERTING_P (convfn) && DECL_CONSTRUCTOR_P (convfn)
++ && BRACE_ENCLOSED_INITIALIZER_P (expr)
+ /* Unless this is for direct-list-initialization. */
+- && !DIRECT_LIST_INIT_P (expr)
++ && !CONSTRUCTOR_IS_DIRECT_INIT (expr)
+ /* And in C++98 a default constructor can't be explicit. */
+ && cxx_dialect >= cxx11)
+ {
+@@ -6546,7 +6556,7 @@
+ expr = decay_conversion (expr, complain);
+ if (expr == error_mark_node)
+ {
+- if (complain)
++ if (complain & tf_error)
+ {
+ maybe_print_user_conv_context (convs);
+ if (fn)
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/cp/constexpr.c gcc-6-20160721/gcc/cp/constexpr.c
+--- gcc-6.1.0/gcc/cp/constexpr.c 2016-04-22 15:39:03.000000000 +0000
++++ gcc-6-20160721/gcc/cp/constexpr.c 2016-07-21 18:24:48.000000000 +0000
+@@ -1371,11 +1371,17 @@
+ else
+ {
+ new_call.fundef = retrieve_constexpr_fundef (fun);
+- if (new_call.fundef == NULL || new_call.fundef->body == NULL)
++ if (new_call.fundef == NULL || new_call.fundef->body == NULL
++ || fun == current_function_decl)
+ {
+ if (!ctx->quiet)
+ {
+- if (DECL_INITIAL (fun) == error_mark_node)
++ /* We need to check for current_function_decl here in case we're
++ being called during cp_fold_function, because at that point
++ DECL_INITIAL is set properly and we have a fundef but we
++ haven't lowered invisirefs yet (c++/70344). */
++ if (DECL_INITIAL (fun) == error_mark_node
++ || fun == current_function_decl)
+ error_at (loc, "%qD called in a constant expression before its "
+ "definition is complete", fun);
+ else if (DECL_INITIAL (fun))
+@@ -1444,9 +1450,19 @@
+ }
+ else
+ {
+- if (!result || result == error_mark_node)
++ if (result && result != error_mark_node)
++ /* OK */;
++ else if (!DECL_SAVED_TREE (fun))
++ {
++ /* When at_eof >= 2, cgraph has started throwing away
++ DECL_SAVED_TREE, so fail quietly. FIXME we get here because of
++ late code generation for VEC_INIT_EXPR, which needs to be
++ completely reconsidered. */
++ gcc_assert (at_eof >= 2 && ctx->quiet);
++ *non_constant_p = true;
++ }
++ else
+ {
+- gcc_assert (DECL_SAVED_TREE (fun));
+ tree body, parms, res;
+
+ /* Reuse or create a new unshared copy of this function's body. */
+@@ -1750,6 +1766,10 @@
+ && (null_member_pointer_value_p (lhs)
+ || null_member_pointer_value_p (rhs)))
+ r = constant_boolean_node (!is_code_eq, type);
++ else if (TREE_CODE (lhs) == PTRMEM_CST)
++ lhs = cplus_expand_constant (lhs);
++ else if (TREE_CODE (rhs) == PTRMEM_CST)
++ rhs = cplus_expand_constant (rhs);
+ }
+
+ if (r == NULL_TREE)
+@@ -3714,6 +3734,19 @@
+
+ case REALPART_EXPR:
+ case IMAGPART_EXPR:
++ if (lval)
++ {
++ r = cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 0), lval,
++ non_constant_p, overflow_p);
++ if (r == error_mark_node)
++ ;
++ else if (r == TREE_OPERAND (t, 0))
++ r = t;
++ else
++ r = fold_build1 (TREE_CODE (t), TREE_TYPE (t), r);
++ break;
++ }
++ /* FALLTHRU */
+ case CONJ_EXPR:
+ case FIX_TRUNC_EXPR:
+ case FLOAT_EXPR:
+@@ -5140,10 +5173,12 @@
+ case GOTO_EXPR:
+ {
+ tree *target = &TREE_OPERAND (t, 0);
+- /* Gotos representing break and continue are OK; we should have
+- rejected other gotos in parsing. */
+- gcc_assert (breaks (target) || continues (target));
+- return true;
++ /* Gotos representing break and continue are OK. */
++ if (breaks (target) || continues (target))
++ return true;
++ if (flags & tf_error)
++ error ("%<goto%> is not a constant-expression");
++ return false;
+ }
+
+ default:
+@@ -5151,7 +5186,7 @@
+ return false;
+
+ sorry ("unexpected AST of kind %s", get_tree_code_name (TREE_CODE (t)));
+- gcc_unreachable();
++ gcc_unreachable ();
+ return false;
+ }
+ #undef RECUR
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/cp/constraint.cc gcc-6-20160721/gcc/cp/constraint.cc
+--- gcc-6.1.0/gcc/cp/constraint.cc 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/gcc/cp/constraint.cc 2016-07-21 06:18:06.000000000 +0000
+@@ -22,6 +22,7 @@
+ #include "system.h"
+ #include "coretypes.h"
+ #include "tm.h"
++#include "timevar.h"
+ #include "hash-set.h"
+ #include "machmode.h"
+ #include "vec.h"
+@@ -55,7 +56,9 @@
+ static inline bool
+ constraint_p (tree_code c)
+ {
+- return (PRED_CONSTR <= c && c <= DISJ_CONSTR) || c == ERROR_MARK;
++ return ((PRED_CONSTR <= c && c <= DISJ_CONSTR)
++ || c == EXPR_PACK_EXPANSION
++ || c == ERROR_MARK);
+ }
+
+ /* Returns true if T is a constraint. Note that error_mark_node
+@@ -67,14 +70,6 @@
+ return constraint_p (TREE_CODE (t));
+ }
+
+-/* Make a predicate constraint from the given expression. */
+-
+-tree
+-make_predicate_constraint (tree expr)
+-{
+- return build_nt (PRED_CONSTR, expr);
+-}
+-
+ /* Returns the conjunction of two constraints A and B. Note that
+ conjoining a non-null constraint with NULL_TREE is an identity
+ operation. That is, for non-null A,
+@@ -132,6 +127,53 @@
+ return false;
+ }
+
++/* Returns true if any of the arguments in the template
++ argument list is a wildcard or wildcard pack. */
++
++bool
++contains_wildcard_p (tree args)
++{
++ for (int i = 0; i < TREE_VEC_LENGTH (args); ++i)
++ {
++ tree arg = TREE_VEC_ELT (args, i);
++ if (TREE_CODE (arg) == WILDCARD_DECL)
++ return true;
++ }
++ return false;
++}
++
++/* Build a new call expression, but don't actually generate a
++ new function call. We just want the tree, not the semantics. */
++
++inline tree
++build_call_check (tree id)
++{
++ ++processing_template_decl;
++ vec<tree, va_gc> *fargs = make_tree_vector();
++ tree call = finish_call_expr (id, &fargs, false, false, tf_none);
++ release_tree_vector (fargs);
++ --processing_template_decl;
++ return call;
++}
++
++/* Build an expression that will check a variable concept. If any
++ argument contains a wildcard, don't try to finish the variable
++ template because we can't substitute into a non-existent
++ declaration. */
++
++tree
++build_variable_check (tree id)
++{
++ gcc_assert (TREE_CODE (id) == TEMPLATE_ID_EXPR);
++ if (contains_wildcard_p (TREE_OPERAND (id, 1)))
++ return id;
++
++ ++processing_template_decl;
++ tree var = finish_template_variable (id);
++ --processing_template_decl;
++ return var;
++}
++
+ /*---------------------------------------------------------------------------
+ Resolution of qualified concept names
+ ---------------------------------------------------------------------------*/
+@@ -160,6 +202,7 @@
+ static tree
+ resolve_constraint_check (tree ovl, tree args)
+ {
++ int nerrs = 0;
+ tree cands = NULL_TREE;
+ for (tree p = ovl; p != NULL_TREE; p = OVL_NEXT (p))
+ {
+@@ -185,15 +228,21 @@
+ ++processing_template_decl;
+ tree parms = TREE_VALUE (DECL_TEMPLATE_PARMS (tmpl));
+ if (tree subst = coerce_template_parms (parms, args, tmpl))
+- if (subst != error_mark_node)
+- cands = tree_cons (subst, fn, cands);
++ {
++ if (subst == error_mark_node)
++ ++nerrs;
++ else
++ cands = tree_cons (subst, fn, cands);
++ }
+ --processing_template_decl;
+ }
+
+- // If we didn't find a unique candidate, then this is
+- // not a constraint check.
+- if (!cands || TREE_CHAIN (cands))
+- return NULL_TREE;
++ if (!cands)
++ /* We either had no candidates or failed deductions. */
++ return nerrs ? error_mark_node : NULL_TREE;
++ else if (TREE_CHAIN (cands))
++ /* There are multiple candidates. */
++ return error_mark_node;
+
+ return cands;
+ }
+@@ -250,14 +299,16 @@
+ assuming that it works. Note that failing to deduce
+ will result in diagnostics. */
+ tree parms = INNERMOST_TEMPLATE_PARMS (DECL_TEMPLATE_PARMS (tmpl));
++ ++processing_template_decl;
+ tree result = coerce_template_parms (parms, args, tmpl);
++ --processing_template_decl;
+ if (result != error_mark_node)
+ {
+ tree decl = DECL_TEMPLATE_RESULT (tmpl);
+ return build_tree_list (result, decl);
+ }
+ else
+- return NULL_TREE;
++ return error_mark_node;
+ }
+
+
+@@ -315,45 +366,119 @@
+ namespace {
+
+ /*---------------------------------------------------------------------------
+- Lifting of concept definitions
++ Constraint implication learning
+ ---------------------------------------------------------------------------*/
+
+-/* Part of constraint normalization. Whenever we find a reference to
+- a variable concept or a call to a function concept, we lift or
+- inline that concept's definition into the constraint. This ensures
+- that constraints are always checked in the immediate instantiation
+- context. */
++/* The implication context determines how we memoize concept checks.
++ Given two checks C1 and C2, the direction of implication depends
++ on whether we are learning implications of a conjunction or disjunction.
++ For example:
+
+-tree lift_expression (tree);
++ template<typename T> concept bool C = ...;
++ template<typenaem T> concept bool D = C<T> && true;
+
+-/* If the tree T has operands, then lift any concepts out of them. */
+-tree
+-lift_operands (tree t)
++ From this, we can learn that D<T> implies C<T>. We cannot learn,
++ without further testing, that C<T> does not imply D<T>. If, for
++ example, C<T> were defined as true, then these constraints would
++ be logically equivalent.
++
++ In rare cases, we may start with a logical equivalence. For example:
++
++ template<typename T> concept bool C = ...;
++ template<typename T> concept bool D = C<T>;
++
++ Here, we learn that C<T> implies D<T> and vice versa. */
++
++enum implication_context
+ {
+- if (int n = tree_operand_length (t))
++ conjunction_cxt, /* C1 implies C2. */
++ disjunction_cxt, /* C2 implies C1. */
++ equivalence_cxt /* C1 implies C2, C2 implies C1. */
++};
++
++void learn_implications(tree, tree, implication_context);
++
++void
++learn_implication (tree parent, tree child, implication_context cxt)
++{
++ switch (cxt)
+ {
+- t = copy_node (t);
+- for (int i = 0; i < n; ++i)
+- TREE_OPERAND (t, i) = lift_expression (TREE_OPERAND (t, i));
++ case conjunction_cxt:
++ save_subsumption_result (parent, child, true);
++ break;
++ case disjunction_cxt:
++ save_subsumption_result (child, parent, true);
++ break;
++ case equivalence_cxt:
++ save_subsumption_result (parent, child, true);
++ save_subsumption_result (child, parent, true);
++ break;
+ }
+- return t;
+ }
+
+-/* Recursively lift all operands of the function call. Also, check
+- that the call target is not accidentally a variable concept
+- since that's ill-formed. */
+-tree
+-lift_function_call (tree t)
++void
++learn_logical_operation (tree parent, tree constr, implication_context cxt)
+ {
+- gcc_assert (TREE_CODE (t) == CALL_EXPR);
+- gcc_assert (!VAR_P (CALL_EXPR_FN (t)));
+- return lift_operands (t);
++ learn_implications (parent, TREE_OPERAND (constr, 0), cxt);
++ learn_implications (parent, TREE_OPERAND (constr, 1), cxt);
+ }
+
+-/* Inline a function (concept) definition by substituting
+- ARGS into its body. */
++void
++learn_implications (tree parent, tree constr, implication_context cxt)
++{
++ switch (TREE_CODE (constr))
++ {
++ case CHECK_CONSTR:
++ return learn_implication (parent, constr, cxt);
++
++ case CONJ_CONSTR:
++ if (cxt == disjunction_cxt)
++ return;
++ return learn_logical_operation (parent, constr, cxt);
++
++ case DISJ_CONSTR:
++ if (cxt == conjunction_cxt)
++ return;
++ return learn_logical_operation (parent, constr, cxt);
++
++ default:
++ break;
++ }
++}
++
++/* Quickly scan the top-level constraints of CONSTR to learn and
++ cache logical relations between concepts. The search does not
++ include conjunctions of disjunctions or vice versa. */
++
++void
++learn_implications (tree tmpl, tree args, tree constr)
++{
++ /* Don't memoize relations between non-dependent arguemnts. It's not
++ helpful. */
++ if (!uses_template_parms (args))
++ return;
++
++ /* Build a check constraint for the purpose of caching. */
++ tree parent = build_nt (CHECK_CONSTR, tmpl, args);
++
++ /* Start learning based on the kind of the top-level contraint. */
++ if (TREE_CODE (constr) == CONJ_CONSTR)
++ return learn_logical_operation (parent, constr, conjunction_cxt);
++ else if (TREE_CODE (constr) == DISJ_CONSTR)
++ return learn_logical_operation (parent, constr, disjunction_cxt);
++ else if (TREE_CODE (constr) == CHECK_CONSTR)
++ /* This is the rare concept alias case. */
++ return learn_implication (parent, constr, equivalence_cxt);
++}
++
++/*---------------------------------------------------------------------------
++ Expansion of concept definitions
++---------------------------------------------------------------------------*/
++
++/* Returns the expression of a function concept. */
++
+ tree
+-lift_function_definition (tree fn, tree args)
++get_returned_expression (tree fn)
+ {
+ /* Extract the body of the function minus the return expression. */
+ tree body = DECL_SAVED_TREE (fn);
+@@ -364,202 +489,107 @@
+ if (TREE_CODE (body) != RETURN_EXPR)
+ return error_mark_node;
+
+- body = TREE_OPERAND (body, 0);
+-
+- /* Substitute template arguments to produce our inline expression. */
+- tree result = tsubst_expr (body, args, tf_none, NULL_TREE, false);
+- if (result == error_mark_node)
+- return error_mark_node;
+-
+- return lift_expression (result);
++ return TREE_OPERAND (body, 0);
+ }
+
+-/* Inline a reference to a function concept. */
+-tree
+-lift_call_expression (tree t)
+-{
+- /* Try to resolve this function call as a concept. If not, then
+- it can be returned as-is. */
+- tree check = resolve_constraint_check (t);
+- if (!check)
+- return lift_function_call (t);
+- if (check == error_mark_node)
+- return error_mark_node;
+-
+- tree fn = TREE_VALUE (check);
+- tree args = TREE_PURPOSE (check);
+- return lift_function_definition (fn, args);
+-}
++/* Returns the initializer of a variable concept. */
+
+ tree
+-lift_variable_initializer (tree var, tree args)
++get_variable_initializer (tree var)
+ {
+- /* Extract the body from the variable initializer. */
+ tree init = DECL_INITIAL (var);
+ if (!init)
+ return error_mark_node;
++ return init;
++}
+
+- /* Substitute the arguments to form our new inline expression. */
+- tree result = tsubst_expr (init, args, tf_none, NULL_TREE, false);
+- if (result == error_mark_node)
+- return error_mark_node;
++/* Returns the definition of a variable or function concept. */
+
+- return lift_expression (result);
++tree
++get_concept_definition (tree decl)
++{
++ if (TREE_CODE (decl) == VAR_DECL)
++ return get_variable_initializer (decl);
++ else if (TREE_CODE (decl) == FUNCTION_DECL)
++ return get_returned_expression (decl);
++ gcc_unreachable ();
+ }
+
+-/* Determine if a template-id is a variable concept and inline. */
++int expansion_level = 0;
+
+-tree
+-lift_template_id (tree t)
++struct expanding_concept_sentinel
+ {
+- if (tree info = resolve_variable_concept_check (t))
+- {
+- tree decl = TREE_VALUE (info);
+- tree args = TREE_PURPOSE (info);
+- return lift_variable_initializer (decl, args);
+- }
++ expanding_concept_sentinel ()
++ {
++ ++expansion_level;
++ }
+
+- /* Check that we didn't refer to a function concept like
+- a variable.
++ ~expanding_concept_sentinel()
++ {
++ --expansion_level;
++ }
++};
+
+- TODO: Add a note on how to fix this. */
+- tree tmpl = TREE_OPERAND (t, 0);
+- if (TREE_CODE (tmpl) == OVERLOAD)
+- {
+- tree fn = OVL_FUNCTION (tmpl);
+- if (TREE_CODE (fn) == TEMPLATE_DECL
+- && DECL_DECLARED_CONCEPT_P (DECL_TEMPLATE_RESULT (fn)))
+- {
+- error_at (location_of (t),
+- "invalid reference to function concept %qD", fn);
+- return error_mark_node;
+- }
+- }
+
+- return t;
+-}
++} /* namespace */
+
+-/* Lift any constraints appearing in a nested requirement of
+- a requires-expression. */
+-tree
+-lift_requires_expression (tree t)
++/* Returns true when a concept is being expanded. */
++
++bool
++expanding_concept()
+ {
+- tree parms = TREE_OPERAND (t, 0);
+- tree reqs = TREE_OPERAND (t, 1);
+- tree result = NULL_TREE;
+- for (; reqs != NULL_TREE; reqs = TREE_CHAIN (reqs))
+- {
+- tree req = TREE_VALUE (reqs);
+- if (TREE_CODE (req) == NESTED_REQ)
+- {
+- tree expr = lift_expression (TREE_OPERAND (req, 0));
+- req = finish_nested_requirement (expr);
+- }
+- result = tree_cons (NULL_TREE, req, result);
+- }
+- return finish_requires_expr (parms, result);
++ return expansion_level > 0;
+ }
+
+-/* Inline references to specializations of concepts. */
++/* Expand a concept declaration (not a template) and its arguments to
++ a constraint defined by the concept's initializer or definition. */
++
+ tree
+-lift_expression (tree t)
++expand_concept (tree decl, tree args)
+ {
+- if (t == NULL_TREE)
+- return NULL_TREE;
++ expanding_concept_sentinel sentinel;
+
+- if (t == error_mark_node)
+- return error_mark_node;
+-
+- /* Concepts can be referred to by call or variable. All other
+- nodes are preserved. */
+- switch (TREE_CODE (t))
+- {
+- case CALL_EXPR:
+- return lift_call_expression (t);
++ if (TREE_CODE (decl) == TEMPLATE_DECL)
++ decl = DECL_TEMPLATE_RESULT (decl);
++ tree tmpl = DECL_TI_TEMPLATE (decl);
+
+- case TEMPLATE_ID_EXPR:
+- return lift_template_id (t);
++ /* Check for a previous specialization. */
++ if (tree spec = get_concept_expansion (tmpl, args))
++ return spec;
+
+- case REQUIRES_EXPR:
+- return lift_requires_expression (t);
++ /* Substitute the arguments to form a new definition expression. */
++ tree def = get_concept_definition (decl);
+
+- case EXPR_PACK_EXPANSION:
+- /* Use copy_node rather than make_pack_expansion so that
+- PACK_EXPANSION_PARAMETER_PACKS stays the same. */
+- t = copy_node (t);
+- SET_PACK_EXPANSION_PATTERN
+- (t, lift_expression (PACK_EXPANSION_PATTERN (t)));
+- return t;
+-
+- case TREE_LIST:
+- {
+- t = copy_node (t);
+- TREE_VALUE (t) = lift_expression (TREE_VALUE (t));
+- TREE_CHAIN (t) = lift_expression (TREE_CHAIN (t));
+- return t;
+- }
++ ++processing_template_decl;
++ tree result = tsubst_expr (def, args, tf_none, NULL_TREE, true);
++ --processing_template_decl;
++ if (result == error_mark_node)
++ return error_mark_node;
+
+- default:
+- return lift_operands (t);
+- }
++ /* And lastly, normalize it, check for implications, and save
++ the specialization for later. */
++ tree norm = normalize_expression (result);
++ learn_implications (tmpl, args, norm);
++ return save_concept_expansion (tmpl, args, norm);
+ }
+
+-/*---------------------------------------------------------------------------
+- Transformation of expressions into constraints
+----------------------------------------------------------------------------*/
+-
+-/* Part of constraint normalization. The following functions rewrite
+- expressions as constraints. */
+-
+-tree transform_expression (tree);
+
+-/* Check that the logical-or or logical-and expression does
+- not result in a call to a user-defined user-defined operator
+- (temp.constr.op). Returns true if the logical operator is
+- admissible and false otherwise. */
+-
+-bool
+-check_logical_expr (tree t)
+-{
+- /* We can't do much for type dependent expressions. */
+- if (type_dependent_expression_p (t))
+- return true;
++/*---------------------------------------------------------------------------
++ Stepwise normalization of expressions
+
+- /* Resolve the logical operator. Note that template processing is
+- disabled so we get the actual call or target expression back.
+- not_processing_template_sentinel sentinel.
+-
+- TODO: This check is actually subsumed by the requirement that
+- constraint operands have type bool. I'm not sure we need it
+- unless we allow conversions. */
+- tree arg1 = TREE_OPERAND (t, 0);
+- tree arg2 = TREE_OPERAND (t, 1);
+- tree ovl = NULL_TREE;
+- tree expr = build_x_binary_op (EXPR_LOC_OR_LOC (arg2, input_location),
+- TREE_CODE (t),
+- arg1, TREE_CODE (arg1),
+- arg2, TREE_CODE (arg2),
+- &ovl,
+- tf_none);
+- if (TREE_CODE (expr) != TREE_CODE (t))
+- {
+- error ("user-defined operator %qs in constraint %q+E",
+- operator_name_info[TREE_CODE (t)].name, t);
+- return false;
+- }
+- return true;
+-}
++This set of functions will transform an expression into a constraint
++in a sequence of steps. Normalization does not not look into concept
++definitions.
++---------------------------------------------------------------------------*/
+
+ /* Transform a logical-or or logical-and expression into either
+ a conjunction or disjunction. */
+
+ tree
+-xform_logical (tree t, tree_code c)
++normalize_logical_operation (tree t, tree_code c)
+ {
+- if (!check_logical_expr (t))
+- return error_mark_node;
+- tree t0 = transform_expression (TREE_OPERAND (t, 0));
+- tree t1 = transform_expression (TREE_OPERAND (t, 1));
++ tree t0 = normalize_expression (TREE_OPERAND (t, 0));
++ tree t1 = normalize_expression (TREE_OPERAND (t, 1));
+ return build_nt (c, t0, t1);
+ }
+
+@@ -567,7 +597,7 @@
+ for its expression. */
+
+ inline tree
+-xform_simple_requirement (tree t)
++normalize_simple_requirement (tree t)
+ {
+ return build_nt (EXPR_CONSTR, TREE_OPERAND (t, 0));
+ }
+@@ -575,7 +605,7 @@
+ /* A type requirement T introduce a type constraint for its type. */
+
+ inline tree
+-xform_type_requirement (tree t)
++normalize_type_requirement (tree t)
+ {
+ return build_nt (TYPE_CONSTR, TREE_OPERAND (t, 0));
+ }
+@@ -589,7 +619,7 @@
+ includes an exception constraint. */
+
+ tree
+-xform_compound_requirement (tree t)
++normalize_compound_requirement (tree t)
+ {
+ tree expr = TREE_OPERAND (t, 0);
+ tree constr = build_nt (EXPR_CONSTR, TREE_OPERAND (t, 0));
+@@ -627,29 +657,29 @@
+ will guarantee that the constraint is never satisfied. */
+
+ inline tree
+-xform_nested_requirement (tree t)
++normalize_nested_requirement (tree t)
+ {
+- return transform_expression (TREE_OPERAND (t, 0));
++ return normalize_expression (TREE_OPERAND (t, 0));
+ }
+
+ /* Transform a requirement T into one or more constraints. */
+
+ tree
+-xform_requirement (tree t)
++normalize_requirement (tree t)
+ {
+ switch (TREE_CODE (t))
+ {
+ case SIMPLE_REQ:
+- return xform_simple_requirement (t);
++ return normalize_simple_requirement (t);
+
+ case TYPE_REQ:
+- return xform_type_requirement (t);
++ return normalize_type_requirement (t);
+
+ case COMPOUND_REQ:
+- return xform_compound_requirement (t);
++ return normalize_compound_requirement (t);
+
+ case NESTED_REQ:
+- return xform_nested_requirement (t);
++ return normalize_nested_requirement (t);
+
+ default:
+ gcc_unreachable ();
+@@ -661,46 +691,165 @@
+ constraints. */
+
+ tree
+-xform_requirements (tree t)
++normalize_requirements (tree t)
+ {
+ tree result = NULL_TREE;
+ for (; t; t = TREE_CHAIN (t))
+ {
+- tree constr = xform_requirement (TREE_VALUE (t));
++ tree constr = normalize_requirement (TREE_VALUE (t));
+ result = conjoin_constraints (result, constr);
+ }
+ return result;
+ }
+
+-/* Transform a requires-expression into a parameterized constraint. */
++/* The normal form of a requires-expression is a parameterized
++ constraint having the same parameters and a conjunction of
++ constraints representing the normal form of requirements. */
+
+ tree
+-xform_requires_expr (tree t)
++normalize_requires_expression (tree t)
+ {
+- tree operand = xform_requirements (TREE_OPERAND (t, 1));
++ tree operand = normalize_requirements (TREE_OPERAND (t, 1));
+ if (tree parms = TREE_OPERAND (t, 0))
+ return build_nt (PARM_CONSTR, parms, operand);
+ else
+ return operand;
+ }
+
+-/* Transform an expression into an atomic predicate constraint.
+- After substitution, the expression of a predicate constraint
+- shall have type bool (temp.constr.pred). For non-type-dependent
+- expressions, we can check that now. */
++/* For a template-id referring to a variable concept, returns
++ a check constraint. Otherwise, returns a predicate constraint. */
+
+ tree
+-xform_atomic (tree t)
++normalize_template_id_expression (tree t)
+ {
+- if (TREE_TYPE (t) && !type_dependent_expression_p (t))
+- {
+- tree type = cv_unqualified (TREE_TYPE (t));
+- if (!same_type_p (type, boolean_type_node))
+- {
+- error ("predicate constraint %q+E does not have type %<bool%>", t);
++ if (tree info = resolve_variable_concept_check (t))
++ {
++ if (info == error_mark_node)
++ {
++ /* We get this when the template arguments don't match
++ the variable concept. */
++ error ("invalid reference to concept %qE", t);
++ return error_mark_node;
++ }
++
++ tree decl = TREE_VALUE (info);
++ tree args = TREE_PURPOSE (info);
++ return build_nt (CHECK_CONSTR, decl, args);
++ }
++
++ /* Check that we didn't refer to a function concept like a variable. */
++ tree tmpl = TREE_OPERAND (t, 0);
++ if (TREE_CODE (tmpl) == OVERLOAD)
++ {
++ tree fn = OVL_FUNCTION (tmpl);
++ if (TREE_CODE (fn) == TEMPLATE_DECL
++ && DECL_DECLARED_CONCEPT_P (DECL_TEMPLATE_RESULT (fn)))
++ {
++ error_at (location_of (t),
++ "invalid reference to function concept %qD", fn);
++ return error_mark_node;
++ }
++ }
++
++ return build_nt (PRED_CONSTR, t);
++}
++
++/* For a call expression to a function concept, returns a check
++ constraint. Otherwise, returns a predicate constraint. */
++
++tree
++normalize_call_expression (tree t)
++{
++ /* Try to resolve this function call as a concept. If not, then
++ it can be returned as a predicate constraint. */
++ tree check = resolve_constraint_check (t);
++ if (!check)
++ return build_nt (PRED_CONSTR, t);
++ if (check == error_mark_node)
++ {
++ /* TODO: Improve diagnostics. We could report why the reference
++ is invalid. */
++ error ("invalid reference to concept %qE", t);
++ return error_mark_node;
++ }
++
++ tree fn = TREE_VALUE (check);
++ tree args = TREE_PURPOSE (check);
++ return build_nt (CHECK_CONSTR, fn, args);
++}
++
++/* If T is a call to an overloaded && or || operator, diagnose that
++ as a non-SFINAEable error. Returns true if an error is emitted.
++
++ TODO: It would be better to diagnose this at the point of definition,
++ if possible. Perhaps we should immediately do a first-pass normalization
++ of a concept definition to catch obvious non-dependent errors like
++ this. */
++
++bool
++check_for_logical_overloads (tree t)
++{
++ if (TREE_CODE (t) != CALL_EXPR)
++ return false;
++
++ tree fn = CALL_EXPR_FN (t);
++
++ /* For member calls, try extracting the function from the
++ component ref. */
++ if (TREE_CODE (fn) == COMPONENT_REF)
++ {
++ fn = TREE_OPERAND (fn, 1);
++ if (TREE_CODE (fn) == BASELINK)
++ fn = BASELINK_FUNCTIONS (fn);
++ }
++
++ if (TREE_CODE (fn) != FUNCTION_DECL)
++ return false;
++
++ if (DECL_OVERLOADED_OPERATOR_P (fn))
++ {
++ location_t loc = EXPR_LOC_OR_LOC (t, input_location);
++ error_at (loc, "constraint %qE, uses overloaded operator", t);
++ return true;
++ }
++
++ return false;
++}
++
++/* The normal form of an atom depends on the expression. The normal
++ form of a function call to a function concept is a check constraint
++ for that concept. The normal form of a reference to a variable
++ concept is a check constraint for that concept. Otherwise, the
++ constraint is a predicate constraint. */
++
++tree
++normalize_atom (tree t)
++{
++ /* We can get constraints pushed down through pack expansions, so
++ just return them. */
++ if (constraint_p (t))
++ return t;
++
++ tree type = TREE_TYPE (t);
++ if (!type || type_unknown_p (t) || TREE_CODE (type) == TEMPLATE_TYPE_PARM)
++ ;
++ else if (!dependent_type_p (type))
++ {
++ if (check_for_logical_overloads (t))
+ return error_mark_node;
+- }
+- }
++
++ type = cv_unqualified (type);
++ if (!same_type_p (type, boolean_type_node))
++ {
++ error ("predicate constraint %q+E does not have type %<bool%>", t);
++ return error_mark_node;
++ }
++ }
++
++ if (TREE_CODE (t) == TEMPLATE_ID_EXPR)
++ return normalize_template_id_expression (t);
++ if (TREE_CODE (t) == CALL_EXPR)
++ return normalize_call_expression (t);
+ return build_nt (PRED_CONSTR, t);
+ }
+
+@@ -735,49 +884,48 @@
+ leaves of the constraint so that partial ordering will work. */
+
+ tree
+-xform_pack_expansion (tree t)
++normalize_pack_expansion (tree t)
+ {
+- tree pat = transform_expression (PACK_EXPANSION_PATTERN (t));
++ tree pat = normalize_expression (PACK_EXPANSION_PATTERN (t));
+ return push_down_pack_expansion (t, pat);
+ }
+
+ /* Transform an expression into a constraint. */
+
+ tree
+-xform_expr (tree t)
++normalize_any_expression (tree t)
+ {
+ switch (TREE_CODE (t))
+ {
+ case TRUTH_ANDIF_EXPR:
+- return xform_logical (t, CONJ_CONSTR);
++ return normalize_logical_operation (t, CONJ_CONSTR);
+
+ case TRUTH_ORIF_EXPR:
+- return xform_logical (t, DISJ_CONSTR);
++ return normalize_logical_operation (t, DISJ_CONSTR);
+
+ case REQUIRES_EXPR:
+- return xform_requires_expr (t);
++ return normalize_requires_expression (t);
+
+ case BIND_EXPR:
+- return transform_expression (BIND_EXPR_BODY (t));
++ return normalize_expression (BIND_EXPR_BODY (t));
+
+ case EXPR_PACK_EXPANSION:
+- return xform_pack_expansion (t);
++ return normalize_pack_expansion (t);
+
+ default:
+ /* All other constraints are atomic. */
+- return xform_atomic (t);
++ return normalize_atom (t);
+ }
+ }
+
+ /* Transform a statement into an expression. */
+-
+ tree
+-xform_stmt (tree t)
++normalize_any_statement (tree t)
+ {
+ switch (TREE_CODE (t))
+ {
+ case RETURN_EXPR:
+- return transform_expression (TREE_OPERAND (t, 0));
++ return normalize_expression (TREE_OPERAND (t, 0));
+ default:
+ gcc_unreachable ();
+ }
+@@ -787,24 +935,22 @@
+ /* Reduction rules for the declaration T. */
+
+ tree
+-xform_decl (tree t)
++normalize_any_declaration (tree t)
+ {
+ switch (TREE_CODE (t))
+ {
+ case VAR_DECL:
+- return xform_atomic (t);
++ return normalize_atom (t);
+ default:
+ gcc_unreachable ();
+ }
+ return error_mark_node;
+ }
+
+-/* Transform a lifted expression into a constraint. This either
+- returns a constraint, or it returns error_mark_node when
+- a constraint cannot be formed. */
++/* Returns the normal form of a constraint expression. */
+
+ tree
+-transform_expression (tree t)
++normalize_expression (tree t)
+ {
+ if (!t)
+ return NULL_TREE;
+@@ -818,20 +964,20 @@
+ case tcc_binary:
+ case tcc_expression:
+ case tcc_vl_exp:
+- return xform_expr (t);
++ return normalize_any_expression (t);
+
+ case tcc_statement:
+- return xform_stmt (t);
++ return normalize_any_statement (t);
+
+ case tcc_declaration:
+- return xform_decl (t);
++ return normalize_any_declaration (t);
+
+ case tcc_exceptional:
+ case tcc_constant:
+ case tcc_reference:
+ case tcc_comparison:
+ /* These are all atomic predicate constraints. */
+- return xform_atomic (t);
++ return normalize_atom (t);
+
+ default:
+ /* Unhandled node kind. */
+@@ -840,6 +986,7 @@
+ return error_mark_node;
+ }
+
++
+ /*---------------------------------------------------------------------------
+ Constraint normalization
+ ---------------------------------------------------------------------------*/
+@@ -879,8 +1026,7 @@
+ {
+ ++processing_template_decl;
+ tree expr = PRED_CONSTR_EXPR (t);
+- tree lifted = lift_expression (expr);
+- tree constr = transform_expression (lifted);
++ tree constr = normalize_expression (expr);
+ --processing_template_decl;
+ return constr;
+ }
+@@ -938,7 +1084,6 @@
+ return error_mark_node;
+ }
+
+-} /* namespace */
+
+
+ // -------------------------------------------------------------------------- //
+@@ -1028,61 +1173,11 @@
+ ci->declarator_reqs = decl_reqs;
+ ci->associated_constr = conjoin_constraints (tmpl_reqs, decl_reqs);
+
+- ++processing_template_decl;
+- ci->normalized_constr = normalize_constraint (ci->associated_constr);
+- --processing_template_decl;
+-
+- ci->assumptions = decompose_assumptions (ci->normalized_constr);
+ return (tree)ci;
+ }
+
+ namespace {
+
+-/* Returns true if any of the arguments in the template
+- argument list is a wildcard or wildcard pack. */
+-bool
+-contains_wildcard_p (tree args)
+-{
+- for (int i = 0; i < TREE_VEC_LENGTH (args); ++i)
+- {
+- tree arg = TREE_VEC_ELT (args, i);
+- if (TREE_CODE (arg) == WILDCARD_DECL)
+- return true;
+- }
+- return false;
+-}
+-
+-/* Build a new call expression, but don't actually generate
+- a new function call. We just want the tree, not the
+- semantics. */
+-inline tree
+-build_call_check (tree id)
+-{
+- ++processing_template_decl;
+- vec<tree, va_gc> *fargs = make_tree_vector();
+- tree call = finish_call_expr (id, &fargs, false, false, tf_none);
+- release_tree_vector (fargs);
+- --processing_template_decl;
+- return call;
+-}
+-
+-/* Build an expression that will check a variable concept. If any
+- argument contains a wildcard, don't try to finish the variable
+- template because we can't substitute into a non-existent
+- declaration. */
+-tree
+-build_variable_check (tree id)
+-{
+- gcc_assert (TREE_CODE (id) == TEMPLATE_ID_EXPR);
+- if (contains_wildcard_p (TREE_OPERAND (id, 1)))
+- return id;
+-
+- ++processing_template_decl;
+- tree var = finish_template_variable (id);
+- --processing_template_decl;
+- return var;
+-}
+-
+ /* Construct a sequence of template arguments by prepending
+ ARG to REST. Either ARG or REST may be null. */
+ tree
+@@ -1158,7 +1253,9 @@
+
+ Note that the constraints are neither reduced nor decomposed.
+ That is done only after the requires clause has been parsed
+- (or not). */
++ (or not).
++
++ This will always return a CHECK_CONSTR. */
+ tree
+ finish_shorthand_constraint (tree decl, tree constr)
+ {
+@@ -1207,7 +1304,7 @@
+ TREE_TYPE (check) = boolean_type_node;
+ }
+
+- return make_predicate_constraint (check);
++ return normalize_expression (check);
+ }
+
+ /* Returns a conjunction of shorthand requirements for the template
+@@ -1346,7 +1443,7 @@
+
+ /* Associate the constraint. */
+ tree check = build_concept_check (tmpl_decl, NULL_TREE, check_args);
+- tree constr = make_predicate_constraint (check);
++ tree constr = normalize_expression (check);
+ TEMPLATE_PARMS_CONSTRAINTS (current_template_parms) = constr;
+
+ return parm_list;
+@@ -1362,41 +1459,28 @@
+ {
+ if (TREE_CODE (t) == TYPE_DECL)
+ {
+- /* A constrained parameter. */
+- tmpl = DECL_TI_TEMPLATE (CONSTRAINED_PARM_CONCEPT (t));
+- args = CONSTRAINED_PARM_EXTRA_ARGS (t);
++ /* A constrained parameter. Build a constraint check
++ based on the prototype parameter and then extract the
++ arguments from that. */
++ tree proto = CONSTRAINED_PARM_PROTOTYPE (t);
++ tree check = finish_shorthand_constraint (proto, t);
++ placeholder_extract_concept_and_args (check, tmpl, args);
+ return;
+ }
+
+- gcc_assert (TREE_CODE (t) == PRED_CONSTR);
+- t = PRED_CONSTR_EXPR (t);
+- gcc_assert (TREE_CODE (t) == CALL_EXPR
+- || TREE_CODE (t) == TEMPLATE_ID_EXPR
+- || VAR_P (t));
+-
+- if (TREE_CODE (t) == CALL_EXPR)
+- t = CALL_EXPR_FN (t);
+- if (TREE_CODE (t) == TEMPLATE_ID_EXPR)
++ if (TREE_CODE (t) == CHECK_CONSTR)
+ {
+- tmpl = TREE_OPERAND (t, 0);
+- if (TREE_CODE (tmpl) == OVERLOAD)
+- {
+- gcc_assert (OVL_CHAIN (tmpl) == NULL_TREE);
+- tmpl = OVL_FUNCTION (tmpl);
+- }
+- args = TREE_OPERAND (t, 1);
+- }
+- else if (DECL_P (t))
+- {
+- tmpl = DECL_TI_TEMPLATE (t);
+- args = DECL_TI_ARGS (t);
++ tree decl = CHECK_CONSTR_CONCEPT (t);
++ tmpl = DECL_TI_TEMPLATE (decl);
++ args = CHECK_CONSTR_ARGS (t);
++ return;
+ }
+- else
++
+ gcc_unreachable ();
+ }
+
+ /* Returns true iff the placeholders C1 and C2 are equivalent. C1
+- and C2 can be either PRED_CONSTR_EXPR or TEMPLATE_TYPE_PARM. */
++ and C2 can be either CHECK_CONSTR or TEMPLATE_TYPE_PARM. */
+
+ bool
+ equivalent_placeholder_constraints (tree c1, tree c2)
+@@ -1411,6 +1495,11 @@
+ return true;
+ if (!c1 || !c2)
+ return false;
++ if (c1 == error_mark_node || c2 == error_mark_node)
++ /* We get here during satisfaction; when a deduction constraint
++ fails, substitution can produce an error_mark_node for the
++ placeholder constraints. */
++ return false;
+
+ tree t1, t2, a1, a2;
+ placeholder_extract_concept_and_args (c1, t1, a1);
+@@ -1419,21 +1508,20 @@
+ if (t1 != t2)
+ return false;
+
+- /* Skip the first argument to avoid infinite recursion on the
+- placeholder auto itself. */
+- bool skip1 = (TREE_CODE (c1) == PRED_CONSTR);
+- bool skip2 = (TREE_CODE (c2) == PRED_CONSTR);
+-
+- int len1 = (a1 ? TREE_VEC_LENGTH (a1) : 0) - skip1;
+- int len2 = (a2 ? TREE_VEC_LENGTH (a2) : 0) - skip2;
+-
++ int len1 = TREE_VEC_LENGTH (a1);
++ int len2 = TREE_VEC_LENGTH (a2);
+ if (len1 != len2)
+ return false;
+
+- for (int i = 0; i < len1; ++i)
+- if (!cp_tree_equal (TREE_VEC_ELT (a1, i + skip1),
+- TREE_VEC_ELT (a2, i + skip2)))
++ /* Skip the first argument so we don't infinitely recurse.
++ Also, they may differ in template parameter index. */
++ for (int i = 1; i < len1; ++i)
++ {
++ tree t1 = TREE_VEC_ELT (a1, i);
++ tree t2 = TREE_VEC_ELT (a2, i);
++ if (!template_args_equal (t1, t2))
+ return false;
++ }
+ return true;
+ }
+
+@@ -1492,40 +1580,139 @@
+ return build_nt (PRED_CONSTR, result);
+ }
+
++/* Substitute into a check constraint. */
++
++tree
++tsubst_check_constraint (tree t, tree args,
++ tsubst_flags_t complain, tree in_decl)
++{
++ tree decl = CHECK_CONSTR_CONCEPT (t);
++ tree tmpl = DECL_TI_TEMPLATE (decl);
++ tree targs = CHECK_CONSTR_ARGS (t);
++
++ /* Substitute through by building an template-id expression
++ and then substituting into that. */
++ tree expr = build_nt(TEMPLATE_ID_EXPR, tmpl, targs);
++ ++processing_template_decl;
++ tree result = tsubst_expr (expr, args, complain, in_decl, false);
++ --processing_template_decl;
++
++ if (result == error_mark_node)
++ return error_mark_node;
++
++ /* Extract the results and rebuild the check constraint. */
++ decl = DECL_TEMPLATE_RESULT (TREE_OPERAND (result, 0));
++ args = TREE_OPERAND (result, 1);
++
++ return build_nt (CHECK_CONSTR, decl, args);
++}
++
+ /* Substitute into the conjunction of constraints. Returns
+ error_mark_node if substitution into either operand fails. */
++
+ tree
+-tsubst_conjunction (tree t, tree args,
+- tsubst_flags_t complain, tree in_decl)
++tsubst_logical_operator (tree t, tree args,
++ tsubst_flags_t complain, tree in_decl)
+ {
+ tree t0 = TREE_OPERAND (t, 0);
+ tree r0 = tsubst_constraint (t0, args, complain, in_decl);
++ if (r0 == error_mark_node)
++ return error_mark_node;
+ tree t1 = TREE_OPERAND (t, 1);
+ tree r1 = tsubst_constraint (t1, args, complain, in_decl);
+- return build_nt (CONJ_CONSTR, r0, r1);
++ if (r1 == error_mark_node)
++ return error_mark_node;
++ return build_nt (TREE_CODE (t), r0, r1);
++}
++
++namespace {
++
++/* Substitute ARGS into the expression constraint T. */
++
++tree
++tsubst_expr_constr (tree t, tree args, tsubst_flags_t complain, tree in_decl)
++{
++ cp_unevaluated guard;
++ tree expr = EXPR_CONSTR_EXPR (t);
++ tree ret = tsubst_expr (expr, args, complain, in_decl, false);
++ if (ret == error_mark_node)
++ return error_mark_node;
++ return build_nt (EXPR_CONSTR, ret);
++}
++
++/* Substitute ARGS into the type constraint T. */
++
++tree
++tsubst_type_constr (tree t, tree args, tsubst_flags_t complain, tree in_decl)
++{
++ tree type = TYPE_CONSTR_TYPE (t);
++ tree ret = tsubst (type, args, complain, in_decl);
++ if (ret == error_mark_node)
++ return error_mark_node;
++ return build_nt (TYPE_CONSTR, ret);
++}
++
++/* Substitute ARGS into the implicit conversion constraint T. */
++
++tree
++tsubst_implicit_conversion_constr (tree t, tree args, tsubst_flags_t complain,
++ tree in_decl)
++{
++ cp_unevaluated guard;
++ tree expr = ICONV_CONSTR_EXPR (t);
++ tree type = ICONV_CONSTR_TYPE (t);
++ tree new_expr = tsubst_expr (expr, args, complain, in_decl, false);
++ if (new_expr == error_mark_node)
++ return error_mark_node;
++ tree new_type = tsubst (type, args, complain, in_decl);
++ if (new_type == error_mark_node)
++ return error_mark_node;
++ return build_nt (ICONV_CONSTR, new_expr, new_type);
+ }
+
+-/* Substitute ARGS into the constraint T. */
++/* Substitute ARGS into the argument deduction constraint T. */
++
+ tree
+-tsubst_constraint (tree t, tree args, tsubst_flags_t complain, tree in_decl)
++tsubst_argument_deduction_constr (tree t, tree args, tsubst_flags_t complain,
++ tree in_decl)
+ {
+- if (t == NULL_TREE)
+- return t;
+- if (TREE_CODE (t) == CONJ_CONSTR)
+- return tsubst_conjunction (t, args, complain, in_decl);
+- else if (TREE_CODE (t) == PRED_CONSTR)
+- return tsubst_predicate_constraint (t, args, complain, in_decl);
+- else
+- gcc_unreachable ();
+- return error_mark_node;
++ cp_unevaluated guard;
++ tree expr = DEDUCT_CONSTR_EXPR (t);
++ tree pattern = DEDUCT_CONSTR_PATTERN (t);
++ tree autos = DEDUCT_CONSTR_PLACEHOLDER(t);
++ tree new_expr = tsubst_expr (expr, args, complain, in_decl, false);
++ if (new_expr == error_mark_node)
++ return error_mark_node;
++ /* It seems like substituting through the pattern will not affect the
++ placeholders. We should (?) be able to reuse the existing list
++ without any problems. If not, then we probably want to create a
++ new list of placeholders and then instantiate the pattern using
++ those. */
++ tree new_pattern = tsubst (pattern, args, complain, in_decl);
++ if (new_pattern == error_mark_node)
++ return error_mark_node;
++ return build_nt (DEDUCT_CONSTR, new_expr, new_pattern, autos);
+ }
+
+-namespace {
++/* Substitute ARGS into the exception constraint T. */
++
++tree
++tsubst_exception_constr (tree t, tree args, tsubst_flags_t complain,
++ tree in_decl)
++{
++ cp_unevaluated guard;
++ tree expr = EXCEPT_CONSTR_EXPR (t);
++ tree ret = tsubst_expr (expr, args, complain, in_decl, false);
++ if (ret == error_mark_node)
++ return error_mark_node;
++ return build_nt (EXCEPT_CONSTR, ret);
++}
+
+ /* A subroutine of tsubst_constraint_variables. Register local
+ specializations for each of parameter in PARMS and its
+ corresponding substituted constraint variable in VARS.
+ Returns VARS. */
++
+ tree
+ declare_constraint_vars (tree parms, tree vars)
+ {
+@@ -1553,6 +1740,7 @@
+ Note that the caller must establish a local specialization stack
+ prior to calling this function since this substitution will
+ declare the substituted parameters. */
++
+ tree
+ tsubst_constraint_variables (tree t, tree args,
+ tsubst_flags_t complain, tree in_decl)
+@@ -1568,10 +1756,29 @@
+ return declare_constraint_vars (t, vars);
+ }
+
++/* Substitute ARGS into the parameterized constraint T. */
++
++tree
++tsubst_parameterized_constraint (tree t, tree args,
++ tsubst_flags_t complain, tree in_decl)
++{
++ local_specialization_stack stack;
++ tree vars = tsubst_constraint_variables (PARM_CONSTR_PARMS (t),
++ args, complain, in_decl);
++ if (vars == error_mark_node)
++ return error_mark_node;
++ tree expr = tsubst_constraint (PARM_CONSTR_OPERAND (t), args,
++ complain, in_decl);
++ if (expr == error_mark_node)
++ return error_mark_node;
++ return build_nt (PARM_CONSTR, vars, expr);
++}
++
+ /* Substitute ARGS into the simple requirement T. Note that
+ substitution may result in an ill-formed expression without
+ causing the program to be ill-formed. In such cases, the
+ requirement wraps an error_mark_node. */
++
+ inline tree
+ tsubst_simple_requirement (tree t, tree args,
+ tsubst_flags_t complain, tree in_decl)
+@@ -1627,6 +1834,8 @@
+ return finish_nested_requirement (expr);
+ }
+
++/* Substitute ARGS into the requirement T. */
++
+ inline tree
+ tsubst_requirement (tree t, tree args, tsubst_flags_t complain, tree in_decl)
+ {
+@@ -1662,7 +1871,8 @@
+ r = tree_cons (NULL_TREE, e, r);
+ t = TREE_CHAIN (t);
+ }
+- return r;
++ /* Ensure that the order of constraints is the same as the original. */
++ return nreverse (r);
+ }
+
+ } /* namespace */
+@@ -1696,6 +1906,7 @@
+
+ /* Substitute ARGS into the constraint information CI, producing a new
+ constraint record. */
++
+ tree
+ tsubst_constraint_info (tree t, tree args,
+ tsubst_flags_t complain, tree in_decl)
+@@ -1714,6 +1925,39 @@
+ return build_constraints (tmpl_constr, decl_constr);
+ }
+
++/* Substitute ARGS into the constraint T. */
++
++tree
++tsubst_constraint (tree t, tree args, tsubst_flags_t complain, tree in_decl)
++{
++ if (t == NULL_TREE)
++ return t;
++ switch (TREE_CODE (t))
++ {
++ case PRED_CONSTR:
++ return tsubst_predicate_constraint (t, args, complain, in_decl);
++ case CHECK_CONSTR:
++ return tsubst_check_constraint (t, args, complain, in_decl);
++ case CONJ_CONSTR:
++ case DISJ_CONSTR:
++ return tsubst_logical_operator (t, args, complain, in_decl);
++ case PARM_CONSTR:
++ return tsubst_parameterized_constraint (t, args, complain, in_decl);
++ case EXPR_CONSTR:
++ return tsubst_expr_constr (t, args, complain, in_decl);
++ case TYPE_CONSTR:
++ return tsubst_type_constr (t, args, complain, in_decl);
++ case ICONV_CONSTR:
++ return tsubst_implicit_conversion_constr (t, args, complain, in_decl);
++ case DEDUCT_CONSTR:
++ return tsubst_argument_deduction_constr (t, args, complain, in_decl);
++ case EXCEPT_CONSTR:
++ return tsubst_exception_constr (t, args, complain, in_decl);
++ default:
++ gcc_unreachable ();
++ }
++ return error_mark_node;
++}
+
+ /*---------------------------------------------------------------------------
+ Constraint satisfaction
+@@ -1738,11 +1982,14 @@
+ gen_elem_of_pack_expansion_instantiation will check that each element of
+ the expansion is satisfied. */
+ tree exprs = tsubst_pack_expansion (t, args, complain, in_decl);
++
+ if (exprs == error_mark_node)
+ return boolean_false_node;
+- int n = TREE_VEC_LENGTH (exprs);
+
+- for (int i = 0; i < n; ++i)
++ /* TODO: It might be better to normalize each expanded term
++ and evaluate them separately. That would provide better
++ opportunities for diagnostics. */
++ for (int i = 0; i < TREE_VEC_LENGTH (exprs); ++i)
+ if (TREE_VEC_ELT (exprs, i) != boolean_true_node)
+ return boolean_false_node;
+ return boolean_true_node;
+@@ -1760,12 +2007,14 @@
+ satisfy_predicate_constraint (tree t, tree args,
+ tsubst_flags_t complain, tree in_decl)
+ {
+- tree original = TREE_OPERAND (t, 0);
++ tree expr = TREE_OPERAND (t, 0);
+
+ /* We should never have a naked pack expansion in a predicate constraint. */
+- gcc_assert (TREE_CODE (original) != EXPR_PACK_EXPANSION);
++ gcc_assert (TREE_CODE (expr) != EXPR_PACK_EXPANSION);
+
+- tree expr = tsubst_expr (original, args, complain, in_decl, false);
++ /* If substitution into the expression fails, the constraint
++ is not satisfied. */
++ expr = tsubst_expr (expr, args, complain, in_decl, false);
+ if (expr == error_mark_node)
+ return boolean_false_node;
+
+@@ -1781,8 +2030,37 @@
+ return boolean_false_node;
+ }
+
+- tree value = cxx_constant_value (expr);
+- return value;
++ return cxx_constant_value (expr);
++}
++
++/* A concept check constraint like C<CARGS> is satisfied if substituting ARGS
++ into CARGS succeeds and C is satisfied for the resulting arguments. */
++
++tree
++satisfy_check_constraint (tree t, tree args,
++ tsubst_flags_t complain, tree in_decl)
++{
++ tree decl = CHECK_CONSTR_CONCEPT (t);
++ tree tmpl = DECL_TI_TEMPLATE (decl);
++ tree cargs = CHECK_CONSTR_ARGS (t);
++
++ /* Instantiate the concept check arguments. */
++ tree targs = tsubst (cargs, args, tf_none, NULL_TREE);
++ if (targs == error_mark_node)
++ return boolean_false_node;
++
++ /* Search for a previous value. */
++ if (tree prev = lookup_concept_satisfaction (tmpl, targs))
++ return prev;
++
++ /* Expand the concept; failure here implies non-satisfaction. */
++ tree def = expand_concept (decl, targs);
++ if (def == error_mark_node)
++ return memoize_concept_satisfaction (tmpl, args, boolean_false_node);
++
++ /* Recursively satisfy the constraint. */
++ tree result = satisfy_constraint_1 (def, targs, complain, in_decl);
++ return memoize_concept_satisfaction (tmpl, targs, result);
+ }
+
+ /* Check an expression constraint. The constraint is satisfied if
+@@ -1803,7 +2081,6 @@
+ return boolean_false_node;
+ if (!perform_deferred_access_checks (tf_none))
+ return boolean_false_node;
+-
+ return boolean_true_node;
+ }
+
+@@ -1822,7 +2099,6 @@
+ return boolean_false_node;
+ if (!perform_deferred_access_checks (complain))
+ return boolean_false_node;
+-
+ return boolean_true_node;
+ }
+
+@@ -1932,11 +2208,8 @@
+ {
+ tree t0 = satisfy_constraint_1 (TREE_OPERAND (t, 0), args, complain, in_decl);
+ if (t0 == boolean_false_node)
+- return t0;
+- tree t1 = satisfy_constraint_1 (TREE_OPERAND (t, 1), args, complain, in_decl);
+- if (t1 == boolean_false_node)
+- return t1;
+- return boolean_true_node;
++ return boolean_false_node;
++ return satisfy_constraint_1 (TREE_OPERAND (t, 1), args, complain, in_decl);
+ }
+
+ /* Check that the disjunction of constraints is satisfied. Note
+@@ -1949,10 +2222,7 @@
+ tree t0 = satisfy_constraint_1 (TREE_OPERAND (t, 0), args, complain, in_decl);
+ if (t0 == boolean_true_node)
+ return boolean_true_node;
+- tree t1 = satisfy_constraint_1 (TREE_OPERAND (t, 1), args, complain, in_decl);
+- if (t1 == boolean_true_node)
+- return boolean_true_node;
+- return boolean_false_node;
++ return satisfy_constraint_1 (TREE_OPERAND (t, 1), args, complain, in_decl);
+ }
+
+ /* Dispatch to an appropriate satisfaction routine depending on the
+@@ -1974,6 +2244,9 @@
+ case PRED_CONSTR:
+ return satisfy_predicate_constraint (t, args, complain, in_decl);
+
++ case CHECK_CONSTR:
++ return satisfy_check_constraint (t, args, complain, in_decl);
++
+ case EXPR_CONSTR:
+ return satisfy_expression_constraint (t, args, complain, in_decl);
+
+@@ -2014,15 +2287,19 @@
+ tree
+ satisfy_constraint (tree t, tree args)
+ {
++ auto_timevar time (TV_CONSTRAINT_SAT);
++
+ /* Turn off template processing. Constraint satisfaction only applies
+- to non-dependent terms, so we want full checking here. */
+- processing_template_decl_sentinel sentinel (true);
++ to non-dependent terms, so we want to ensure full checking here. */
++ processing_template_decl_sentinel proc (true);
++
+ /* Avoid early exit in tsubst and tsubst_copy from null args; since earlier
+ substitution was done with processing_template_decl forced on, there will
+ be expressions that still need semantic processing, possibly buried in
+ decltype or a template argument. */
+ if (args == NULL_TREE)
+ args = make_tree_vec (1);
++
+ return satisfy_constraint_1 (t, args, tf_none, NULL_TREE);
+ }
+
+@@ -2042,11 +2319,13 @@
+ if (args && uses_template_parms (args))
+ return boolean_true_node;
+
+- /* Invalid requirements cannot be satisfied. */
+- if (!valid_constraints_p (ci))
+- return boolean_false_node;
+-
+- return satisfy_constraint (CI_NORMALIZED_CONSTRAINTS (ci), args);
++ /* Check if we've seen a previous result. */
++ if (tree prev = lookup_constraint_satisfaction (ci, args))
++ return prev;
++
++ /* Actually test for satisfaction. */
++ tree result = satisfy_constraint (CI_ASSOCIATED_CONSTRAINTS (ci), args);
++ return memoize_constraint_satisfaction (ci, args, result);
+ }
+
+ } /* namespace */
+@@ -2059,7 +2338,7 @@
+ evaluate_constraints (tree constr, tree args)
+ {
+ gcc_assert (constraint_p (constr));
+- return satisfy_constraint (normalize_constraint (constr), args);
++ return satisfy_constraint (constr, args);
+ }
+
+ /* Evaluate the function concept FN by substituting its own args
+@@ -2070,14 +2349,7 @@
+ tree
+ evaluate_function_concept (tree fn, tree args)
+ {
+- ++processing_template_decl;
+- /* We lift using DECL_TI_ARGS because we want to delay producing
+- non-dependent expressions until we're doing satisfaction. We can't just
+- go without any substitution because we need to lower the level of 'auto's
+- in type deduction constraints. */
+- tree constr = transform_expression (lift_function_definition
+- (fn, DECL_TI_ARGS (fn)));
+- --processing_template_decl;
++ tree constr = build_nt (CHECK_CONSTR, fn, args);
+ return satisfy_constraint (constr, args);
+ }
+
+@@ -2087,12 +2359,9 @@
+ boolean_false_node otherwise. */
+
+ tree
+-evaluate_variable_concept (tree decl, tree args)
++evaluate_variable_concept (tree var, tree args)
+ {
+- ++processing_template_decl;
+- tree constr = transform_expression (lift_variable_initializer
+- (decl, DECL_TI_ARGS (decl)));
+- --processing_template_decl;
++ tree constr = build_nt (CHECK_CONSTR, var, args);
+ return satisfy_constraint (constr, args);
+ }
+
+@@ -2103,9 +2372,7 @@
+ tree
+ evaluate_constraint_expression (tree expr, tree args)
+ {
+- ++processing_template_decl;
+- tree constr = transform_expression (lift_expression (expr));
+- --processing_template_decl;
++ tree constr = normalize_expression (expr);
+ return satisfy_constraint (constr, args);
+ }
+
+@@ -2165,7 +2432,6 @@
+
+ } /* namespace */
+
+-
+ /*---------------------------------------------------------------------------
+ Semantic analysis of requires-expressions
+ ---------------------------------------------------------------------------*/
+@@ -2309,6 +2575,7 @@
+ ---------------------------------------------------------------------------*/
+
+ /* Returns true when the the constraints in A subsume those in B. */
++
+ bool
+ subsumes_constraints (tree a, tree b)
+ {
+@@ -2332,6 +2599,7 @@
+
+ Returns 1 if A is more constrained than B, -1 if B is more constrained
+ than A, and 0 otherwise. */
++
+ int
+ more_constrained (tree d1, tree d2)
+ {
+@@ -2348,6 +2616,7 @@
+ /* Returns true if D1 is at least as constrained as D2. That is, the
+ associated constraints of D1 subsume those of D2, or both declarations
+ are unconstrained. */
++
+ bool
+ at_least_as_constrained (tree d1, tree d2)
+ {
+@@ -2359,49 +2628,71 @@
+
+ /*---------------------------------------------------------------------------
+ Constraint diagnostics
++
++FIXME: Normalize expressions into constraints before evaluating them.
++This should be the general pattern for all such diagnostics.
+ ---------------------------------------------------------------------------*/
+
+-/* The diagnosis of constraints performs a combination of
+- normalization and satisfaction testing. We recursively
+- walk through the conjunction (or disjunctions) of associated
+- constraints, testing each sub-expression in turn.
+-
+- We currently restrict diagnostics to just the top-level
+- conjunctions within the associated constraints. A fully
+- recursive walk is possible, but it can generate a lot
+- of errors. */
++/* The number of detailed constraint failures. */
+
++int constraint_errors = 0;
+
+-namespace {
++/* Do not generate errors after diagnosing this number of constraint
++ failures.
+
+-void diagnose_expression (location_t, tree, tree);
+-void diagnose_constraint (location_t, tree, tree);
++ FIXME: This is a really arbitrary number. Provide better control of
++ constraint diagnostics with a command line option. */
+
+-/* Diagnose a conjunction of constraints. */
+-void
+-diagnose_logical_operation (location_t loc, tree t, tree args)
++int constraint_thresh = 20;
++
++
++/* Returns true if we should elide the diagnostic for a constraint failure.
++ This is the case when the number of errors has exceeded the pre-configured
++ threshold. */
++
++inline bool
++elide_constraint_failure_p ()
+ {
+- diagnose_expression (loc, TREE_OPERAND (t, 0), args);
+- diagnose_expression (loc, TREE_OPERAND (t, 0), args);
++ bool ret = constraint_thresh <= constraint_errors;
++ ++constraint_errors;
++ return ret;
+ }
+
+-/* Determine if the trait expression T is satisfied by ARGS.
+- Emit a precise diagnostic if it is not. */
++/* Returns the number of undiagnosed errors. */
++
++inline int
++undiagnosed_constraint_failures ()
++{
++ return constraint_errors - constraint_thresh;
++}
++
++/* The diagnosis of constraints performs a combination of normalization
++ and satisfaction testing. We recursively walk through the conjunction or
++ disjunction of associated constraints, testing each sub-constraint in
++ turn. */
++
++namespace {
++
++void diagnose_constraint (location_t, tree, tree, tree);
++
++/* Emit a specific diagnostics for a failed trait. */
++
+ void
+-diagnose_trait_expression (location_t loc, tree t, tree args)
++diagnose_trait_expression (location_t loc, tree, tree cur, tree args)
+ {
+- if (constraint_expression_satisfied_p (t, args))
++ if (constraint_expression_satisfied_p (cur, args))
++ return;
++ if (elide_constraint_failure_p())
+ return;
+
+- /* Rebuild the trait expression so we can diagnose the
+- specific failure. */
++ tree expr = PRED_CONSTR_EXPR (cur);
+ ++processing_template_decl;
+- tree expr = tsubst_expr (t, args, tf_none, NULL_TREE, false);
++ expr = tsubst_expr (expr, args, tf_none, NULL_TREE, false);
+ --processing_template_decl;
+
+ tree t1 = TRAIT_EXPR_TYPE1 (expr);
+ tree t2 = TRAIT_EXPR_TYPE2 (expr);
+- switch (TRAIT_EXPR_KIND (t))
++ switch (TRAIT_EXPR_KIND (expr))
+ {
+ case CPTK_HAS_NOTHROW_ASSIGN:
+ inform (loc, " %qT is not nothrow copy assignable", t1);
+@@ -2471,93 +2762,52 @@
+ }
+ }
+
+-/* Determine if the call expression T, when normalized as a constraint,
+- is satisfied by ARGS.
++/* Diagnose the expression of a predicate constraint. */
+
+- TODO: If T is refers to a concept, We could recursively analyze
+- its definition to identify the exact failure, but that could
+- emit a *lot* of error messages (defeating the purpose of
+- improved diagnostics). Consider adding a flag to control the
+- depth of diagnostics. */
+ void
+-diagnose_call_expression (location_t loc, tree t, tree args)
++diagnose_other_expression (location_t loc, tree, tree cur, tree args)
+ {
+- if (constraint_expression_satisfied_p (t, args))
++ if (constraint_expression_satisfied_p (cur, args))
+ return;
+-
+- /* Rebuild the expression for the purpose of diagnostics. */
+- ++processing_template_decl;
+- tree expr = tsubst_expr (t, args, tf_none, NULL_TREE, false);
+- --processing_template_decl;
+-
+- /* If the function call is known to be a concept check, then
+- diagnose it differently (i.e., we may recurse). */
+- if (resolve_constraint_check (t))
+- inform (loc, " concept %qE was not satisfied", expr);
+- else
+- inform (loc, " %qE evaluated to false", expr);
+-}
+-
+-/* Determine if the template-id T, when normalized as a constraint
+- is satisfied by ARGS. */
+-void
+-diagnose_template_id (location_t loc, tree t, tree args)
+-{
+- /* Check for invalid template-ids. */
+- if (!variable_template_p (TREE_OPERAND (t, 0)))
+- {
+- inform (loc, " invalid constraint %qE", t);
+- return;
+- }
+-
+- if (constraint_expression_satisfied_p (t, args))
++ if (elide_constraint_failure_p())
+ return;
++ inform (loc, "%qE evaluated to false", cur);
++}
+
+- /* Rebuild the expression for the purpose of diagnostics. */
+- ++processing_template_decl;
+- tree expr = tsubst_expr (t, args, tf_none, NULL_TREE, false);
+- --processing_template_decl;
++/* Do our best to infer meaning from predicates. */
+
+- tree var = DECL_TEMPLATE_RESULT (TREE_OPERAND (t, 0));
+- if (DECL_DECLARED_CONCEPT_P (var))
+- inform (loc, " concept %qE was not satisfied", expr);
++inline void
++diagnose_predicate_constraint (location_t loc, tree orig, tree cur, tree args)
++{
++ if (TREE_CODE (PRED_CONSTR_EXPR (cur)) == TRAIT_EXPR)
++ diagnose_trait_expression (loc, orig, cur, args);
+ else
+- inform (loc, " %qE evaluated to false", expr);
++ diagnose_other_expression (loc, orig, cur, args);
+ }
+
+-/* Determine if the requires-expression, when normalized as a
+- constraint is satisfied by ARGS.
++/* Diagnose a failed pack expansion, possibly containing constraints. */
+
+- TODO: Build sets of expressions, types, and constraints
+- based on the requirements in T and emit specific diagnostics
+- for those. */
+ void
+-diagnose_requires_expression (location_t loc, tree t, tree args)
++diagnose_pack_expansion (location_t loc, tree, tree cur, tree args)
+ {
+- if (constraint_expression_satisfied_p (t, args))
++ if (constraint_expression_satisfied_p (cur, args))
+ return;
+- inform (loc, "requirements not satisfied");
+-}
+-
+-void
+-diagnose_pack_expansion (location_t loc, tree t, tree args)
+-{
+- if (constraint_expression_satisfied_p (t, args))
++ if (elide_constraint_failure_p())
+ return;
+
+ /* Make sure that we don't have naked packs that we don't expect. */
+- if (!same_type_p (TREE_TYPE (t), boolean_type_node))
++ if (!same_type_p (TREE_TYPE (cur), boolean_type_node))
+ {
+- inform (loc, "invalid pack expansion in constraint %qE", t);
++ inform (loc, "invalid pack expansion in constraint %qE", cur);
+ return;
+ }
+
+- inform (loc, " in the expansion of %qE", t);
++ inform (loc, "in the expansion of %qE", cur);
+
+ /* Get the vector of expanded arguments. Note that n must not
+ be 0 since this constraint is not satisfied. */
+ ++processing_template_decl;
+- tree exprs = tsubst_pack_expansion (t, args, tf_none, NULL_TREE);
++ tree exprs = tsubst_pack_expansion (cur, args, tf_none, NULL_TREE);
+ --processing_template_decl;
+ if (exprs == error_mark_node)
+ {
+@@ -2576,82 +2826,276 @@
+ }
+ }
+
+-/* Diagnose an expression that would be characterized as
+- a predicate constraint. */
++/* Diagnose a potentially unsatisfied concept check constraint DECL<CARGS>.
++ Parameters are as for diagnose_constraint. */
++
+ void
+-diagnose_other_expression (location_t loc, tree t, tree args)
++diagnose_check_constraint (location_t loc, tree orig, tree cur, tree args)
+ {
+- if (constraint_expression_satisfied_p (t, args))
++ if (constraints_satisfied_p (cur, args))
+ return;
+- inform (loc, " %qE evaluated to false", t);
++
++ tree decl = CHECK_CONSTR_CONCEPT (cur);
++ tree cargs = CHECK_CONSTR_ARGS (cur);
++ tree tmpl = DECL_TI_TEMPLATE (decl);
++ tree check = build_nt (CHECK_CONSTR, decl, cargs);
++
++ /* Instantiate the concept check arguments. */
++ tree targs = tsubst (cargs, args, tf_none, NULL_TREE);
++ if (targs == error_mark_node)
++ {
++ if (elide_constraint_failure_p ())
++ return;
++ inform (loc, "invalid use of the concept %qE", check);
++ tsubst (cargs, args, tf_warning_or_error, NULL_TREE);
++ return;
++ }
++
++ tree sub = build_tree_list (tmpl, targs);
++ /* Update to the expanded definitions. */
++ cur = expand_concept (decl, targs);
++ if (cur == error_mark_node)
++ {
++ if (elide_constraint_failure_p ())
++ return;
++ inform (loc, "in the expansion of concept %qE %S", check, sub);
++ cur = get_concept_definition (decl);
++ tsubst_expr (cur, targs, tf_warning_or_error, NULL_TREE, false);
++ return;
++ }
++
++ orig = get_concept_definition (CHECK_CONSTR_CONCEPT (orig));
++ orig = normalize_expression (orig);
++
++ location_t dloc = DECL_SOURCE_LOCATION (decl);
++ inform (dloc, "within %qS", sub);
++ diagnose_constraint (dloc, orig, cur, targs);
+ }
+
++/* Diagnose a potentially unsatisfied conjunction or disjunction. Parameters
++ are as for diagnose_constraint. */
++
+ void
+-diagnose_expression (location_t loc, tree t, tree args)
++diagnose_logical_constraint (location_t loc, tree orig, tree cur, tree args)
+ {
+- switch (TREE_CODE (t))
+- {
+- case TRUTH_ANDIF_EXPR:
+- diagnose_logical_operation (loc, t, args);
+- break;
++ tree t0 = TREE_OPERAND (cur, 0);
++ tree t1 = TREE_OPERAND (cur, 1);
++ if (!constraints_satisfied_p (t0, args))
++ diagnose_constraint (loc, TREE_OPERAND (orig, 0), t0, args);
++ else if (TREE_CODE (orig) == TRUTH_ORIF_EXPR)
++ return;
++ if (!constraints_satisfied_p (t1, args))
++ diagnose_constraint (loc, TREE_OPERAND (orig, 1), t1, args);
++}
+
+- case TRUTH_ORIF_EXPR:
+- diagnose_logical_operation (loc, t, args);
+- break;
++/* Diagnose a potential expression constraint failure. */
+
+- case CALL_EXPR:
+- diagnose_call_expression (loc, t, args);
+- break;
++void
++diagnose_expression_constraint (location_t loc, tree orig, tree cur, tree args)
++{
++ if (constraints_satisfied_p (cur, args))
++ return;
++ if (elide_constraint_failure_p())
++ return;
+
+- case TEMPLATE_ID_EXPR:
+- diagnose_template_id (loc, t, args);
+- break;
++ tree expr = EXPR_CONSTR_EXPR (orig);
++ inform (loc, "the required expression %qE would be ill-formed", expr);
+
+- case REQUIRES_EXPR:
+- diagnose_requires_expression (loc, t, args);
+- break;
++ // TODO: We should have a flag that controls this substitution.
++ // I'm finding it very useful for resolving concept check errors.
+
+- case TRAIT_EXPR:
+- diagnose_trait_expression (loc, t, args);
+- break;
++ // inform (input_location, "==== BEGIN DUMP ====");
++ // tsubst_expr (EXPR_CONSTR_EXPR (orig), args, tf_warning_or_error, NULL_TREE, false);
++ // inform (input_location, "==== END DUMP ====");
++}
+
+- case EXPR_PACK_EXPANSION:
+- diagnose_pack_expansion (loc, t, args);
+- break;
++/* Diagnose a potentially failed type constraint. */
+
+- default:
+- diagnose_other_expression (loc, t, args);
+- break;
++void
++diagnose_type_constraint (location_t loc, tree orig, tree cur, tree args)
++{
++ if (constraints_satisfied_p (cur, args))
++ return;
++ if (elide_constraint_failure_p())
++ return;
++
++ tree type = TYPE_CONSTR_TYPE (orig);
++ inform (loc, "the required type %qT would be ill-formed", type);
++}
++
++/* Diagnose a potentially unsatisfied conversion constraint. */
++
++void
++diagnose_implicit_conversion_constraint (location_t loc, tree orig, tree cur,
++ tree args)
++{
++ if (constraints_satisfied_p (cur, args))
++ return;
++
++ /* The expression and type will previously have been substituted into,
++ and therefore may already be an error. Also, we will have already
++ diagnosed substitution failures into an expression since this must be
++ part of a compound requirement. */
++ tree expr = ICONV_CONSTR_EXPR (cur);
++ if (error_operand_p (expr))
++ return;
++
++ /* Don't elide a previously diagnosed failure. */
++ if (elide_constraint_failure_p())
++ return;
++
++ tree type = ICONV_CONSTR_TYPE (cur);
++ if (error_operand_p (type))
++ {
++ inform (loc, "substitution into type %qT failed",
++ ICONV_CONSTR_TYPE (orig));
++ return;
+ }
++
++ inform(loc, "%qE is not implicitly convertible to %qT", expr, type);
+ }
+
+-inline void
+-diagnose_predicate_constraint (location_t loc, tree t, tree args)
++/* Diagnose an argument deduction constraint. */
++
++void
++diagnose_argument_deduction_constraint (location_t loc, tree orig, tree cur,
++ tree args)
+ {
+- diagnose_expression (loc, PRED_CONSTR_EXPR (t), args);
++ if (constraints_satisfied_p (cur, args))
++ return;
++
++ /* The expression and type will previously have been substituted into,
++ and therefore may already be an error. Also, we will have already
++ diagnosed substution failures into an expression since this must be
++ part of a compound requirement. */
++ tree expr = DEDUCT_CONSTR_EXPR (cur);
++ if (error_operand_p (expr))
++ return;
++
++ /* Don't elide a previously diagnosed failure. */
++ if (elide_constraint_failure_p ())
++ return;
++
++ tree pattern = DEDUCT_CONSTR_PATTERN (cur);
++ if (error_operand_p (pattern))
++ {
++ inform (loc, "substitution into type %qT failed",
++ DEDUCT_CONSTR_PATTERN (orig));
++ return;
++ }
++
++ inform (loc, "unable to deduce placeholder type %qT from %qE",
++ pattern, expr);
+ }
+
+-inline void
+-diagnose_conjunction (location_t loc, tree t, tree args)
++/* Diagnose an exception constraint. */
++
++void
++diagnose_exception_constraint (location_t loc, tree orig, tree cur, tree args)
+ {
+- diagnose_constraint (loc, TREE_OPERAND (t, 0), args);
+- diagnose_constraint (loc, TREE_OPERAND (t, 1), args);
++ if (constraints_satisfied_p (cur, args))
++ return;
++ if (elide_constraint_failure_p ())
++ return;
++
++ /* Rebuild a noexcept expression. */
++ tree expr = EXCEPT_CONSTR_EXPR (cur);
++ if (error_operand_p (expr))
++ return;
++
++ inform (loc, "%qE evaluated to false", EXCEPT_CONSTR_EXPR (orig));
+ }
+
+-/* Diagnose the constraint T for the given ARGS. This is only
+- ever invoked on the associated constraints, so we can
+- only have conjunctions of predicate constraints. */
++/* Diagnose a potentially unsatisfied parameterized constraint. */
++
+ void
+-diagnose_constraint (location_t loc, tree t, tree args)
++diagnose_parameterized_constraint (location_t loc, tree orig, tree cur,
++ tree args)
+ {
+- switch (TREE_CODE (t))
++ if (constraints_satisfied_p (cur, args))
++ return;
++
++ local_specialization_stack stack;
++ tree parms = PARM_CONSTR_PARMS (cur);
++ tree vars = tsubst_constraint_variables (parms, args, tf_warning_or_error,
++ NULL_TREE);
++ if (vars == error_mark_node)
++ {
++ if (elide_constraint_failure_p ())
++ return;
++
++ /* TODO: Check which variable failed and use orig to diagnose
++ that substitution error. */
++ inform (loc, "failed to instantiate constraint variables");
++ return;
++ }
++
++ /* TODO: It would be better write these in a list. */
++ while (vars)
++ {
++ inform (loc, " with %q#D", vars);
++ vars = TREE_CHAIN (vars);
++ }
++ orig = PARM_CONSTR_OPERAND (orig);
++ cur = PARM_CONSTR_OPERAND (cur);
++ return diagnose_constraint (loc, orig, cur, args);
++}
++
++/* Diagnose the constraint CUR for the given ARGS. This is only ever invoked
++ on the associated constraints, so we can only have conjunctions of
++ predicate constraints. The ORIGinal (dependent) constructs follow
++ the current constraints to enable better diagnostics. Note that ORIG
++ and CUR must be the same kinds of node, except when CUR is an error. */
++
++void
++diagnose_constraint (location_t loc, tree orig, tree cur, tree args)
++{
++ switch (TREE_CODE (cur))
+ {
++ case EXPR_CONSTR:
++ diagnose_expression_constraint (loc, orig, cur, args);
++ break;
++
++ case TYPE_CONSTR:
++ diagnose_type_constraint (loc, orig, cur, args);
++ break;
++
++ case ICONV_CONSTR:
++ diagnose_implicit_conversion_constraint (loc, orig, cur, args);
++ break;
++
++ case DEDUCT_CONSTR:
++ diagnose_argument_deduction_constraint (loc, orig, cur, args);
++ break;
++
++ case EXCEPT_CONSTR:
++ diagnose_exception_constraint (loc, orig, cur, args);
++ break;
++
+ case CONJ_CONSTR:
+- diagnose_conjunction (loc, t, args);
++ case DISJ_CONSTR:
++ diagnose_logical_constraint (loc, orig, cur, args);
+ break;
+
+ case PRED_CONSTR:
+- diagnose_predicate_constraint (loc, t, args);
++ diagnose_predicate_constraint (loc, orig, cur, args);
++ break;
++
++ case PARM_CONSTR:
++ diagnose_parameterized_constraint (loc, orig, cur, args);
++ break;
++
++ case CHECK_CONSTR:
++ diagnose_check_constraint (loc, orig, cur, args);
++ break;
++
++ case EXPR_PACK_EXPANSION:
++ diagnose_pack_expansion (loc, orig, cur, args);
++ break;
++
++ case ERROR_MARK:
++ /* TODO: Can we improve the diagnostic with the original? */
++ inform (input_location, "ill-formed constraint");
+ break;
+
+ default:
+@@ -2676,16 +3120,10 @@
+ args = TI_ARGS (ti);
+ }
+
+- /* Check that the constraints are actually valid. */
+- tree ci = get_constraints (decl);
+- if (!valid_constraints_p (ci))
+- {
+- inform (loc, " invalid constraints");
+- return;
+- }
+-
+ /* Recursively diagnose the associated constraints. */
+- diagnose_constraint (loc, CI_ASSOCIATED_CONSTRAINTS (ci), args);
++ tree ci = get_constraints (decl);
++ tree t = CI_ASSOCIATED_CONSTRAINTS (ci);
++ diagnose_constraint (loc, t, t, args);
+ }
+
+ } // namespace
+@@ -2697,8 +3135,17 @@
+ void
+ diagnose_constraints (location_t loc, tree t, tree args)
+ {
++ constraint_errors = 0;
++
+ if (constraint_p (t))
+- diagnose_constraint (loc, t, args);
+- else
++ diagnose_constraint (loc, t, t, args);
++ else if (DECL_P (t))
+ diagnose_declaration_constraints (loc, t, args);
++ else
++ gcc_unreachable ();
++
++ /* Note the number of elided failures. */
++ int n = undiagnosed_constraint_failures ();
++ if (n > 0)
++ inform (loc, "... and %d more constraint errors not shown", n);
+ }
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/cp/cp-gimplify.c gcc-6-20160721/gcc/cp/cp-gimplify.c
+--- gcc-6.1.0/gcc/cp/cp-gimplify.c 2016-04-13 14:33:53.000000000 +0000
++++ gcc-6-20160721/gcc/cp/cp-gimplify.c 2016-07-21 07:13:42.000000000 +0000
+@@ -592,6 +592,8 @@
+ init, VEC_INIT_EXPR_VALUE_INIT (*expr_p),
+ from_array,
+ tf_warning_or_error);
++ hash_set<tree> pset;
++ cp_walk_tree (expr_p, cp_fold_r, &pset, NULL);
+ cp_genericize_tree (expr_p);
+ ret = GS_OK;
+ input_location = loc;
+@@ -939,6 +941,17 @@
+
+ *stmt_p = stmt = cp_fold (*stmt_p);
+
++ if (((hash_set<tree> *) data)->add (stmt))
++ {
++ /* Don't walk subtrees of stmts we've already walked once, otherwise
++ we can have exponential complexity with e.g. lots of nested
++ SAVE_EXPRs or TARGET_EXPRs. cp_fold uses a cache and will return
++ always the same tree, which the first time cp_fold_r has been
++ called on it had the subtrees walked. */
++ *walk_subtrees = 0;
++ return NULL;
++ }
++
+ code = TREE_CODE (stmt);
+ if (code == OMP_FOR || code == OMP_SIMD || code == OMP_DISTRIBUTE
+ || code == OMP_TASKLOOP || code == CILK_FOR || code == CILK_SIMD
+@@ -996,7 +1009,8 @@
+ void
+ cp_fold_function (tree fndecl)
+ {
+- cp_walk_tree (&DECL_SAVED_TREE (fndecl), cp_fold_r, NULL, NULL);
++ hash_set<tree> pset;
++ cp_walk_tree (&DECL_SAVED_TREE (fndecl), cp_fold_r, &pset, NULL);
+ }
+
+ /* Perform any pre-gimplification lowering of C++ front end trees to
+@@ -1266,7 +1280,15 @@
+ {
+ tree d = DECL_EXPR_DECL (stmt);
+ if (TREE_CODE (d) == VAR_DECL)
+- gcc_assert (CP_DECL_THREAD_LOCAL_P (d) == DECL_THREAD_LOCAL_P (d));
++ {
++ gcc_assert (CP_DECL_THREAD_LOCAL_P (d) == DECL_THREAD_LOCAL_P (d));
++ /* User var initializers should be genericized during containing
++ BIND_EXPR genericization when walk_tree walks DECL_INITIAL
++ of BIND_EXPR_VARS. Artificial temporaries might not be
++ mentioned there though, so walk them now. */
++ if (DECL_ARTIFICIAL (d) && !TREE_STATIC (d) && DECL_INITIAL (d))
++ cp_walk_tree (&DECL_INITIAL (d), cp_genericize_r, data, NULL);
++ }
+ }
+ else if (TREE_CODE (stmt) == OMP_PARALLEL
+ || TREE_CODE (stmt) == OMP_TASK
+@@ -1547,6 +1569,13 @@
+ if (DECL_CLONED_FUNCTION_P (fndecl))
+ return;
+
++ /* Allow cp_genericize calls to be nested. */
++ tree save_bc_label[2];
++ save_bc_label[bc_break] = bc_label[bc_break];
++ save_bc_label[bc_continue] = bc_label[bc_continue];
++ bc_label[bc_break] = NULL_TREE;
++ bc_label[bc_continue] = NULL_TREE;
++
+ /* Expand all the array notations here. */
+ if (flag_cilkplus
+ && contains_array_notation_expr (DECL_SAVED_TREE (fndecl)))
+@@ -1566,6 +1595,8 @@
+
+ gcc_assert (bc_label[bc_break] == NULL);
+ gcc_assert (bc_label[bc_continue] == NULL);
++ bc_label[bc_break] = save_bc_label[bc_break];
++ bc_label[bc_continue] = save_bc_label[bc_continue];
+ }
+
+ /* Build code to apply FN to each member of ARG1 and ARG2. FN may be
+@@ -1877,13 +1908,21 @@
+ static tree
+ cp_fold_maybe_rvalue (tree x, bool rval)
+ {
+- if (rval && DECL_P (x))
++ while (true)
+ {
+- tree v = decl_constant_value (x);
+- if (v != error_mark_node)
+- x = v;
++ x = cp_fold (x);
++ if (rval && DECL_P (x))
++ {
++ tree v = decl_constant_value (x);
++ if (v != x && v != error_mark_node)
++ {
++ x = v;
++ continue;
++ }
++ }
++ break;
+ }
+- return cp_fold (x);
++ return x;
+ }
+
+ /* Fold expression X which is used as an rvalue. */
+@@ -1995,6 +2034,15 @@
+
+ break;
+
++ case INDIRECT_REF:
++ /* We don't need the decltype(auto) obfuscation anymore. */
++ if (REF_PARENTHESIZED_P (x))
++ {
++ tree p = maybe_undo_parenthesized_ref (x);
++ return cp_fold (p);
++ }
++ goto unary;
++
+ case ADDR_EXPR:
+ case REALPART_EXPR:
+ case IMAGPART_EXPR:
+@@ -2007,7 +2055,7 @@
+ case BIT_NOT_EXPR:
+ case TRUTH_NOT_EXPR:
+ case FIXED_CONVERT_EXPR:
+- case INDIRECT_REF:
++ unary:
+
+ loc = EXPR_LOCATION (x);
+ op0 = cp_fold_maybe_rvalue (TREE_OPERAND (x, 0), rval_ops);
+@@ -2017,7 +2065,16 @@
+ if (op0 == error_mark_node)
+ x = error_mark_node;
+ else
+- x = fold_build1_loc (loc, code, TREE_TYPE (x), op0);
++ {
++ x = fold_build1_loc (loc, code, TREE_TYPE (x), op0);
++ if (code == INDIRECT_REF
++ && (INDIRECT_REF_P (x) || TREE_CODE (x) == MEM_REF))
++ {
++ TREE_READONLY (x) = TREE_READONLY (org_x);
++ TREE_SIDE_EFFECTS (x) = TREE_SIDE_EFFECTS (org_x);
++ TREE_THIS_VOLATILE (x) = TREE_THIS_VOLATILE (org_x);
++ }
++ }
+ }
+ else
+ x = fold (x);
+@@ -2294,7 +2351,12 @@
+ || op3 == error_mark_node)
+ x = error_mark_node;
+ else
+- x = build4_loc (loc, code, TREE_TYPE (x), op0, op1, op2, op3);
++ {
++ x = build4_loc (loc, code, TREE_TYPE (x), op0, op1, op2, op3);
++ TREE_READONLY (x) = TREE_READONLY (org_x);
++ TREE_SIDE_EFFECTS (x) = TREE_SIDE_EFFECTS (org_x);
++ TREE_THIS_VOLATILE (x) = TREE_THIS_VOLATILE (org_x);
++ }
+ }
+
+ x = fold (x);
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/cp/cp-tree.def gcc-6-20160721/gcc/cp/cp-tree.def
+--- gcc-6.1.0/gcc/cp/cp-tree.def 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/gcc/cp/cp-tree.def 2016-07-21 06:18:06.000000000 +0000
+@@ -536,6 +536,14 @@
+ PRED_CONSTR_EXPR has the expression to be evaluated. */
+ DEFTREECODE (PRED_CONSTR, "pred_constr", tcc_expression, 1)
+
++/* A check constraint represents the checking of a concept
++ C. It has two operands: the template defining the concept
++ and a sequence of template arguments.
++
++ CHECK_CONSTR_CONCEPT has the concept definition
++ CHECK_CONSTR_ARGUMENTS are the template arguments */
++DEFTREECODE (CHECK_CONSTR, "check_constr", tcc_expression, 2)
++
+ /* An expression constraint determines the validity of a expression E.
+
+ EXPR_CONST_EXPR has the expression being validated. */
+@@ -560,7 +568,7 @@
+ T must contain at least one place holder.
+
+ DEDUCT_CONSTR_EXPR has the expression E
+- DEDUCT_CONSTR_PATTERN has the type patter T.
++ DEDUCT_CONSTR_PATTERN has the type pattern T.
+ DEDUCT_CONSTR_PLACEHOLDERS has the list of placeholder nodes in T. */
+ DEFTREECODE (DEDUCT_CONSTR, "deduct_constr", tcc_expression, 3)
+
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/cp/cp-tree.h gcc-6-20160721/gcc/cp/cp-tree.h
+--- gcc-6.1.0/gcc/cp/cp-tree.h 2016-04-15 14:51:06.000000000 +0000
++++ gcc-6-20160721/gcc/cp/cp-tree.h 2016-07-21 06:29:32.000000000 +0000
+@@ -170,7 +170,7 @@
+ TARGET_EXPR_DIRECT_INIT_P (in TARGET_EXPR)
+ FNDECL_USED_AUTO (in FUNCTION_DECL)
+ DECLTYPE_FOR_LAMBDA_PROXY (in DECLTYPE_TYPE)
+- REF_PARENTHESIZED_P (in COMPONENT_REF, INDIRECT_REF)
++ REF_PARENTHESIZED_P (in COMPONENT_REF, INDIRECT_REF, SCOPE_REF)
+ AGGR_INIT_ZERO_FIRST (in AGGR_INIT_EXPR)
+ CONSTRUCTOR_MUTABLE_POISON (in CONSTRUCTOR)
+ 3: (TREE_REFERENCE_EXPR) (in NON_LVALUE_EXPR) (commented-out).
+@@ -891,10 +891,6 @@
+ // - a constraint expression introduced by a function declarator
+ // - the associated constraints, which are the conjunction of those,
+ // and used for declaration matching
+-// - the cached normalized associated constraints which are used
+-// to support satisfaction and subsumption.
+-// - assumptions which is the result of decomposing the normalized
+-// constraints.
+ //
+ // The template and declarator requirements are kept to support pretty
+ // printing constrained declarations.
+@@ -903,8 +899,6 @@
+ tree template_reqs;
+ tree declarator_reqs;
+ tree associated_constr;
+- tree normalized_constr;
+- tree assumptions;
+ };
+
+ // Require that pointer P is non-null before returning.
+@@ -943,14 +937,6 @@
+ #define CI_ASSOCIATED_CONSTRAINTS(NODE) \
+ check_constraint_info (check_nonnull(NODE))->associated_constr
+
+-// The normalized associated constraints.
+-#define CI_NORMALIZED_CONSTRAINTS(NODE) \
+- check_constraint_info (check_nonnull(NODE))->normalized_constr
+-
+-// Get the set of assumptions associated with the constraint info node.
+-#define CI_ASSUMPTIONS(NODE) \
+- check_constraint_info (check_nonnull(NODE))->assumptions
+-
+ // Access the logical constraints on the template parameters introduced
+ // at a given template parameter list level indicated by NODE.
+ #define TEMPLATE_PARMS_CONSTRAINTS(NODE) \
+@@ -974,6 +960,14 @@
+ #define PRED_CONSTR_EXPR(NODE) \
+ TREE_OPERAND (TREE_CHECK (NODE, PRED_CONSTR), 0)
+
++/* The concept of a concept check. */
++#define CHECK_CONSTR_CONCEPT(NODE) \
++ TREE_OPERAND (TREE_CHECK (NODE, CHECK_CONSTR), 0)
++
++/* The template arguments of a concept check. */
++#define CHECK_CONSTR_ARGS(NODE) \
++ TREE_OPERAND (TREE_CHECK (NODE, CHECK_CONSTR), 1)
++
+ /* The expression validated by the predicate constraint. */
+ #define EXPR_CONSTR_EXPR(NODE) \
+ TREE_OPERAND (TREE_CHECK (NODE, EXPR_CONSTR), 0)
+@@ -3332,11 +3326,11 @@
+ TREE_CHECK2 (NODE, BINARY_LEFT_FOLD_EXPR, BINARY_RIGHT_FOLD_EXPR)
+
+ /* True if NODE is UNARY_FOLD_EXPR or a BINARY_FOLD_EXPR */
+-#define FOLD_EXPR_P(NODE) \
+- TREE_CODE (NODE) == UNARY_LEFT_FOLD_EXPR \
+- || TREE_CODE (NODE) == UNARY_RIGHT_FOLD_EXPR \
+- || TREE_CODE (NODE) == BINARY_LEFT_FOLD_EXPR \
+- || TREE_CODE (NODE) == BINARY_RIGHT_FOLD_EXPR
++#define FOLD_EXPR_P(NODE) \
++ (TREE_CODE (NODE) == UNARY_LEFT_FOLD_EXPR \
++ || TREE_CODE (NODE) == UNARY_RIGHT_FOLD_EXPR \
++ || TREE_CODE (NODE) == BINARY_LEFT_FOLD_EXPR \
++ || TREE_CODE (NODE) == BINARY_RIGHT_FOLD_EXPR)
+
+ /* True when NODE is a fold over a compound assignment operator. */
+ #define FOLD_EXPR_MODIFY_P(NODE) \
+@@ -3398,12 +3392,12 @@
+ #define PAREN_STRING_LITERAL_P(NODE) \
+ TREE_LANG_FLAG_0 (STRING_CST_CHECK (NODE))
+
+-/* Indicates whether a COMPONENT_REF has been parenthesized, or an
+- INDIRECT_REF comes from parenthesizing a _DECL. Currently only set
+- some of the time in C++14 mode. */
++/* Indicates whether a COMPONENT_REF or a SCOPE_REF has been parenthesized, or
++ an INDIRECT_REF comes from parenthesizing a _DECL. Currently only set some
++ of the time in C++14 mode. */
+
+ #define REF_PARENTHESIZED_P(NODE) \
+- TREE_LANG_FLAG_2 (TREE_CHECK2 ((NODE), COMPONENT_REF, INDIRECT_REF))
++ TREE_LANG_FLAG_2 (TREE_CHECK3 ((NODE), COMPONENT_REF, INDIRECT_REF, SCOPE_REF))
+
+ /* Nonzero if this AGGR_INIT_EXPR provides for initialization via a
+ constructor call, rather than an ordinary function call. */
+@@ -4601,7 +4595,8 @@
+ class_type, /* "class" types. */
+ union_type, /* "union" types. */
+ enum_type, /* "enum" types. */
+- typename_type /* "typename" types. */
++ typename_type, /* "typename" types. */
++ scope_type /* namespace or tagged type name followed by :: */
+ };
+
+ /* The various kinds of lvalues we distinguish. */
+@@ -6096,6 +6091,7 @@
+ extern tree get_pattern_parm (tree, tree);
+ extern int comp_template_args (tree, tree, tree * = NULL,
+ tree * = NULL);
++extern int template_args_equal (tree, tree);
+ extern tree maybe_process_partial_specialization (tree);
+ extern tree most_specialized_instantiation (tree);
+ extern void print_candidates (tree);
+@@ -6809,10 +6805,8 @@
+ /* in constraint.cc */
+ extern void init_constraint_processing ();
+ extern bool constraint_p (tree);
+-extern tree make_predicate_constraint (tree);
+ extern tree conjoin_constraints (tree, tree);
+ extern tree conjoin_constraints (tree);
+-extern bool valid_constraints_p (tree);
+ extern tree get_constraints (tree);
+ extern void set_constraints (tree, tree);
+ extern void remove_constraints (tree);
+@@ -6843,13 +6837,23 @@
+ extern tree tsubst_constraint (tree, tree, tsubst_flags_t, tree);
+ extern tree tsubst_constraint_info (tree, tree, tsubst_flags_t, tree);
+ extern bool function_concept_check_p (tree);
+-
++extern tree normalize_expression (tree);
++extern tree expand_concept (tree, tree);
++extern bool expanding_concept ();
+ extern tree evaluate_constraints (tree, tree);
+ extern tree evaluate_function_concept (tree, tree);
+ extern tree evaluate_variable_concept (tree, tree);
+ extern tree evaluate_constraint_expression (tree, tree);
+ extern bool constraints_satisfied_p (tree);
+ extern bool constraints_satisfied_p (tree, tree);
++extern tree lookup_constraint_satisfaction (tree, tree);
++extern tree memoize_constraint_satisfaction (tree, tree, tree);
++extern tree lookup_concept_satisfaction (tree, tree);
++extern tree memoize_concept_satisfaction (tree, tree, tree);
++extern tree get_concept_expansion (tree, tree);
++extern tree save_concept_expansion (tree, tree, tree);
++extern bool* lookup_subsumption_result (tree, tree);
++extern bool save_subsumption_result (tree, tree, bool);
+
+ extern bool equivalent_constraints (tree, tree);
+ extern bool equivalently_constrained (tree, tree);
+@@ -6860,7 +6864,6 @@
+ extern void diagnose_constraints (location_t, tree, tree);
+
+ /* in logic.cc */
+-extern tree decompose_assumptions (tree);
+ extern tree decompose_conclusions (tree);
+ extern bool subsumes (tree, tree);
+
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/cp/cxx-pretty-print.c gcc-6-20160721/gcc/cp/cxx-pretty-print.c
+--- gcc-6.1.0/gcc/cp/cxx-pretty-print.c 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/gcc/cp/cxx-pretty-print.c 2016-07-21 06:18:06.000000000 +0000
+@@ -35,6 +35,9 @@
+ static void pp_cxx_template_parameter (cxx_pretty_printer *, tree);
+ static void pp_cxx_cast_expression (cxx_pretty_printer *, tree);
+ static void pp_cxx_typeid_expression (cxx_pretty_printer *, tree);
++static void pp_cxx_unary_left_fold_expression (cxx_pretty_printer *, tree);
++static void pp_cxx_unary_right_fold_expression (cxx_pretty_printer *, tree);
++static void pp_cxx_binary_fold_expression (cxx_pretty_printer *, tree);
+
+
+ static inline void
+@@ -1140,6 +1143,19 @@
+ pp_cxx_ws_string (this, "...");
+ break;
+
++ case UNARY_LEFT_FOLD_EXPR:
++ pp_cxx_unary_left_fold_expression (this, t);
++ break;
++
++ case UNARY_RIGHT_FOLD_EXPR:
++ pp_cxx_unary_right_fold_expression (this, t);
++ break;
++
++ case BINARY_LEFT_FOLD_EXPR:
++ case BINARY_RIGHT_FOLD_EXPR:
++ pp_cxx_binary_fold_expression (this, t);
++ break;
++
+ case TEMPLATE_ID_EXPR:
+ pp_cxx_template_id (this, t);
+ break;
+@@ -1166,6 +1182,7 @@
+ break;
+
+ case PRED_CONSTR:
++ case CHECK_CONSTR:
+ case EXPR_CONSTR:
+ case TYPE_CONSTR:
+ case ICONV_CONSTR:
+@@ -2199,6 +2216,11 @@
+ pp_cxx_constrained_type_spec (cxx_pretty_printer *pp, tree c)
+ {
+ tree t, a;
++ if (c == error_mark_node)
++ {
++ pp_cxx_ws_string(pp, "<unsatisfied-constrained-placeholder>");
++ return;
++ }
+ placeholder_extract_concept_and_args (c, t, a);
+ pp->id_expression (t);
+ if (TREE_VEC_LENGTH (a) > 1)
+@@ -2408,6 +2430,102 @@
+ pp_cxx_right_paren (pp);
+ }
+
++static char const*
++get_fold_operator (tree t)
++{
++ int op = int_cst_value (FOLD_EXPR_OP (t));
++ if (FOLD_EXPR_MODIFY_P (t))
++ {
++ switch (op)
++ {
++ case NOP_EXPR: return "=";
++ case PLUS_EXPR: return "+=";
++ case MINUS_EXPR: return "-=";
++ case MULT_EXPR: return "*=";
++ case TRUNC_DIV_EXPR: return "/=";
++ case TRUNC_MOD_EXPR: return "%=";
++ case BIT_XOR_EXPR: return "^=";
++ case BIT_AND_EXPR: return "&=";
++ case BIT_IOR_EXPR: return "|=";
++ case LSHIFT_EXPR: return "<<=";
++ case RSHIFT_EXPR: return ">>=";
++ default: gcc_unreachable ();
++ }
++ }
++ else
++ {
++ switch (op)
++ {
++ case PLUS_EXPR: return "+";
++ case MINUS_EXPR: return "-";
++ case MULT_EXPR: return "*";
++ case TRUNC_DIV_EXPR: return "/";
++ case TRUNC_MOD_EXPR: return "%";
++ case BIT_XOR_EXPR: return "^";
++ case BIT_AND_EXPR: return "&";
++ case BIT_IOR_EXPR: return "|";
++ case LSHIFT_EXPR: return "<<";
++ case RSHIFT_EXPR: return ">>";
++ case EQ_EXPR: return "==";
++ case NE_EXPR: return "!=";
++ case LT_EXPR: return "<";
++ case GT_EXPR: return ">";
++ case LE_EXPR: return "<=";
++ case GE_EXPR: return ">=";
++ case TRUTH_ANDIF_EXPR: return "&&";
++ case TRUTH_ORIF_EXPR: return "||";
++ case MEMBER_REF: return "->*";
++ case DOTSTAR_EXPR: return ".*";
++ case OFFSET_REF: return ".*";
++ default: return ","; /* FIXME: Not the right default. */
++ }
++ }
++}
++
++void
++pp_cxx_unary_left_fold_expression (cxx_pretty_printer *pp, tree t)
++{
++ char const* op = get_fold_operator (t);
++ tree expr = PACK_EXPANSION_PATTERN (FOLD_EXPR_PACK (t));
++ pp_cxx_left_paren (pp);
++ pp_cxx_ws_string (pp, "...");
++ pp_cxx_ws_string (pp, op);
++ pp->expression (expr);
++ pp_cxx_right_paren (pp);
++}
++
++void
++pp_cxx_unary_right_fold_expression (cxx_pretty_printer *pp, tree t)
++{
++ char const* op = get_fold_operator (t);
++ tree expr = PACK_EXPANSION_PATTERN (FOLD_EXPR_PACK (t));
++ pp_cxx_left_paren (pp);
++ pp->expression (expr);
++ pp_space (pp);
++ pp_cxx_ws_string (pp, op);
++ pp_cxx_ws_string (pp, "...");
++ pp_cxx_right_paren (pp);
++}
++
++void
++pp_cxx_binary_fold_expression (cxx_pretty_printer *pp, tree t)
++{
++ char const* op = get_fold_operator (t);
++ tree t1 = TREE_OPERAND (t, 1);
++ tree t2 = TREE_OPERAND (t, 2);
++ if (t1 == FOLD_EXPR_PACK (t))
++ t1 = PACK_EXPANSION_PATTERN (t1);
++ else
++ t2 = PACK_EXPANSION_PATTERN (t2);
++ pp_cxx_left_paren (pp);
++ pp->expression (t1);
++ pp_cxx_ws_string (pp, op);
++ pp_cxx_ws_string (pp, "...");
++ pp_cxx_ws_string (pp, op);
++ pp->expression (t2);
++ pp_cxx_right_paren (pp);
++}
++
+ void
+ pp_cxx_trait_expression (cxx_pretty_printer *pp, tree t)
+ {
+@@ -2618,6 +2736,7 @@
+ pp_cxx_ws_string (pp, "->");
+ pp->type_id (type);
+ }
++ pp_cxx_semicolon (pp);
+ }
+
+ /* nested requirement:
+@@ -2633,74 +2752,94 @@
+ void
+ pp_cxx_predicate_constraint (cxx_pretty_printer *pp, tree t)
+ {
+- pp_string (pp, "predicate");
+- pp_left_paren (pp);
+ pp->expression (TREE_OPERAND (t, 0));
+- pp_right_paren (pp);
++}
++
++void
++pp_cxx_check_constraint (cxx_pretty_printer *pp, tree t)
++{
++ tree decl = CHECK_CONSTR_CONCEPT (t);
++ tree tmpl = DECL_TI_TEMPLATE (decl);
++ tree args = CHECK_CONSTR_ARGS (t);
++ tree id = build_nt (TEMPLATE_ID_EXPR, tmpl, args);
++
++ if (TREE_CODE (decl) == VAR_DECL)
++ pp->expression (id);
++ else if (TREE_CODE (decl) == FUNCTION_DECL)
++ {
++ tree call = build_vl_exp (CALL_EXPR, 2);
++ TREE_OPERAND (call, 0) = integer_two_node;
++ TREE_OPERAND (call, 1) = id;
++ pp->expression (call);
++ }
++ else
++ gcc_unreachable ();
+ }
+
+ void
+ pp_cxx_expression_constraint (cxx_pretty_printer *pp, tree t)
+ {
+- pp_string (pp, "valid_expr");
+- pp_left_paren (pp);
++ pp_string (pp, "<valid-expression ");
++ pp_cxx_left_paren (pp);
+ pp->expression (TREE_OPERAND (t, 0));
+- pp_right_paren (pp);
++ pp_cxx_right_paren (pp);
++ pp_string (pp, ">");
+ }
+
+ void
+ pp_cxx_type_constraint (cxx_pretty_printer *pp, tree t)
+ {
+- pp_string (pp, "valid_type");
+- pp_left_paren (pp);
++ pp_string (pp, "<valid-type ");
+ pp->type_id (TREE_OPERAND (t, 0));
+- pp_right_paren (pp);
++ pp_string (pp, ">");
+ }
+
+ void
+ pp_cxx_implicit_conversion_constraint (cxx_pretty_printer *pp, tree t)
+ {
+- pp_string (pp, "convertible");
+- pp_left_paren (pp);
++ pp_string (pp, "<implicitly-conversion ");
++ pp_cxx_left_paren (pp);
+ pp->expression (ICONV_CONSTR_EXPR (t));
+- pp_cxx_separate_with (pp, ',');
+- pp->expression (ICONV_CONSTR_TYPE (t));
+- pp_right_paren (pp);
++ pp_cxx_right_paren (pp);
++ pp_cxx_ws_string (pp, "to");
++ pp->type_id (ICONV_CONSTR_TYPE (t));
++ pp_string (pp, ">");
+ }
+
+ void
+ pp_cxx_argument_deduction_constraint (cxx_pretty_printer *pp, tree t)
+ {
+- pp_string (pp, "deducible");
+- pp_left_paren (pp);
++ pp_string (pp, "<argument-deduction ");
++ pp_cxx_left_paren (pp);
+ pp->expression (DEDUCT_CONSTR_EXPR (t));
+- pp_cxx_separate_with (pp, ',');
++ pp_cxx_right_paren (pp);
++ pp_cxx_ws_string (pp, "as");
+ pp->expression (DEDUCT_CONSTR_PATTERN (t));
+- pp_right_paren (pp);
++ pp_string (pp, ">");
+ }
+
+ void
+ pp_cxx_exception_constraint (cxx_pretty_printer *pp, tree t)
+ {
+ pp_cxx_ws_string (pp, "noexcept");
+- pp_left_paren (pp);
++ pp_cxx_whitespace (pp);
++ pp_cxx_left_paren (pp);
+ pp->expression (TREE_OPERAND (t, 0));
+- pp_right_paren (pp);
++ pp_cxx_right_paren (pp);
+ }
+
+ void
+ pp_cxx_parameterized_constraint (cxx_pretty_printer *pp, tree t)
+ {
+ pp_left_paren (pp);
+- pp_string (pp, "forall");
++ pp_string (pp, "<requires ");
+ if (tree parms = PARM_CONSTR_PARMS (t))
+ {
+- if (parms)
+ pp_cxx_parameter_declaration_clause (pp, parms);
+ pp_cxx_whitespace (pp);
+ }
+ pp_cxx_constraint (pp, PARM_CONSTR_OPERAND (t));
+- pp_right_paren (pp);
++ pp_string (pp, ">");
+ }
+
+ void
+@@ -2731,6 +2870,10 @@
+ pp_cxx_predicate_constraint (pp, t);
+ break;
+
++ case CHECK_CONSTR:
++ pp_cxx_check_constraint (pp, t);
++ break;
++
+ case EXPR_CONSTR:
+ pp_cxx_expression_constraint (pp, t);
+ break;
+@@ -2763,6 +2906,10 @@
+ pp_cxx_disjunction (pp, t);
+ break;
+
++ case EXPR_PACK_EXPANSION:
++ pp->expression (TREE_OPERAND (t, 0));
++ break;
++
+ default:
+ gcc_unreachable ();
+ }
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/cp/decl.c gcc-6-20160721/gcc/cp/decl.c
+--- gcc-6.1.0/gcc/cp/decl.c 2016-04-15 04:02:49.000000000 +0000
++++ gcc-6-20160721/gcc/cp/decl.c 2016-07-21 06:18:06.000000000 +0000
+@@ -2090,6 +2090,14 @@
+ if (VAR_P (newdecl))
+ {
+ DECL_THIS_EXTERN (newdecl) |= DECL_THIS_EXTERN (olddecl);
++ /* For already initialized vars, TREE_READONLY could have been
++ cleared in cp_finish_decl, because the var needs runtime
++ initialization or destruction. Make sure not to set
++ TREE_READONLY on it again. */
++ if (DECL_INITIALIZED_P (olddecl)
++ && !DECL_EXTERNAL (olddecl)
++ && !TREE_READONLY (olddecl))
++ TREE_READONLY (newdecl) = 0;
+ DECL_INITIALIZED_P (newdecl) |= DECL_INITIALIZED_P (olddecl);
+ DECL_NONTRIVIALLY_INITIALIZED_P (newdecl)
+ |= DECL_NONTRIVIALLY_INITIALIZED_P (olddecl);
+@@ -5329,10 +5337,7 @@
+ complete_type (type);
+ if (!DECL_SIZE (decl)
+ && TREE_TYPE (decl) != error_mark_node
+- && (COMPLETE_TYPE_P (type)
+- || (TREE_CODE (type) == ARRAY_TYPE
+- && !TYPE_DOMAIN (type)
+- && COMPLETE_TYPE_P (TREE_TYPE (type)))))
++ && complete_or_array_type_p (type))
+ layout_decl (decl, 0);
+
+ if (!DECL_EXTERNAL (decl) && DECL_SIZE (decl) == NULL_TREE)
+@@ -6633,6 +6638,13 @@
+ adc_variable_type);
+ if (type == error_mark_node)
+ return;
++ if (TREE_CODE (type) == FUNCTION_TYPE)
++ {
++ error ("initializer for %<decltype(auto) %D%> has function type "
++ "(did you forget the %<()%> ?)", decl);
++ TREE_TYPE (decl) = error_mark_node;
++ return;
++ }
+ cp_apply_type_quals_to_decl (cp_type_quals (type), decl);
+ }
+
+@@ -7905,7 +7917,7 @@
+
+ /* Adjust the required expression into a constraint. */
+ if (decl_reqs)
+- decl_reqs = make_predicate_constraint (decl_reqs);
++ decl_reqs = normalize_expression (decl_reqs);
+
+ tree ci = build_constraints (tmpl_reqs, decl_reqs);
+ set_constraints (decl, ci);
+@@ -11186,8 +11198,7 @@
+ }
+ else if (!staticp && !dependent_type_p (type)
+ && !COMPLETE_TYPE_P (complete_type (type))
+- && (TREE_CODE (type) != ARRAY_TYPE
+- || !COMPLETE_TYPE_P (TREE_TYPE (type))
++ && (!complete_or_array_type_p (type)
+ || initialized == 0))
+ {
+ if (TREE_CODE (type) != ARRAY_TYPE
+@@ -13382,6 +13393,19 @@
+ use_short_enum = flag_short_enums
+ || lookup_attribute ("packed", TYPE_ATTRIBUTES (enumtype));
+
++ /* If the precision of the type was specified with an attribute and it
++ was too small, give an error. Otherwise, use it. */
++ if (TYPE_PRECISION (enumtype))
++ {
++ if (precision > TYPE_PRECISION (enumtype))
++ error ("specified mode too small for enumeral values");
++ else
++ {
++ use_short_enum = true;
++ precision = TYPE_PRECISION (enumtype);
++ }
++ }
++
+ for (itk = (use_short_enum ? itk_char : itk_int);
+ itk != itk_none;
+ itk++)
+@@ -14999,8 +15023,9 @@
+ tree var = iv->decl;
+ tree type = TREE_TYPE (var);
+
+- if (TYPE_MAIN_VARIANT (strip_array_types (type))
+- == iv->incomplete_type)
++ if (type != error_mark_node
++ && (TYPE_MAIN_VARIANT (strip_array_types (type))
++ == iv->incomplete_type))
+ {
+ /* Complete the type of the variable. The VAR_DECL itself
+ will be laid out in expand_expr. */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/cp/decl2.c gcc-6-20160721/gcc/cp/decl2.c
+--- gcc-6.1.0/gcc/cp/decl2.c 2016-04-15 14:51:06.000000000 +0000
++++ gcc-6-20160721/gcc/cp/decl2.c 2016-05-31 21:36:46.000000000 +0000
+@@ -4904,8 +4904,6 @@
+
+ finish_repo ();
+
+- fini_constexpr ();
+-
+ /* The entire file is now complete. If requested, dump everything
+ to a file. */
+ dump_tu ();
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/cp/error.c gcc-6-20160721/gcc/cp/error.c
+--- gcc-6.1.0/gcc/cp/error.c 2016-04-22 11:08:16.000000000 +0000
++++ gcc-6-20160721/gcc/cp/error.c 2016-07-21 06:18:06.000000000 +0000
+@@ -961,7 +961,12 @@
+ {
+ if (VAR_P (t)
+ && DECL_DECLARED_CONSTEXPR_P (t))
+- pp_cxx_ws_string (pp, "constexpr");
++ {
++ if (DECL_DECLARED_CONCEPT_P (t))
++ pp_cxx_ws_string (pp, "concept");
++ else
++ pp_cxx_ws_string (pp, "constexpr");
++ }
+ dump_type_prefix (pp, type, flags & ~TFF_UNQUALIFIED_NAME);
+ pp_maybe_space (pp);
+ }
+@@ -1334,16 +1339,19 @@
+ if (TEMPLATE_TYPE_PARAMETER_PACK (TREE_TYPE (t)))
+ pp_cxx_ws_string (pp, "...");
+ }
++
++ /* Only print the requirements if we're also printing
++ the template header. */
++ if (flag_concepts)
++ if (tree ci = get_constraints (t))
++ if (check_constraint_info (ci))
++ if (tree reqs = CI_TEMPLATE_REQS (ci))
++ {
++ pp_cxx_requires_clause (pp, reqs);
++ pp_cxx_whitespace (pp);
++ }
+ }
+
+- if (flag_concepts)
+- if (tree ci = get_constraints (t))
+- if (check_constraint_info (ci))
+- if (tree reqs = CI_TEMPLATE_REQS (ci))
+- {
+- pp_cxx_requires_clause (pp, reqs);
+- pp_cxx_whitespace (pp);
+- }
+
+ if (DECL_CLASS_TEMPLATE_P (t))
+ dump_type (pp, TREE_TYPE (t),
+@@ -1530,7 +1538,12 @@
+ pp_cxx_ws_string (pp, "virtual");
+
+ if (DECL_DECLARED_CONSTEXPR_P (t))
+- pp_cxx_ws_string (pp, "constexpr");
++ {
++ if (DECL_DECLARED_CONCEPT_P (t))
++ pp_cxx_ws_string (pp, "concept");
++ else
++ pp_cxx_ws_string (pp, "constexpr");
++ }
+ }
+
+ /* Print the return type? */
+@@ -2661,6 +2674,10 @@
+ break;
+
+ case EXPR_PACK_EXPANSION:
++ case UNARY_LEFT_FOLD_EXPR:
++ case UNARY_RIGHT_FOLD_EXPR:
++ case BINARY_LEFT_FOLD_EXPR:
++ case BINARY_RIGHT_FOLD_EXPR:
+ case TYPEID_EXPR:
+ case MEMBER_REF:
+ case DOTSTAR_EXPR:
+@@ -2733,6 +2750,7 @@
+ break;
+
+ case PRED_CONSTR:
++ case CHECK_CONSTR:
+ case EXPR_CONSTR:
+ case TYPE_CONSTR:
+ case ICONV_CONSTR:
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/cp/init.c gcc-6-20160721/gcc/cp/init.c
+--- gcc-6.1.0/gcc/cp/init.c 2016-04-14 17:35:23.000000000 +0000
++++ gcc-6-20160721/gcc/cp/init.c 2016-07-21 06:14:51.000000000 +0000
+@@ -2072,8 +2072,13 @@
+ && TREE_CODE (init) == TREE_LIST
+ && TREE_CHAIN (init) == NULL_TREE)
+ init = TREE_VALUE (init);
+- /* Instantiate a non-dependent initializer. */
+- init = instantiate_non_dependent_or_null (init);
++ /* Instantiate a non-dependent initializer for user variables. We
++ mustn't do this for the temporary for an array compound literal;
++ trying to instatiate the initializer will keep creating new
++ temporaries until we crash. Probably it's not useful to do it for
++ other artificial variables, either. */
++ if (!DECL_ARTIFICIAL (decl))
++ init = instantiate_non_dependent_or_null (init);
+ if (!init
+ || !TREE_TYPE (init)
+ || !TREE_CONSTANT (init)
+@@ -2375,7 +2380,8 @@
+
+ STRIP_NOPS (oper);
+
+- if (TREE_CODE (oper) == ARRAY_REF)
++ if (TREE_CODE (oper) == ARRAY_REF
++ && (addr_expr || TREE_CODE (TREE_TYPE (oper)) == ARRAY_TYPE))
+ {
+ /* Similar to the offset computed above, see if the array index
+ is a compile-time constant. If so, and unless the offset was
+@@ -2404,8 +2410,8 @@
+ bool compref = TREE_CODE (oper) == COMPONENT_REF;
+
+ /* Descend into a struct or union to find the member whose address
+- is being used as the agument. */
+- while (TREE_CODE (oper) == COMPONENT_REF)
++ is being used as the argument. */
++ if (TREE_CODE (oper) == COMPONENT_REF)
+ {
+ tree op0 = oper;
+ while (TREE_CODE (op0 = TREE_OPERAND (op0, 0)) == COMPONENT_REF);
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/cp/lambda.c gcc-6-20160721/gcc/cp/lambda.c
+--- gcc-6.1.0/gcc/cp/lambda.c 2016-02-25 15:23:47.000000000 +0000
++++ gcc-6-20160721/gcc/cp/lambda.c 2016-07-21 06:12:56.000000000 +0000
+@@ -871,8 +871,10 @@
+ bool nested = (cfun != NULL);
+ bool nested_def = decl_function_context (TYPE_MAIN_DECL (type));
+ tree callop = lambda_function (type);
++ tree lam = CLASSTYPE_LAMBDA_EXPR (type);
+
+- if (LAMBDA_EXPR_CAPTURE_LIST (CLASSTYPE_LAMBDA_EXPR (type)) != NULL_TREE)
++ if (LAMBDA_EXPR_CAPTURE_LIST (lam) != NULL_TREE
++ || LAMBDA_EXPR_DEFAULT_CAPTURE_MODE (lam) != CPLD_NONE)
+ return;
+
+ if (processing_template_decl)
+@@ -901,6 +903,8 @@
+ tree optype = TREE_TYPE (callop);
+ tree fn_result = TREE_TYPE (optype);
+
++ tree thisarg = build_nop (TREE_TYPE (DECL_ARGUMENTS (callop)),
++ null_pointer_node);
+ if (generic_lambda_p)
+ {
+ /* Prepare the dependent member call for the static member function
+@@ -908,7 +912,8 @@
+ return expression for a deduced return call op to allow for simple
+ implementation of the conversion operator. */
+
+- tree instance = build_nop (type, null_pointer_node);
++ tree instance = cp_build_indirect_ref (thisarg, RO_NULL,
++ tf_warning_or_error);
+ tree objfn = build_min (COMPONENT_REF, NULL_TREE,
+ instance, DECL_NAME (callop), NULL_TREE);
+ int nargs = list_length (DECL_ARGUMENTS (callop)) - 1;
+@@ -920,9 +925,7 @@
+ else
+ {
+ direct_argvec = make_tree_vector ();
+- direct_argvec->quick_push (build1 (NOP_EXPR,
+- TREE_TYPE (DECL_ARGUMENTS (callop)),
+- null_pointer_node));
++ direct_argvec->quick_push (thisarg);
+ }
+
+ /* Copy CALLOP's argument list (as per 'copy_list') as FN_ARGS in order to
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/cp/logic.cc gcc-6-20160721/gcc/cp/logic.cc
+--- gcc-6.1.0/gcc/cp/logic.cc 2016-04-22 11:09:22.000000000 +0000
++++ gcc-6-20160721/gcc/cp/logic.cc 2016-07-21 06:18:06.000000000 +0000
+@@ -23,6 +23,7 @@
+ #include "system.h"
+ #include "coretypes.h"
+ #include "tm.h"
++#include "timevar.h"
+ #include "hash-set.h"
+ #include "machmode.h"
+ #include "vec.h"
+@@ -50,19 +51,52 @@
+
+ // Helper algorithms
+
+-// Increment iter distance(first, last) times.
+-template<typename I1, typename I2, typename I3>
+- I1 next_by_distance (I1 iter, I2 first, I3 last)
+- {
+- for ( ; first != last; ++first, ++iter)
+- ;
+- return iter;
+- }
++template<typename I>
++inline I
++next (I iter)
++{
++ return ++iter;
++}
++
++template<typename I, typename P>
++inline bool
++any_p (I first, I last, P pred)
++{
++ while (first != last)
++ {
++ if (pred(*first))
++ return true;
++ ++first;
++ }
++ return false;
++}
++
++bool prove_implication (tree, tree);
+
+ /*---------------------------------------------------------------------------
+ Proof state
+ ---------------------------------------------------------------------------*/
+
++struct term_entry
++{
++ tree t;
++};
++
++/* Hashing function and equality for constraint entries. */
++
++struct term_hasher : ggc_ptr_hash<term_entry>
++{
++ static hashval_t hash (term_entry *e)
++ {
++ return iterative_hash_template_arg (e->t, 0);
++ }
++
++ static bool equal (term_entry *e1, term_entry *e2)
++ {
++ return cp_tree_equal (e1->t, e2->t);
++ }
++};
++
+ /* A term list is a list of atomic constraints. It is used
+ to maintain the lists of assumptions and conclusions in a
+ proof goal.
+@@ -70,109 +104,122 @@
+ Each term list maintains an iterator that refers to the current
+ term. This can be used by various tactics to support iteration
+ and stateful manipulation of the list. */
+-struct term_list : std::list<tree>
++struct term_list
+ {
+- term_list ();
+- term_list (const term_list &x);
+- term_list& operator= (const term_list &x);
+-
+- tree current_term () { return *current; }
+- const_tree current_term () const { return *current; }
++ typedef std::list<tree>::iterator iterator;
+
++ term_list ();
++ term_list (tree);
+
+- void insert (tree t);
+- tree erase ();
++ bool includes (tree);
++ iterator insert (iterator, tree);
++ iterator push_back (tree);
++ iterator erase (iterator);
++ iterator replace (iterator, tree);
++ iterator replace (iterator, tree, tree);
+
+- void start ();
+- void next ();
+- bool done() const;
++ iterator begin() { return seq.begin(); }
++ iterator end() { return seq.end(); }
+
+- iterator current;
++ std::list<tree> seq;
++ hash_table<term_hasher> tab;
+ };
+
+ inline
+ term_list::term_list ()
+- : std::list<tree> (), current (end ())
+-{ }
++ : seq(), tab (11)
++{
++}
+
+-inline
+-term_list::term_list (const term_list &x)
+- : std::list<tree> (x)
+- , current (next_by_distance (begin (), x.begin (), x.current))
+-{ }
++/* Initialize a term list with an initial term. */
+
+-inline term_list&
+-term_list::operator= (const term_list &x)
++inline
++term_list::term_list (tree t)
++ : seq (), tab (11)
+ {
+- std::list<tree>::operator=(x);
+- current = next_by_distance (begin (), x.begin (), x.current);
+- return *this;
+-}
+-
+-/* Try saving the term T into the list of terms. If
+- T is already in the list of terms, then no action is
+- performed. Otherwise, insert T before the current
+- position, making this term current.
+-
+- Note that not inserting terms is an optimization
+- that corresponds to the structural rule of
+- contraction.
+-
+- NOTE: With the contraction rule, this data structure
+- would be more efficiently represented as an ordered set
+- or hash set. */
+-void
+-term_list::insert (tree t)
++ push_back (t);
++}
++
++/* Returns true if T is the in the tree. */
++
++inline bool
++term_list::includes (tree t)
+ {
+- /* Search the current term list. If there is already
+- a matching term, do not add the new one. */
+- for (iterator i = begin(); i != end(); ++i)
+- if (cp_tree_equal (*i, t))
+- return;
++ term_entry ent = {t};
++ return tab.find (&ent);
++}
+
+- current = std::list<tree>::insert (current, t);
++/* Append a term to the list. */
++inline term_list::iterator
++term_list::push_back (tree t)
++{
++ return insert (end(), t);
+ }
+
+-/* Remove the current term from the list, repositioning to
+- the term following the removed term. Note that the new
+- position could be past the end of the list.
++/* Insert a new (unseen) term T into the list before the proposition
++ indicated by ITER. Returns the iterator to the newly inserted
++ element. */
+
+- The removed term is returned. */
+-inline tree
+-term_list::erase ()
++term_list::iterator
++term_list::insert (iterator iter, tree t)
+ {
+- tree t = *current;
+- current = std::list<tree>::erase (current);
+- return t;
++ gcc_assert (!includes (t));
++ iter = seq.insert (iter, t);
++ term_entry ent = {t};
++ term_entry** slot = tab.find_slot (&ent, INSERT);
++ term_entry* ptr = ggc_alloc<term_entry> ();
++ *ptr = ent;
++ *slot = ptr;
++ return iter;
+ }
+
+-/* Initialize the current term to the first in the list. */
+-inline void
+-term_list::start ()
++/* Remove an existing term from the list. Returns an iterator referring
++ to the element after the removed term. This may be end(). */
++
++term_list::iterator
++term_list::erase (iterator iter)
+ {
+- current = begin ();
++ gcc_assert (includes (*iter));
++ term_entry ent = {*iter};
++ tab.remove_elt (&ent);
++ iter = seq.erase (iter);
++ return iter;
+ }
+
+-/* Advance to the next term in the list. */
+-inline void
+-term_list::next ()
++/* Replace the given term with that specified. If the term has
++ been previously seen, do not insert the term. Returns the
++ first iterator past the current term. */
++
++term_list::iterator
++term_list::replace (iterator iter, tree t)
+ {
+- ++current;
++ iter = erase (iter);
++ if (!includes (t))
++ insert (iter, t);
++ return iter;
+ }
+
+-/* Returns true when the current position is past the end. */
+-inline bool
+-term_list::done () const
++
++/* Replace the term at the given position by the supplied T1
++ followed by t2. This is used in certain logical operators to
++ load a list of assumptions or conclusions. */
++
++term_list::iterator
++term_list::replace (iterator iter, tree t1, tree t2)
+ {
+- return current == end ();
++ iter = erase (iter);
++ if (!includes (t1))
++ insert (iter, t1);
++ if (!includes (t2))
++ insert (iter, t2);
++ return iter;
+ }
+
+-
+ /* A goal (or subgoal) models a sequent of the form
+ 'A |- C' where A and C are lists of assumptions and
+ conclusions written as propositions in the constraint
+- language (i.e., lists of trees).
+-*/
++ language (i.e., lists of trees). */
++
+ struct proof_goal
+ {
+ term_list assumptions;
+@@ -182,27 +229,27 @@
+ /* A proof state owns a list of goals and tracks the
+ current sub-goal. The class also provides facilities
+ for managing subgoals and constructing term lists. */
++
+ struct proof_state : std::list<proof_goal>
+ {
+ proof_state ();
+
+ iterator branch (iterator i);
++ iterator discharge (iterator i);
+ };
+
+-/* An alias for proof state iterators. */
+-typedef proof_state::iterator goal_iterator;
++/* Initialize the state with a single empty goal, and set that goal
++ as the current subgoal. */
+
+-/* Initialize the state with a single empty goal,
+- and set that goal as the current subgoal. */
+ inline
+ proof_state::proof_state ()
+ : std::list<proof_goal> (1)
+ { }
+
+
+-/* Branch the current goal by creating a new subgoal,
+- returning a reference to // the new object. This does
+- not update the current goal. */
++/* Branch the current goal by creating a new subgoal, returning a
++ reference to the new object. This does not update the current goal. */
++
+ inline proof_state::iterator
+ proof_state::branch (iterator i)
+ {
+@@ -211,278 +258,536 @@
+ return insert (++i, g);
+ }
+
++/* Discharge the current goal, setting it equal to the
++ next non-satisfied goal. */
++
++inline proof_state::iterator
++proof_state::discharge (iterator i)
++{
++ gcc_assert (i != end());
++ return erase (i);
++}
++
++
+ /*---------------------------------------------------------------------------
+- Logical rules
++ Debugging
+ ---------------------------------------------------------------------------*/
+
+-/*These functions modify the current state and goal by decomposing
+- logical expressions using the logical rules of sequent calculus for
+- first order logic.
++// void
++// debug (term_list& ts)
++// {
++// for (term_list::iterator i = ts.begin(); i != ts.end(); ++i)
++// verbatim (" # %E", *i);
++// }
++//
++// void
++// debug (proof_goal& g)
++// {
++// debug (g.assumptions);
++// verbatim (" |-");
++// debug (g.conclusions);
++// }
++
++/*---------------------------------------------------------------------------
++ Atomicity of constraints
++---------------------------------------------------------------------------*/
+
+- Note that in each decomposition rule, the term T has been erased
+- from term list before the specific rule is applied. */
++/* Returns true if T is not an atomic constraint. */
+
+-/* The left logical rule for conjunction adds both operands
+- to the current set of constraints. */
+-void
+-left_conjunction (proof_state &, goal_iterator i, tree t)
++bool
++non_atomic_constraint_p (tree t)
+ {
+- gcc_assert (TREE_CODE (t) == CONJ_CONSTR);
++ switch (TREE_CODE (t))
++ {
++ case PRED_CONSTR:
++ case EXPR_CONSTR:
++ case TYPE_CONSTR:
++ case ICONV_CONSTR:
++ case DEDUCT_CONSTR:
++ case EXCEPT_CONSTR:
++ return false;
++ case CHECK_CONSTR:
++ case PARM_CONSTR:
++ case CONJ_CONSTR:
++ case DISJ_CONSTR:
++ return true;
++ default:
++ gcc_unreachable ();
++ }
++}
++
++/* Returns true if any constraints in T are not atomic. */
+
+- /* Insert the operands into the current branch. Note that the
+- final order of insertion is left-to-right. */
+- term_list &l = i->assumptions;
+- l.insert (TREE_OPERAND (t, 1));
+- l.insert (TREE_OPERAND (t, 0));
++bool
++any_non_atomic_constraints_p (term_list& t)
++{
++ return any_p (t.begin(), t.end(), non_atomic_constraint_p);
+ }
+
+-/* The left logical rule for disjunction creates a new goal,
+- adding the first operand to the original set of
+- constraints and the second operand to the new set
+- of constraints. */
+-void
+-left_disjunction (proof_state &s, goal_iterator i, tree t)
++/*---------------------------------------------------------------------------
++ Proof validations
++---------------------------------------------------------------------------*/
++
++enum proof_result
+ {
+- gcc_assert (TREE_CODE (t) == DISJ_CONSTR);
++ invalid,
++ valid,
++ undecided
++};
++
++proof_result check_term (term_list&, tree);
++
+
+- /* Branch the current subgoal. */
+- goal_iterator j = s.branch (i);
+- term_list &l1 = i->assumptions;
+- term_list &l2 = j->assumptions;
++proof_result
++analyze_atom (term_list& ts, tree t)
++{
++ /* FIXME: Hook into special cases, if any. */
++ /*
++ term_list::iterator iter = ts.begin();
++ term_list::iterator end = ts.end();
++ while (iter != end)
++ {
++ ++iter;
++ }
++ */
+
+- /* Insert operands into the different branches. */
+- l1.insert (TREE_OPERAND (t, 0));
+- l2.insert (TREE_OPERAND (t, 1));
++ if (non_atomic_constraint_p (t))
++ return undecided;
++ if (any_non_atomic_constraints_p (ts))
++ return undecided;
++ return invalid;
+ }
+
+-/* The left logical rules for parameterized constraints
+- adds its operand to the current goal. The list of
+- parameters are effectively discarded. */
+-void
+-left_parameterized_constraint (proof_state &, goal_iterator i, tree t)
++/* Search for a pack expansion in the list of assumptions that would
++ make this expansion valid. */
++
++proof_result
++analyze_pack (term_list& ts, tree t)
+ {
+- gcc_assert (TREE_CODE (t) == PARM_CONSTR);
+- term_list &l = i->assumptions;
+- l.insert (PARM_CONSTR_OPERAND (t));
++ tree c1 = normalize_expression (PACK_EXPANSION_PATTERN (t));
++ term_list::iterator iter = ts.begin();
++ term_list::iterator end = ts.end();
++ while (iter != end)
++ {
++ if (TREE_CODE (*iter) == TREE_CODE (t))
++ {
++ tree c2 = normalize_expression (PACK_EXPANSION_PATTERN (*iter));
++ if (prove_implication (c2, c1))
++ return valid;
++ else
++ return invalid;
++ }
++ ++iter;
++ }
++ return invalid;
+ }
+
+-/*---------------------------------------------------------------------------
+- Decomposition
+----------------------------------------------------------------------------*/
++/* Search for concept checks in TS that we know subsume T. */
+
+-/* The following algorithms decompose expressions into sets of
+- atomic propositions. In terms of the sequent calculus, these
+- functions exercise the logical rules only.
+-
+- This is equivalent, for the purpose of determining subsumption,
+- to rewriting a constraint in disjunctive normal form. It also
+- allows the resulting assumptions to be used as declarations
+- for the purpose of separate checking. */
++proof_result
++search_known_subsumptions (term_list& ts, tree t)
++{
++ for (term_list::iterator i = ts.begin(); i != ts.end(); ++i)
++ if (TREE_CODE (*i) == CHECK_CONSTR)
++ {
++ if (bool* b = lookup_subsumption_result (*i, t))
++ return *b ? valid : invalid;
++ }
++ return undecided;
++}
+
+-/* Apply the left logical rules to the proof state. */
+-void
+-decompose_left_term (proof_state &s, goal_iterator i)
++/* Determine if the terms in TS provide sufficient support for proving
++ the proposition T. If any term in TS is a concept check that is known
++ to subsume T, then the proof is valid. Otherwise, we have to expand T
++ and continue searching for support. */
++
++proof_result
++analyze_check (term_list& ts, tree t)
++{
++ proof_result r = search_known_subsumptions (ts, t);
++ if (r != undecided)
++ return r;
++
++ tree tmpl = CHECK_CONSTR_CONCEPT (t);
++ tree args = CHECK_CONSTR_ARGS (t);
++ tree c = expand_concept (tmpl, args);
++ return check_term (ts, c);
++}
++
++/* Recursively check constraints of the parameterized constraint. */
++
++proof_result
++analyze_parameterized (term_list& ts, tree t)
++{
++ return check_term (ts, PARM_CONSTR_OPERAND (t));
++}
++
++proof_result
++analyze_conjunction (term_list& ts, tree t)
++{
++ proof_result r = check_term (ts, TREE_OPERAND (t, 0));
++ if (r == invalid || r == undecided)
++ return r;
++ return check_term (ts, TREE_OPERAND (t, 1));
++}
++
++proof_result
++analyze_disjunction (term_list& ts, tree t)
++{
++ proof_result r = check_term (ts, TREE_OPERAND (t, 0));
++ if (r == valid)
++ return r;
++ return check_term (ts, TREE_OPERAND (t, 1));
++}
++
++proof_result
++analyze_term (term_list& ts, tree t)
+ {
+- term_list &l = i->assumptions;
+- tree t = l.current_term ();
+ switch (TREE_CODE (t))
+ {
++ case CHECK_CONSTR:
++ return analyze_check (ts, t);
++
++ case PARM_CONSTR:
++ return analyze_parameterized (ts, t);
++
+ case CONJ_CONSTR:
+- left_conjunction (s, i, l.erase ());
+- break;
++ return analyze_conjunction (ts, t);
+ case DISJ_CONSTR:
+- left_disjunction (s, i, l.erase ());
+- break;
+- case PARM_CONSTR:
+- left_parameterized_constraint (s, i, l.erase ());
+- break;
++ return analyze_disjunction (ts, t);
++
++ case PRED_CONSTR:
++ case EXPR_CONSTR:
++ case TYPE_CONSTR:
++ case ICONV_CONSTR:
++ case DEDUCT_CONSTR:
++ case EXCEPT_CONSTR:
++ return analyze_atom (ts, t);
++
++ case EXPR_PACK_EXPANSION:
++ return analyze_pack (ts, t);
++
++ case ERROR_MARK:
++ /* Encountering an error anywhere in a constraint invalidates
++ the proof, since the constraint is ill-formed. */
++ return invalid;
+ default:
+- l.next ();
+- break;
++ gcc_unreachable ();
+ }
+ }
+
+-/* Apply the left logical rules of the sequent calculus
+- until the current goal is fully decomposed into atomic
+- constraints. */
++/* Check if a single term can be proven from a set of assumptions.
++ If the proof is not valid, then it is incomplete when either
++ the given term is non-atomic or any term in the list of assumptions
++ is not-atomic. */
++
++proof_result
++check_term (term_list& ts, tree t)
++{
++ /* Try the easy way; search for an equivalent term. */
++ if (ts.includes (t))
++ return valid;
++
++ /* The hard way; actually consider what the term means. */
++ return analyze_term (ts, t);
++}
++
++/* Check to see if any term is proven by the assumptions in the
++ proof goal. The proof is valid if the proof of any term is valid.
++ If validity cannot be determined, but any particular
++ check was undecided, then this goal is undecided. */
++
++proof_result
++check_goal (proof_goal& g)
++{
++ term_list::iterator iter = g.conclusions.begin ();
++ term_list::iterator end = g.conclusions.end ();
++ bool incomplete = false;
++ while (iter != end)
++ {
++ proof_result r = check_term (g.assumptions, *iter);
++ if (r == valid)
++ return r;
++ if (r == undecided)
++ incomplete = true;
++ ++iter;
++ }
++
++ /* Was the proof complete? */
++ if (incomplete)
++ return undecided;
++ else
++ return invalid;
++}
++
++/* Check if the the proof is valid. This is the case when all
++ goals can be discharged. If any goal is invalid, then the
++ entire proof is invalid. Otherwise, the proof is undecided. */
++
++proof_result
++check_proof (proof_state& p)
++{
++ proof_state::iterator iter = p.begin();
++ proof_state::iterator end = p.end();
++ while (iter != end)
++ {
++ proof_result r = check_goal (*iter);
++ if (r == invalid)
++ return r;
++ if (r == valid)
++ iter = p.discharge (iter);
++ else
++ ++iter;
++ }
++
++ /* If all goals are discharged, then the proof is valid. */
++ if (p.empty())
++ return valid;
++ else
++ return undecided;
++}
++
++/*---------------------------------------------------------------------------
++ Left logical rules
++---------------------------------------------------------------------------*/
++
++term_list::iterator
++load_check_assumption (term_list& ts, term_list::iterator i)
++{
++ tree decl = CHECK_CONSTR_CONCEPT (*i);
++ tree tmpl = DECL_TI_TEMPLATE (decl);
++ tree args = CHECK_CONSTR_ARGS (*i);
++ return ts.replace(i, expand_concept (tmpl, args));
++}
++
++term_list::iterator
++load_parameterized_assumption (term_list& ts, term_list::iterator i)
++{
++ return ts.replace(i, PARM_CONSTR_OPERAND(*i));
++}
++
++term_list::iterator
++load_conjunction_assumption (term_list& ts, term_list::iterator i)
++{
++ tree t1 = TREE_OPERAND (*i, 0);
++ tree t2 = TREE_OPERAND (*i, 1);
++ return ts.replace(i, t1, t2);
++}
++
++/* Examine the terms in the list, and apply left-logical rules to move
++ terms into the set of assumptions. */
++
+ void
+-decompose_left_goal (proof_state &s, goal_iterator i)
++load_assumptions (proof_goal& g)
+ {
+- term_list& l = i->assumptions;
+- l.start ();
+- while (!l.done ())
+- decompose_left_term (s, i);
++ term_list::iterator iter = g.assumptions.begin();
++ term_list::iterator end = g.assumptions.end();
++ while (iter != end)
++ {
++ switch (TREE_CODE (*iter))
++ {
++ case CHECK_CONSTR:
++ iter = load_check_assumption (g.assumptions, iter);
++ break;
++ case PARM_CONSTR:
++ iter = load_parameterized_assumption (g.assumptions, iter);
++ break;
++ case CONJ_CONSTR:
++ iter = load_conjunction_assumption (g.assumptions, iter);
++ break;
++ default:
++ ++iter;
++ break;
++ }
++ }
+ }
+
+-/* Apply the left logical rules of the sequent calculus
+- until the antecedents are fully decomposed into atomic
+- constraints. */
++/* In each subgoal, load constraints into the assumption set. */
++
+ void
+-decompose_left (proof_state& s)
++load_assumptions(proof_state& p)
+ {
+- goal_iterator iter = s.begin ();
+- goal_iterator end = s.end ();
+- for ( ; iter != end; ++iter)
+- decompose_left_goal (s, iter);
+-}
+-
+-/* Returns a vector of terms from the term list L. */
+-tree
+-extract_terms (term_list& l)
+-{
+- tree result = make_tree_vec (l.size());
+- term_list::iterator iter = l.begin();
+- term_list::iterator end = l.end();
+- for (int n = 0; iter != end; ++iter, ++n)
+- TREE_VEC_ELT (result, n) = *iter;
+- return result;
+-}
+-
+-/* Extract the assumptions from the proof state S
+- as a vector of vectors of atomic constraints. */
+-inline tree
+-extract_assumptions (proof_state& s)
+-{
+- tree result = make_tree_vec (s.size ());
+- goal_iterator iter = s.begin ();
+- goal_iterator end = s.end ();
+- for (int n = 0; iter != end; ++iter, ++n)
+- TREE_VEC_ELT (result, n) = extract_terms (iter->assumptions);
+- return result;
+-}
+-
+-} // namespace
+-
+-/* Decompose the required expression T into a constraint set: a
+- vector of vectors containing only atomic propositions. If T is
+- invalid, return an error. */
+-tree
+-decompose_assumptions (tree t)
+-{
+- if (!t || t == error_mark_node)
+- return t;
+-
+- /* Create a proof state, and insert T as the sole assumption. */
+- proof_state s;
+- term_list &l = s.begin ()->assumptions;
+- l.insert (t);
+-
+- /* Decompose the expression into a constraint set, and then
+- extract the terms for the AST. */
+- decompose_left (s);
+- return extract_assumptions (s);
++ proof_state::iterator iter = p.begin();
++ while (iter != p.end())
++ {
++ load_assumptions (*iter);
++ ++iter;
++ }
+ }
+
++void
++explode_disjunction (proof_state& p, proof_state::iterator gi, term_list::iterator ti1)
++{
++ tree t1 = TREE_OPERAND (*ti1, 0);
++ tree t2 = TREE_OPERAND (*ti1, 1);
+
+-/*---------------------------------------------------------------------------
+- Subsumption Rules
+----------------------------------------------------------------------------*/
++ /* Erase the current term from the goal. */
++ proof_goal& g1 = *gi;
++ proof_goal& g2 = *p.branch (gi);
+
+-namespace {
++ /* Get an iterator to the equivalent position in th enew goal. */
++ int n = std::distance (g1.assumptions.begin (), ti1);
++ term_list::iterator ti2 = g2.assumptions.begin ();
++ std::advance (ti2, n);
+
+-bool subsumes_constraint (tree, tree);
+-bool subsumes_conjunction (tree, tree);
+-bool subsumes_disjunction (tree, tree);
+-bool subsumes_parameterized_constraint (tree, tree);
+-bool subsumes_atomic_constraint (tree, tree);
+-
+-/* Returns true if the assumption A matches the conclusion C. This
+- is generally the case when A and C have the same syntax.
+-
+- NOTE: There will be specialized matching rules to accommodate
+- type equivalence, conversion, inheritance, etc. But this is not
+- in the current concepts draft. */
+-inline bool
+-match_terms (tree a, tree c)
+-{
+- return cp_tree_equal (a, c);
++ /* Replace the disjunction in both branches. */
++ g1.assumptions.replace (ti1, t1);
++ g2.assumptions.replace (ti2, t2);
+ }
+
+-/* Returns true if the list of assumptions AS subsumes the atomic
+- proposition C. This is the case when we can find a proposition
+- in AS that entails the conclusion C. */
++
++/* Search the assumptions of the goal for the first disjunction. */
++
+ bool
+-subsumes_atomic_constraint (tree as, tree c)
++explode_goal (proof_state& p, proof_state::iterator gi)
+ {
+- for (int i = 0; i < TREE_VEC_LENGTH (as); ++i)
+- if (match_terms (TREE_VEC_ELT (as, i), c))
+- return true;
++ term_list& ts = gi->assumptions;
++ term_list::iterator ti = ts.begin();
++ term_list::iterator end = ts.end();
++ while (ti != end)
++ {
++ if (TREE_CODE (*ti) == DISJ_CONSTR)
++ {
++ explode_disjunction (p, gi, ti);
++ return true;
++ }
++ else ++ti;
++ }
+ return false;
+ }
+
+-/* Returns true when both operands of C are subsumed by the
+- assumptions AS. */
+-inline bool
+-subsumes_conjunction (tree as, tree c)
++/* Search for the first goal with a disjunction, and then branch
++ creating a clone of that subgoal. */
++
++void
++explode_assumptions (proof_state& p)
+ {
+- tree l = TREE_OPERAND (c, 0);
+- tree r = TREE_OPERAND (c, 1);
+- return subsumes_constraint (as, l) && subsumes_constraint (as, r);
++ proof_state::iterator iter = p.begin();
++ proof_state::iterator end = p.end();
++ while (iter != end)
++ {
++ if (explode_goal (p, iter))
++ return;
++ ++iter;
++ }
+ }
+
+-/* Returns true when either operand of C is subsumed by the
+- assumptions AS. */
+-inline bool
+-subsumes_disjunction (tree as, tree c)
++
++/*---------------------------------------------------------------------------
++ Right logical rules
++---------------------------------------------------------------------------*/
++
++term_list::iterator
++load_disjunction_conclusion (term_list& g, term_list::iterator i)
+ {
+- tree l = TREE_OPERAND (c, 0);
+- tree r = TREE_OPERAND (c, 1);
+- return subsumes_constraint (as, l) || subsumes_constraint (as, r);
++ tree t1 = TREE_OPERAND (*i, 0);
++ tree t2 = TREE_OPERAND (*i, 1);
++ return g.replace(i, t1, t2);
+ }
+
+-/* Returns true when the operand of C is subsumed by the
+- assumptions in AS. The parameters are not considered in
+- the subsumption rules. */
+-bool
+-subsumes_parameterized_constraint (tree as, tree c)
++/* Apply logical rules to the right hand side. This will load the
++ conclusion set with all tpp-level disjunctions. */
++
++void
++load_conclusions (proof_goal& g)
+ {
+- tree t = PARM_CONSTR_OPERAND (c);
+- return subsumes_constraint (as, t);
++ term_list::iterator iter = g.conclusions.begin();
++ term_list::iterator end = g.conclusions.end();
++ while (iter != end)
++ {
++ if (TREE_CODE (*iter) == DISJ_CONSTR)
++ iter = load_disjunction_conclusion (g.conclusions, iter);
++ else
++ ++iter;
++ }
++}
++
++void
++load_conclusions (proof_state& p)
++{
++ proof_state::iterator iter = p.begin();
++ while (iter != p.end())
++ {
++ load_conclusions (*iter);
++ ++iter;
++ }
+ }
+
+
+-/* Returns true when the list of assumptions AS subsumes the
+- concluded proposition C. This is a simple recursive descent
+- on C, matching against propositions in the assumption list AS. */
++/*---------------------------------------------------------------------------
++ High-level proof tactics
++---------------------------------------------------------------------------*/
++
++/* Given two constraints A and C, try to derive a proof that
++ A implies C. */
++
+ bool
+-subsumes_constraint (tree as, tree c)
++prove_implication (tree a, tree c)
+ {
+- switch (TREE_CODE (c))
++ /* Quick accept. */
++ if (cp_tree_equal (a, c))
++ return true;
++
++ /* Build the initial proof state. */
++ proof_state proof;
++ proof_goal& goal = proof.front();
++ goal.assumptions.push_back(a);
++ goal.conclusions.push_back(c);
++
++ /* Perform an initial right-expansion in the off-chance that the right
++ hand side contains disjunctions. */
++ load_conclusions (proof);
++
++ int step_max = 1 << 10;
++ int step_count = 0; /* FIXME: We shouldn't have this. */
++ std::size_t branch_limit = 1024; /* FIXME: This needs to be configurable. */
++ while (step_count < step_max && proof.size() < branch_limit)
+ {
+- case CONJ_CONSTR:
+- return subsumes_conjunction (as, c);
+- case DISJ_CONSTR:
+- return subsumes_disjunction (as, c);
+- case PARM_CONSTR:
+- return subsumes_parameterized_constraint (as, c);
+- default:
+- return subsumes_atomic_constraint (as, c);
++ /* Determine if we can prove that the assumptions entail the
++ conclusions. If so, we're done. */
++ load_assumptions (proof);
++
++ /* Can we solve the proof based on this? */
++ proof_result r = check_proof (proof);
++ if (r != undecided)
++ return r == valid;
++
++ /* If not, then we need to dig into disjunctions. */
++ explode_assumptions (proof);
++
++ ++step_count;
+ }
++
++ if (step_count == step_max)
++ error ("subsumption failed to resolve");
++
++ if (proof.size() == branch_limit)
++ error ("exceeded maximum number of branches");
++
++ return false;
+ }
+
+-/* Returns true if the LEFT constraints subsume the RIGHT constraints.
+- This is done by checking that the RIGHT requirements follow from
+- each of the LEFT subgoals. */
++/* Returns true if the LEFT constraint subsume the RIGHT constraints.
++ This is done by deriving a proof of the conclusions on the RIGHT
++ from the assumptions on the LEFT assumptions. */
++
+ bool
+ subsumes_constraints_nonnull (tree left, tree right)
+ {
+ gcc_assert (check_constraint_info (left));
+ gcc_assert (check_constraint_info (right));
+
+- /* Check that the required expression in RIGHT is subsumed by each
+- subgoal in the assumptions of LEFT. */
+- tree as = CI_ASSUMPTIONS (left);
+- tree c = CI_NORMALIZED_CONSTRAINTS (right);
+- for (int i = 0; i < TREE_VEC_LENGTH (as); ++i)
+- if (!subsumes_constraint (TREE_VEC_ELT (as, i), c))
+- return false;
+- return true;
++ auto_timevar time (TV_CONSTRAINT_SUB);
++ tree a = CI_ASSOCIATED_CONSTRAINTS (left);
++ tree c = CI_ASSOCIATED_CONSTRAINTS (right);
++ return prove_implication (a, c);
+ }
+
+ } /* namespace */
+
+ /* Returns true if the LEFT constraints subsume the RIGHT
+- constraints. */
++ constraints. */
++
+ bool
+ subsumes (tree left, tree right)
+ {
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/cp/mangle.c gcc-6-20160721/gcc/cp/mangle.c
+--- gcc-6.1.0/gcc/cp/mangle.c 2016-04-11 13:38:34.000000000 +0000
++++ gcc-6-20160721/gcc/cp/mangle.c 2016-07-21 06:15:23.000000000 +0000
+@@ -2774,6 +2774,39 @@
+ write_type (TREE_TYPE (TREE_OPERAND (expr, 0)));
+ }
+ else if (TREE_CODE (expr) == SIZEOF_EXPR
++ && ARGUMENT_PACK_P (TREE_OPERAND (expr, 0)))
++ {
++ tree args = ARGUMENT_PACK_ARGS (TREE_OPERAND (expr, 0));
++ int length = TREE_VEC_LENGTH (args);
++ if (abi_warn_or_compat_version_crosses (10))
++ G.need_abi_warning = true;
++ if (abi_version_at_least (10))
++ {
++ /* sP <template-arg>* E # sizeof...(T), size of a captured
++ template parameter pack from an alias template */
++ write_string ("sP");
++ for (int i = 0; i < length; ++i)
++ write_template_arg (TREE_VEC_ELT (args, i));
++ write_char ('E');
++ }
++ else
++ {
++ /* In GCC 5 we represented this sizeof wrong, with the effect
++ that we mangled it as the last element of the pack. */
++ tree arg = TREE_VEC_ELT (args, length-1);
++ if (TYPE_P (arg))
++ {
++ write_string ("st");
++ write_type (arg);
++ }
++ else
++ {
++ write_string ("sz");
++ write_expression (arg);
++ }
++ }
++ }
++ else if (TREE_CODE (expr) == SIZEOF_EXPR
+ && TYPE_P (TREE_OPERAND (expr, 0)))
+ {
+ write_string ("st");
+@@ -3094,6 +3127,29 @@
+ "cannot be mangled");
+ continue;
+ }
++ else if (FOLD_EXPR_P (expr))
++ {
++ /* The first 'operand' of a fold-expression is the operator
++ that it folds over. */
++ if (i == 0)
++ {
++ int fcode = TREE_INT_CST_LOW (operand);
++ write_string (operator_name_info[fcode].mangled_name);
++ continue;
++ }
++ else if (code == BINARY_LEFT_FOLD_EXPR)
++ {
++ /* The order of operands of the binary left and right
++ folds is the same, but we want to mangle them in
++ lexical order, i.e. non-pack first. */
++ if (i == 1)
++ operand = FOLD_EXPR_INIT (expr);
++ else
++ operand = FOLD_EXPR_PACK (expr);
++ }
++ if (PACK_EXPANSION_P (operand))
++ operand = PACK_EXPANSION_PATTERN (operand);
++ }
+ write_expression (operand);
+ }
+ }
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/cp/method.c gcc-6-20160721/gcc/cp/method.c
+--- gcc-6.1.0/gcc/cp/method.c 2016-03-04 01:48:33.000000000 +0000
++++ gcc-6-20160721/gcc/cp/method.c 2016-06-02 11:30:44.000000000 +0000
+@@ -484,6 +484,8 @@
+ tree type = TREE_TYPE (parm);
+ if (DECL_PACK_P (parm))
+ type = PACK_EXPANSION_PATTERN (type);
++ if (TREE_CODE (type) != REFERENCE_TYPE)
++ type = cp_build_reference_type (type, /*rval=*/true);
+ exp = build_static_cast (type, exp, tf_warning_or_error);
+ if (DECL_PACK_P (parm))
+ exp = make_pack_expansion (exp);
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/cp/name-lookup.c gcc-6-20160721/gcc/cp/name-lookup.c
+--- gcc-6.1.0/gcc/cp/name-lookup.c 2016-04-22 15:38:57.000000000 +0000
++++ gcc-6-20160721/gcc/cp/name-lookup.c 2016-05-31 21:36:28.000000000 +0000
+@@ -4518,8 +4518,10 @@
+ }
+
+ /* Look up NAME (an IDENTIFIER_NODE) in SCOPE (either a NAMESPACE_DECL
+- or a class TYPE). If IS_TYPE_P is TRUE, then ignore non-type
+- bindings.
++ or a class TYPE).
++
++ If PREFER_TYPE is > 0, we only return TYPE_DECLs or namespaces.
++ If PREFER_TYPE is > 1, we only return TYPE_DECLs.
+
+ Returns a DECL (or OVERLOAD, or BASELINK) representing the
+ declaration found. If no suitable declaration can be found,
+@@ -4527,28 +4529,25 @@
+ neither a class-type nor a namespace a diagnostic is issued. */
+
+ tree
+-lookup_qualified_name (tree scope, tree name, bool is_type_p, bool complain,
++lookup_qualified_name (tree scope, tree name, int prefer_type, bool complain,
+ bool find_hidden)
+ {
+- int flags = 0;
+ tree t = NULL_TREE;
+
+- if (find_hidden)
+- flags |= LOOKUP_HIDDEN;
+-
+ if (TREE_CODE (scope) == NAMESPACE_DECL)
+ {
+ struct scope_binding binding = EMPTY_SCOPE_BINDING;
+
+- if (is_type_p)
+- flags |= LOOKUP_PREFER_TYPES;
++ int flags = lookup_flags (prefer_type, /*namespaces_only*/false);
++ if (find_hidden)
++ flags |= LOOKUP_HIDDEN;
+ if (qualified_lookup_using_namespace (name, scope, &binding, flags))
+ t = binding.value;
+ }
+ else if (cxx_dialect != cxx98 && TREE_CODE (scope) == ENUMERAL_TYPE)
+ t = lookup_enumerator (scope, name);
+ else if (is_class_type (scope, complain))
+- t = lookup_member (scope, name, 2, is_type_p, tf_warning_or_error);
++ t = lookup_member (scope, name, 2, prefer_type, tf_warning_or_error);
+
+ if (!t)
+ return error_mark_node;
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/cp/name-lookup.h gcc-6-20160721/gcc/cp/name-lookup.h
+--- gcc-6.1.0/gcc/cp/name-lookup.h 2016-02-16 19:01:49.000000000 +0000
++++ gcc-6-20160721/gcc/cp/name-lookup.h 2016-05-31 21:36:28.000000000 +0000
+@@ -327,7 +327,7 @@
+ extern void set_namespace_binding (tree, tree, tree);
+ extern bool hidden_name_p (tree);
+ extern tree remove_hidden_names (tree);
+-extern tree lookup_qualified_name (tree, tree, bool, bool, /*hidden*/bool = false);
++extern tree lookup_qualified_name (tree, tree, int, bool, /*hidden*/bool = false);
+ extern tree lookup_name_nonclass (tree);
+ extern tree lookup_name_innermost_nonclass_level (tree);
+ extern bool is_local_extern (tree);
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/cp/operators.def gcc-6-20160721/gcc/cp/operators.def
+--- gcc-6.1.0/gcc/cp/operators.def 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/gcc/cp/operators.def 2016-07-21 06:15:23.000000000 +0000
+@@ -155,3 +155,7 @@
+
+ /* Variadic templates extension. */
+ DEF_SIMPLE_OPERATOR ("...", EXPR_PACK_EXPANSION, "sp", 1)
++DEF_SIMPLE_OPERATOR ("... +", UNARY_LEFT_FOLD_EXPR, "fl", 2)
++DEF_SIMPLE_OPERATOR ("+ ...", UNARY_RIGHT_FOLD_EXPR, "fr", 2)
++DEF_SIMPLE_OPERATOR ("+ ... +", BINARY_LEFT_FOLD_EXPR, "fL", 3)
++DEF_SIMPLE_OPERATOR ("+ ... +", BINARY_RIGHT_FOLD_EXPR, "fR", 3)
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/cp/parser.c gcc-6-20160721/gcc/cp/parser.c
+--- gcc-6.1.0/gcc/cp/parser.c 2016-04-15 12:24:18.000000000 +0000
++++ gcc-6-20160721/gcc/cp/parser.c 2016-07-21 06:18:06.000000000 +0000
+@@ -9747,10 +9747,12 @@
+
+ ok &= cp_parser_lambda_declarator_opt (parser, lambda_expr);
+
++ if (ok && cp_parser_error_occurred (parser))
++ ok = false;
++
+ if (ok)
+ {
+- if (!cp_parser_error_occurred (parser)
+- && cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE)
++ if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE)
+ && cp_parser_start_tentative_firewall (parser))
+ start = token;
+ cp_parser_lambda_body (parser, lambda_expr);
+@@ -11184,11 +11186,17 @@
+ bool ivdep)
+ {
+ tree stmt, range_expr;
++ cxx_binding *binding = NULL;
++ tree name = NULL_TREE;
+
+ /* Get the range declaration momentarily out of the way so that
+ the range expression doesn't clash with it. */
+ if (range_decl != error_mark_node)
+- pop_binding (DECL_NAME (range_decl), range_decl);
++ {
++ name = DECL_NAME (range_decl);
++ binding = IDENTIFIER_BINDING (name);
++ IDENTIFIER_BINDING (name) = binding->previous;
++ }
+
+ if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
+ {
+@@ -11200,7 +11208,10 @@
+
+ /* Put the range declaration back into scope. */
+ if (range_decl != error_mark_node)
+- push_binding (DECL_NAME (range_decl), range_decl, current_binding_level);
++ {
++ binding->previous = IDENTIFIER_BINDING (name);
++ IDENTIFIER_BINDING (name) = binding;
++ }
+
+ /* If in template, STMT is converted to a normal for-statement
+ at instantiation. If not, it is done just ahead. */
+@@ -12434,8 +12445,15 @@
+ if (token->type == CPP_COMMA)
+ /* will be consumed next time around */;
+ /* If it's a `;', we are done. */
+- else if (token->type == CPP_SEMICOLON || maybe_range_for_decl)
++ else if (token->type == CPP_SEMICOLON)
+ break;
++ else if (maybe_range_for_decl)
++ {
++ if (declares_class_or_enum && token->type == CPP_COLON)
++ pedwarn (decl_specifiers.locations[ds_type_spec], 0,
++ "types may not be defined in a for-range-declaration");
++ break;
++ }
+ /* Anything else is an error. */
+ else
+ {
+@@ -13793,8 +13811,9 @@
+ /* Consume the `[' token. */
+ cp_lexer_consume_token (parser->lexer);
+ /* Look for the `]' token. */
+- end_loc = cp_parser_require (parser, CPP_CLOSE_SQUARE,
+- RT_CLOSE_SQUARE)->location;
++ if (cp_token *close_token
++ = cp_parser_require (parser, CPP_CLOSE_SQUARE, RT_CLOSE_SQUARE))
++ end_loc = close_token->location;
+ id = ansi_opname (op == NEW_EXPR
+ ? VEC_NEW_EXPR : VEC_DELETE_EXPR);
+ }
+@@ -14686,10 +14705,13 @@
+ cp_parser_require (parser, CPP_GREATER, RT_GREATER);
+
+ // If template requirements are present, parse them.
+- tree reqs = get_shorthand_constraints (current_template_parms);
+- if (tree r = cp_parser_requires_clause_opt (parser))
+- reqs = conjoin_constraints (reqs, make_predicate_constraint (r));
+- TEMPLATE_PARMS_CONSTRAINTS (current_template_parms) = reqs;
++ if (flag_concepts)
++ {
++ tree reqs = get_shorthand_constraints (current_template_parms);
++ if (tree r = cp_parser_requires_clause_opt (parser))
++ reqs = conjoin_constraints (reqs, normalize_expression (r));
++ TEMPLATE_PARMS_CONSTRAINTS (current_template_parms) = reqs;
++ }
+
+ /* Look for the `class' or 'typename' keywords. */
+ cp_parser_type_parameter_key (parser);
+@@ -21178,7 +21200,7 @@
+ resolution operator, object, function, and enumerator
+ names are ignored. */
+ if (cp_lexer_next_token_is (parser->lexer, CPP_SCOPE))
+- tag_type = typename_type;
++ tag_type = scope_type;
+ /* Look up the name. */
+ decl = cp_parser_lookup_name (parser, identifier,
+ tag_type,
+@@ -24569,6 +24591,20 @@
+
+ /* Support Functions */
+
++/* Return the appropriate prefer_type argument for lookup_name_real based on
++ tag_type. */
++
++static inline int
++prefer_type_arg (tag_types tag_type)
++{
++ switch (tag_type)
++ {
++ case none_type: return 0; // No preference.
++ case scope_type: return 1; // Type or namespace.
++ default: return 2; // Type only.
++ }
++}
++
+ /* Looks up NAME in the current scope, as given by PARSER->SCOPE.
+ NAME should have one of the representations used for an
+ id-expression. If NAME is the ERROR_MARK_NODE, the ERROR_MARK_NODE
+@@ -24705,7 +24741,7 @@
+ errors may be issued. Even if we rollback the current
+ tentative parse, those errors are valid. */
+ decl = lookup_qualified_name (parser->scope, name,
+- tag_type != none_type,
++ prefer_type_arg (tag_type),
+ /*complain=*/true);
+
+ /* 3.4.3.1: In a lookup in which the constructor is an acceptable
+@@ -24726,7 +24762,7 @@
+ && DECL_SELF_REFERENCE_P (decl)
+ && same_type_p (DECL_CONTEXT (decl), parser->scope))
+ decl = lookup_qualified_name (parser->scope, ctor_identifier,
+- tag_type != none_type,
++ prefer_type_arg (tag_type),
+ /*complain=*/true);
+
+ /* If we have a single function from a using decl, pull it out. */
+@@ -24782,7 +24818,7 @@
+ decl = lookup_member (object_type,
+ name,
+ /*protect=*/0,
+- tag_type != none_type,
++ prefer_type_arg (tag_type),
+ tf_warning_or_error);
+ else
+ decl = NULL_TREE;
+@@ -24790,7 +24826,7 @@
+ if (!decl)
+ {
+ /* Look it up in the enclosing context. */
+- decl = lookup_name_real (name, tag_type != none_type,
++ decl = lookup_name_real (name, prefer_type_arg (tag_type),
+ /*nonclass=*/0,
+ /*block_p=*/true, is_namespace, 0);
+ /* DR 141 says when looking for a template-name after -> or ., only
+@@ -24815,7 +24851,7 @@
+ }
+ else
+ {
+- decl = lookup_name_real (name, tag_type != none_type,
++ decl = lookup_name_real (name, prefer_type_arg (tag_type),
+ /*nonclass=*/0,
+ /*block_p=*/true, is_namespace, 0);
+ parser->qualifying_scope = NULL_TREE;
+@@ -25667,10 +25703,13 @@
+ cp_parser_skip_to_end_of_template_parameter_list (parser);
+
+ /* Manage template requirements */
+- tree reqs = get_shorthand_constraints (current_template_parms);
+- if (tree r = cp_parser_requires_clause_opt (parser))
+- reqs = conjoin_constraints (reqs, make_predicate_constraint (r));
+- TEMPLATE_PARMS_CONSTRAINTS (current_template_parms) = reqs;
++ if (flag_concepts)
++ {
++ tree reqs = get_shorthand_constraints (current_template_parms);
++ if (tree r = cp_parser_requires_clause_opt (parser))
++ reqs = conjoin_constraints (reqs, normalize_expression (r));
++ TEMPLATE_PARMS_CONSTRAINTS (current_template_parms) = reqs;
++ }
+
+ cp_parser_template_declaration_after_parameters (parser, parameter_list,
+ member_p);
+@@ -25978,6 +26017,7 @@
+ cp_token *first;
+ cp_token *last;
+ tree fn;
++ bool function_try_block = false;
+
+ /* Create the FUNCTION_DECL. */
+ fn = grokmethod (decl_specifiers, declarator, attributes);
+@@ -25999,9 +26039,43 @@
+ /* Save away the tokens that make up the body of the
+ function. */
+ first = parser->lexer->next_token;
++
++ if (cp_lexer_next_token_is_keyword (parser->lexer, RID_TRANSACTION_RELAXED))
++ cp_lexer_consume_token (parser->lexer);
++ else if (cp_lexer_next_token_is_keyword (parser->lexer,
++ RID_TRANSACTION_ATOMIC))
++ {
++ cp_lexer_consume_token (parser->lexer);
++ /* Match cp_parser_txn_attribute_opt [[ identifier ]]. */
++ if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_SQUARE)
++ && cp_lexer_nth_token_is (parser->lexer, 2, CPP_OPEN_SQUARE)
++ && (cp_lexer_nth_token_is (parser->lexer, 3, CPP_NAME)
++ || cp_lexer_nth_token_is (parser->lexer, 3, CPP_KEYWORD))
++ && cp_lexer_nth_token_is (parser->lexer, 4, CPP_CLOSE_SQUARE)
++ && cp_lexer_nth_token_is (parser->lexer, 5, CPP_CLOSE_SQUARE))
++ {
++ cp_lexer_consume_token (parser->lexer);
++ cp_lexer_consume_token (parser->lexer);
++ cp_lexer_consume_token (parser->lexer);
++ cp_lexer_consume_token (parser->lexer);
++ cp_lexer_consume_token (parser->lexer);
++ }
++ else
++ while (cp_next_tokens_can_be_gnu_attribute_p (parser)
++ && cp_lexer_nth_token_is (parser->lexer, 2, CPP_OPEN_PAREN))
++ {
++ cp_lexer_consume_token (parser->lexer);
++ if (cp_parser_cache_group (parser, CPP_CLOSE_PAREN, /*depth=*/0))
++ break;
++ }
++ }
++
+ /* Handle function try blocks. */
+ if (cp_lexer_next_token_is_keyword (parser->lexer, RID_TRY))
+- cp_lexer_consume_token (parser->lexer);
++ {
++ cp_lexer_consume_token (parser->lexer);
++ function_try_block = true;
++ }
+ /* We can have braced-init-list mem-initializers before the fn body. */
+ if (cp_lexer_next_token_is (parser->lexer, CPP_COLON))
+ {
+@@ -26019,8 +26093,9 @@
+ }
+ cp_parser_cache_group (parser, CPP_CLOSE_BRACE, /*depth=*/0);
+ /* Handle function try blocks. */
+- while (cp_lexer_next_token_is_keyword (parser->lexer, RID_CATCH))
+- cp_parser_cache_group (parser, CPP_CLOSE_BRACE, /*depth=*/0);
++ if (function_try_block)
++ while (cp_lexer_next_token_is_keyword (parser->lexer, RID_CATCH))
++ cp_parser_cache_group (parser, CPP_CLOSE_BRACE, /*depth=*/0);
+ last = parser->lexer->next_token;
+
+ /* Save away the inline definition; we will process it when the
+@@ -29949,6 +30024,8 @@
+ switch (kind)
+ {
+ case OMP_CLAUSE__CACHE_:
++ /* The OpenACC cache directive explicitly only allows "array
++ elements or subarrays". */
+ if (cp_lexer_peek_token (parser->lexer)->type != CPP_OPEN_SQUARE)
+ {
+ error_at (token->location, "expected %<[%>");
+@@ -29965,6 +30042,7 @@
+ = cp_lexer_peek_token (parser->lexer)->location;
+ cp_id_kind idk = CP_ID_KIND_NONE;
+ cp_lexer_consume_token (parser->lexer);
++ decl = convert_from_reference (decl);
+ decl
+ = cp_parser_postfix_dot_deref_expression (parser, CPP_DOT,
+ decl, false,
+@@ -30000,25 +30078,6 @@
+ RT_CLOSE_SQUARE))
+ goto skip_comma;
+
+- if (kind == OMP_CLAUSE__CACHE_)
+- {
+- if (TREE_CODE (low_bound) != INTEGER_CST
+- && !TREE_READONLY (low_bound))
+- {
+- error_at (token->location,
+- "%qD is not a constant", low_bound);
+- decl = error_mark_node;
+- }
+-
+- if (TREE_CODE (length) != INTEGER_CST
+- && !TREE_READONLY (length))
+- {
+- error_at (token->location,
+- "%qD is not a constant", length);
+- decl = error_mark_node;
+- }
+- }
+-
+ decl = tree_cons (low_bound, length, decl);
+ }
+ break;
+@@ -33884,7 +33943,9 @@
+
+ strcat (p_name, " for");
+ mask |= OMP_FOR_CLAUSE_MASK;
+- if (cclauses)
++ /* parallel for{, simd} disallows nowait clause, but for
++ target {teams distribute ,}parallel for{, simd} it should be accepted. */
++ if (cclauses && (mask & (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_MAP)) == 0)
+ mask &= ~(OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_NOWAIT);
+ /* Composite distribute parallel for{, simd} disallows ordered clause. */
+ if ((mask & (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_DIST_SCHEDULE)) != 0)
+@@ -34223,7 +34284,8 @@
+ }
+ }
+
+- clauses = cp_parser_omp_all_clauses (parser, mask, p_name, pragma_tok);
++ clauses = cp_parser_omp_all_clauses (parser, mask, p_name, pragma_tok,
++ cclauses == NULL);
+ if (cclauses)
+ {
+ cp_omp_split_clauses (loc, OMP_PARALLEL, mask, clauses, cclauses);
+@@ -35396,6 +35458,8 @@
+ cp_parser_oacc_loop (cp_parser *parser, cp_token *pragma_tok, char *p_name,
+ omp_clause_mask mask, tree *cclauses, bool *if_p)
+ {
++ bool is_parallel = ((mask >> PRAGMA_OACC_CLAUSE_REDUCTION) & 1) == 1;
++
+ strcat (p_name, " loop");
+ mask |= OACC_LOOP_CLAUSE_MASK;
+
+@@ -35403,7 +35467,7 @@
+ cclauses == NULL);
+ if (cclauses)
+ {
+- clauses = c_oacc_split_loop_clauses (clauses, cclauses);
++ clauses = c_oacc_split_loop_clauses (clauses, cclauses, is_parallel);
+ if (*cclauses)
+ *cclauses = finish_omp_clauses (*cclauses, false);
+ if (clauses)
+@@ -35496,8 +35560,6 @@
+ if (strcmp (p, "loop") == 0)
+ {
+ cp_lexer_consume_token (parser->lexer);
+- mask |= OACC_LOOP_CLAUSE_MASK;
+-
+ tree block = begin_omp_parallel ();
+ tree clauses;
+ cp_parser_oacc_loop (parser, pragma_tok, p_name, mask, &clauses,
+@@ -37807,7 +37869,13 @@
+ implicit template scope, and we're trying to synthesize a
+ constrained parameter, try to find a previous parameter with
+ the same name. This is the same-type rule for abbreviated
+- function templates. */
++ function templates.
++
++ NOTE: We can generate implicit parameters when tentatively
++ parsing a nested name specifier, only to reject that parse
++ later. However, matching the same template-id as part of a
++ direct-declarator should generate an identical template
++ parameter, so this rule will merge them. */
+ if (parser->implicit_template_scope && constr)
+ {
+ tree t = parser->implicit_template_parms;
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/cp/pt.c gcc-6-20160721/gcc/cp/pt.c
+--- gcc-6.1.0/gcc/cp/pt.c 2016-04-26 06:08:20.000000000 +0000
++++ gcc-6-20160721/gcc/cp/pt.c 2016-07-21 06:29:32.000000000 +0000
+@@ -182,7 +182,6 @@
+ static tree tsubst_template_arg (tree, tree, tsubst_flags_t, tree);
+ static tree tsubst_template_args (tree, tree, tsubst_flags_t, tree);
+ static tree tsubst_template_parms (tree, tree, tsubst_flags_t);
+-static void regenerate_decl_from_template (tree, tree);
+ static tree most_specialized_partial_spec (tree, tsubst_flags_t);
+ static tree tsubst_aggr_type (tree, tree, tsubst_flags_t, tree, int);
+ static tree tsubst_arg_types (tree, tree, tree, tsubst_flags_t, tree);
+@@ -196,7 +195,6 @@
+ static int coerce_template_template_parms (tree, tree, tsubst_flags_t,
+ tree, tree);
+ static bool template_template_parm_bindings_ok_p (tree, tree);
+-static int template_args_equal (tree, tree);
+ static void tsubst_default_arguments (tree, tsubst_flags_t);
+ static tree for_each_template_parm_r (tree *, int *, void *);
+ static tree copy_default_args_to_explicit_spec_1 (tree, tree);
+@@ -2808,6 +2806,13 @@
+ context. */
+ fns = lookup_qualified_name (CP_DECL_CONTEXT (decl), dname,
+ false, true);
++ if (fns == error_mark_node)
++ /* If lookup fails, look for a friend declaration so we can
++ give a better diagnostic. */
++ fns = lookup_qualified_name (CP_DECL_CONTEXT (decl), dname,
++ /*type*/false, /*complain*/true,
++ /*hidden*/true);
++
+ if (fns == error_mark_node || !is_overloaded_fn (fns))
+ {
+ error ("%qD is not a template function", dname);
+@@ -2953,6 +2958,15 @@
+ CP_DECL_CONTEXT (tmpl)))
+ error ("%qD is not declared in %qD",
+ tmpl, current_namespace);
++ else if (TREE_CODE (decl) == FUNCTION_DECL
++ && DECL_HIDDEN_FRIEND_P (tmpl))
++ {
++ if (pedwarn (DECL_SOURCE_LOCATION (decl), 0,
++ "friend declaration %qD is not visible to "
++ "explicit specialization", tmpl))
++ inform (DECL_SOURCE_LOCATION (tmpl),
++ "friend declaration here");
++ }
+
+ tree gen_tmpl = most_general_template (tmpl);
+
+@@ -7823,7 +7837,7 @@
+
+ /* Returns 1 if template args OT and NT are equivalent. */
+
+-static int
++int
+ template_args_equal (tree ot, tree nt)
+ {
+ if (nt == ot)
+@@ -8680,7 +8694,7 @@
+ {
+ if (complain & tf_error)
+ {
+- error ("constraints for %qD not satisfied", templ);
++ error ("use of invalid variable template %qE", var);
+ diagnose_constraints (location_of (var), templ, arglist);
+ }
+ return error_mark_node;
+@@ -9071,6 +9085,8 @@
+
+ if (tinst_depth >= max_tinst_depth)
+ {
++ /* Tell error.c not to try to instantiate any templates. */
++ at_eof = 2;
+ fatal_error (input_location,
+ "template instantiation depth exceeds maximum of %d"
+ " (use -ftemplate-depth= to increase the maximum)",
+@@ -9554,7 +9570,7 @@
+ return 0;
+ else if (COMPLETE_TYPE_P (type))
+ return 1;
+- else if (TREE_CODE (type) == ARRAY_TYPE && TYPE_DOMAIN (type))
++ else if (TREE_CODE (type) == ARRAY_TYPE)
+ return can_complete_type_without_circularity (TREE_TYPE (type));
+ else if (CLASS_TYPE_P (type)
+ && TYPE_BEING_DEFINED (TYPE_MAIN_VARIANT (type)))
+@@ -9649,20 +9665,23 @@
+ }
+
+ if (last_dep)
+- for (tree *p = &attributes; *p; p = &TREE_CHAIN (*p))
++ for (tree *p = &attributes; *p; )
+ {
+ tree t = *p;
+ if (ATTR_IS_DEPENDENT (t))
+ {
+ tree subst = tsubst_attribute (t, NULL, args, complain, in_decl);
+- if (subst == t)
+- continue;
+- *p = subst;
+- do
+- p = &TREE_CHAIN (*p);
+- while (*p);
+- *p = TREE_CHAIN (t);
++ if (subst != t)
++ {
++ *p = subst;
++ do
++ p = &TREE_CHAIN (*p);
++ while (*p);
++ *p = TREE_CHAIN (t);
++ continue;
++ }
+ }
++ p = &TREE_CHAIN (*p);
+ }
+
+ return attributes;
+@@ -10118,17 +10137,12 @@
+ if (can_complete_type_without_circularity (rtype))
+ complete_type (rtype);
+
+- if (TREE_CODE (r) == FIELD_DECL
+- && TREE_CODE (rtype) == ARRAY_TYPE
+- && COMPLETE_TYPE_P (TREE_TYPE (rtype))
+- && !COMPLETE_TYPE_P (rtype))
+- {
+- /* Flexible array mmembers of elements
+- of complete type have an incomplete type
+- and that's okay. */
+- }
+- else if (!COMPLETE_TYPE_P (rtype))
++ if (!complete_or_array_type_p (rtype))
+ {
++ /* If R's type couldn't be completed and
++ it isn't a flexible array member (whose
++ type is incomplete by definition) give
++ an error. */
+ cxx_incomplete_type_error (r, rtype);
+ TREE_TYPE (r) = error_mark_node;
+ }
+@@ -10732,6 +10746,12 @@
+ tree pack = tsubst_fold_expr_pack (t, args, complain, in_decl);
+ if (pack == error_mark_node)
+ return error_mark_node;
++ if (PACK_EXPANSION_P (pack))
++ {
++ tree r = copy_node (t);
++ FOLD_EXPR_PACK (r) = pack;
++ return r;
++ }
+ if (TREE_VEC_LENGTH (pack) == 0)
+ return expand_empty_fold (t, complain);
+ else
+@@ -10754,6 +10774,14 @@
+ if (init == error_mark_node)
+ return error_mark_node;
+
++ if (PACK_EXPANSION_P (pack))
++ {
++ tree r = copy_node (t);
++ FOLD_EXPR_PACK (r) = pack;
++ FOLD_EXPR_INIT (r) = init;
++ return r;
++ }
++
+ tree vec = make_tree_vec (TREE_VEC_LENGTH (pack) + 1);
+ TREE_VEC_ELT (vec, 0) = init;
+ for (int i = 0; i < TREE_VEC_LENGTH (pack); ++i)
+@@ -10795,6 +10823,12 @@
+ tree pack = tsubst_fold_expr_pack (t, args, complain, in_decl);
+ if (pack == error_mark_node)
+ return error_mark_node;
++ if (PACK_EXPANSION_P (pack))
++ {
++ tree r = copy_node (t);
++ FOLD_EXPR_PACK (r) = pack;
++ return r;
++ }
+ if (TREE_VEC_LENGTH (pack) == 0)
+ return expand_empty_fold (t, complain);
+ else
+@@ -10817,6 +10851,14 @@
+ if (init == error_mark_node)
+ return error_mark_node;
+
++ if (PACK_EXPANSION_P (pack))
++ {
++ tree r = copy_node (t);
++ FOLD_EXPR_PACK (r) = pack;
++ FOLD_EXPR_INIT (r) = init;
++ return r;
++ }
++
+ int n = TREE_VEC_LENGTH (pack);
+ tree vec = make_tree_vec (n + 1);
+ for (int i = 0; i < n; ++i)
+@@ -12285,6 +12327,14 @@
+ local_p = true;
+ /* Subsequent calls to pushdecl will fill this in. */
+ ctx = NULL_TREE;
++ /* Unless this is a reference to a static variable from an
++ enclosing function, in which case we need to fill it in now. */
++ if (TREE_STATIC (t))
++ {
++ tree fn = tsubst (DECL_CONTEXT (t), args, complain, in_decl);
++ if (fn != current_function_decl)
++ ctx = fn;
++ }
+ spec = retrieve_local_specialization (t);
+ }
+ /* If we already have the specialization we need, there is
+@@ -13740,8 +13790,10 @@
+ {
+ if (is_template)
+ expr = build_min_nt_loc (loc, TEMPLATE_ID_EXPR, expr, template_args);
+- return build_qualified_name (NULL_TREE, scope, expr,
+- QUALIFIED_NAME_IS_TEMPLATE (qualified_id));
++ tree r = build_qualified_name (NULL_TREE, scope, expr,
++ QUALIFIED_NAME_IS_TEMPLATE (qualified_id));
++ REF_PARENTHESIZED_P (r) = REF_PARENTHESIZED_P (qualified_id);
++ return r;
+ }
+
+ if (!BASELINK_P (name) && !DECL_P (expr))
+@@ -13821,6 +13873,9 @@
+ && TREE_CODE (expr) != OFFSET_REF)
+ expr = convert_from_reference (expr);
+
++ if (REF_PARENTHESIZED_P (qualified_id))
++ expr = force_paren_expr (expr);
++
+ return expr;
+ }
+
+@@ -13996,7 +14051,8 @@
+ case FUNCTION_DECL:
+ if (DECL_LANG_SPECIFIC (t) && DECL_TEMPLATE_INFO (t))
+ r = tsubst (t, args, complain, in_decl);
+- else if (local_variable_p (t))
++ else if (local_variable_p (t)
++ && uses_template_parms (DECL_CONTEXT (t)))
+ {
+ r = retrieve_local_specialization (t);
+ if (r == NULL_TREE)
+@@ -14040,14 +14096,9 @@
+ gcc_assert (cp_unevaluated_operand || TREE_STATIC (r)
+ || decl_constant_var_p (r)
+ || errorcount || sorrycount);
+- if (!processing_template_decl)
+- {
+- if (TREE_STATIC (r))
+- rest_of_decl_compilation (r, toplevel_bindings_p (),
+- at_eof);
+- else
+- r = process_outer_var_ref (r, complain);
+- }
++ if (!processing_template_decl
++ && !TREE_STATIC (r))
++ r = process_outer_var_ref (r, complain);
+ }
+ /* Remember this for subsequent uses. */
+ if (local_specializations)
+@@ -14145,7 +14196,8 @@
+ len = TREE_VEC_LENGTH (expanded);
+ /* Set TREE_USED for the benefit of -Wunused. */
+ for (int i = 0; i < len; i++)
+- TREE_USED (TREE_VEC_ELT (expanded, i)) = true;
++ if (DECL_P (TREE_VEC_ELT (expanded, i)))
++ TREE_USED (TREE_VEC_ELT (expanded, i)) = true;
+ }
+
+ if (expanded == error_mark_node)
+@@ -17376,6 +17428,7 @@
+
+ tree pattern = DECL_TEMPLATE_RESULT (gen_tmpl);
+
++ fndecl = NULL_TREE;
+ if (VAR_P (pattern))
+ {
+ /* We need to determine if we're using a partial or explicit
+@@ -17387,14 +17440,16 @@
+ pattern = error_mark_node;
+ else if (elt)
+ {
+- tmpl = TREE_VALUE (elt);
+- pattern = DECL_TEMPLATE_RESULT (tmpl);
+- targ_ptr = TREE_PURPOSE (elt);
++ tree partial_tmpl = TREE_VALUE (elt);
++ tree partial_args = TREE_PURPOSE (elt);
++ tree partial_pat = DECL_TEMPLATE_RESULT (partial_tmpl);
++ fndecl = tsubst (partial_pat, partial_args, complain, gen_tmpl);
+ }
+ }
+
+ /* Substitute template parameters to obtain the specialization. */
+- fndecl = tsubst (pattern, targ_ptr, complain, gen_tmpl);
++ if (fndecl == NULL_TREE)
++ fndecl = tsubst (pattern, targ_ptr, complain, gen_tmpl);
+ if (DECL_CLASS_SCOPE_P (gen_tmpl))
+ pop_nested_class ();
+ pop_from_top_level ();
+@@ -20848,36 +20903,6 @@
+ return decl;
+ }
+
+-/* True iff the TEMPLATE_DECL tmpl is a partial specialization. */
+-
+-static bool
+-partial_specialization_p (tree tmpl)
+-{
+- /* Any specialization has DECL_TEMPLATE_SPECIALIZATION. */
+- if (!DECL_TEMPLATE_SPECIALIZATION (tmpl))
+- return false;
+- tree t = DECL_TI_TEMPLATE (tmpl);
+- /* A specialization that fully specializes one of the containing classes is
+- not a partial specialization. */
+- return (list_length (DECL_TEMPLATE_PARMS (tmpl))
+- == list_length (DECL_TEMPLATE_PARMS (t)));
+-}
+-
+-/* If TMPL is a partial specialization, return the arguments for its primary
+- template. */
+-
+-static tree
+-impartial_args (tree tmpl, tree args)
+-{
+- if (!partial_specialization_p (tmpl))
+- return args;
+-
+- /* If TMPL is a partial specialization, we need to substitute to get
+- the args for the primary template. */
+- return tsubst_template_args (DECL_TI_ARGS (tmpl), args,
+- tf_warning_or_error, tmpl);
+-}
+-
+ /* Return the most specialized of the template partial specializations
+ which can produce TARGET, a specialization of some class or variable
+ template. The value returned is actually a TREE_LIST; the TREE_VALUE is
+@@ -21379,14 +21404,12 @@
+ to instantiate the DECL, we regenerate it. */
+
+ static void
+-regenerate_decl_from_template (tree decl, tree tmpl)
++regenerate_decl_from_template (tree decl, tree tmpl, tree args)
+ {
+ /* The arguments used to instantiate DECL, from the most general
+ template. */
+- tree args;
+ tree code_pattern;
+
+- args = DECL_TI_ARGS (decl);
+ code_pattern = DECL_TEMPLATE_RESULT (tmpl);
+
+ /* Make sure that we can see identifiers, and compute access
+@@ -21702,7 +21725,7 @@
+ return d;
+
+ gen_tmpl = most_general_template (tmpl);
+- gen_args = impartial_args (tmpl, DECL_TI_ARGS (d));
++ gen_args = DECL_TI_ARGS (d);
+
+ if (tmpl != gen_tmpl)
+ /* We should already have the extra args. */
+@@ -21721,6 +21744,20 @@
+ /* Set TD to the template whose DECL_TEMPLATE_RESULT is the pattern
+ for the instantiation. */
+ td = template_for_substitution (d);
++ args = gen_args;
++
++ if (VAR_P (d))
++ {
++ /* Look up an explicit specialization, if any. */
++ tree tid = lookup_template_variable (gen_tmpl, gen_args);
++ tree elt = most_specialized_partial_spec (tid, tf_warning_or_error);
++ if (elt && elt != error_mark_node)
++ {
++ td = TREE_VALUE (elt);
++ args = TREE_PURPOSE (elt);
++ }
++ }
++
+ code_pattern = DECL_TEMPLATE_RESULT (td);
+
+ /* We should never be trying to instantiate a member of a class
+@@ -21733,9 +21770,7 @@
+ outside the class, we may have too many arguments. Drop the
+ ones we don't need. The same is true for specializations. */
+ args = get_innermost_template_args
+- (gen_args, TMPL_PARMS_DEPTH (DECL_TEMPLATE_PARMS (td)));
+- else
+- args = gen_args;
++ (args, TMPL_PARMS_DEPTH (DECL_TEMPLATE_PARMS (td)));
+
+ if (TREE_CODE (d) == FUNCTION_DECL)
+ {
+@@ -21901,7 +21936,7 @@
+
+ /* Regenerate the declaration in case the template has been modified
+ by a subsequent redeclaration. */
+- regenerate_decl_from_template (d, td);
++ regenerate_decl_from_template (d, td, args);
+
+ /* We already set the file and line above. Reset them now in case
+ they changed as a result of calling regenerate_decl_from_template. */
+@@ -23628,7 +23663,10 @@
+ if (0 && flag_checking && cxx_dialect >= cxx11
+ /* Don't do this during nsdmi parsing as it can lead to
+ unexpected recursive instantiations. */
+- && !parsing_nsdmi ())
++ && !parsing_nsdmi ()
++ /* Don't do this during concept expansion either and for
++ the same reason. */
++ && !expanding_concept ())
+ fold_non_dependent_expr (expr);
+
+ /* Preserve OVERLOADs; the functions must be available to resolve
+@@ -23766,7 +23804,7 @@
+ else
+ expr = build_concept_check (build_overload (tmpl, NULL_TREE), type, args);
+
+- tree constr = make_predicate_constraint (expr);
++ tree constr = normalize_expression (expr);
+ PLACEHOLDER_TYPE_CONSTRAINTS (type) = constr;
+
+ /* Our canonical type depends on the constraint. */
+@@ -23918,7 +23956,10 @@
+ /* Replace occurrences of 'auto' in TYPE with the appropriate type deduced
+ from INIT. AUTO_NODE is the TEMPLATE_TYPE_PARM used for 'auto' in TYPE.
+ The CONTEXT determines the context in which auto deduction is performed
+- and is used to control error diagnostics. */
++ and is used to control error diagnostics.
++
++ For partial-concept-ids, extra args may be appended to the list of deduced
++ template arguments prior to determining constraint satisfaction. */
+
+ tree
+ do_auto_deduction (tree type, tree init, tree auto_node,
+@@ -23965,8 +24006,10 @@
+
+ if (AUTO_IS_DECLTYPE (auto_node))
+ {
+- bool id = (DECL_P (init) || (TREE_CODE (init) == COMPONENT_REF
+- && !REF_PARENTHESIZED_P (init)));
++ bool id = (DECL_P (init)
++ || ((TREE_CODE (init) == COMPONENT_REF
++ || TREE_CODE (init) == SCOPE_REF)
++ && !REF_PARENTHESIZED_P (init)));
+ targs = make_tree_vec (1);
+ TREE_VEC_ELT (targs, 0)
+ = finish_decltype_type (init, id, tf_warning_or_error);
+@@ -24023,8 +24066,19 @@
+ if (flag_concepts && !processing_template_decl)
+ if (tree constr = PLACEHOLDER_TYPE_CONSTRAINTS (auto_node))
+ {
+- /* Use the deduced type to check the associated constraints. */
+- if (!constraints_satisfied_p (constr, targs))
++ /* Use the deduced type to check the associated constraints. If we
++ have a partial-concept-id, rebuild the argument list so that
++ we check using the extra arguments. */
++ gcc_assert (TREE_CODE (constr) == CHECK_CONSTR);
++ tree cargs = CHECK_CONSTR_ARGS (constr);
++ if (TREE_VEC_LENGTH (cargs) > 1)
++ {
++ cargs = copy_node (cargs);
++ TREE_VEC_ELT (cargs, 0) = TREE_VEC_ELT (targs, 0);
++ }
++ else
++ cargs = targs;
++ if (!constraints_satisfied_p (constr, cargs))
+ {
+ if (complain & tf_warning_or_error)
+ {
+@@ -24344,24 +24398,15 @@
+
+ static GTY (()) hash_table<constr_hasher> *decl_constraints;
+
+-/* Returns true iff cinfo contains a valid set of constraints.
+- This is the case when the associated requirements have been
+- successfully decomposed into lists of atomic constraints.
+- That is, when the saved assumptions are not error_mark_node. */
+-
+-bool
+-valid_constraints_p (tree cinfo)
+-{
+- gcc_assert (cinfo);
+- return CI_ASSUMPTIONS (cinfo) != error_mark_node;
+-}
+-
+ /* Returns the template constraints of declaration T. If T is not
+ constrained, return NULL_TREE. Note that T must be non-null. */
+
+ tree
+ get_constraints (tree t)
+ {
++ if (!flag_concepts)
++ return NULL_TREE;
++
+ gcc_assert (DECL_P (t));
+ if (TREE_CODE (t) == TEMPLATE_DECL)
+ t = DECL_TEMPLATE_RESULT (t);
+@@ -24383,7 +24428,7 @@
+ {
+ if (!ci)
+ return;
+- gcc_assert (t);
++ gcc_assert (t && flag_concepts);
+ if (TREE_CODE (t) == TEMPLATE_DECL)
+ t = DECL_TEMPLATE_RESULT (t);
+ gcc_assert (!get_constraints (t));
+@@ -24409,12 +24454,244 @@
+ decl_constraints->clear_slot (slot);
+ }
+
++/* Memoized satisfaction results for declarations. This
++ maps the pair (constraint_info, arguments) to the result computed
++ by constraints_satisfied_p. */
++
++struct GTY((for_user)) constraint_sat_entry
++{
++ tree ci;
++ tree args;
++ tree result;
++};
++
++/* Hashing function and equality for constraint entries. */
++
++struct constraint_sat_hasher : ggc_ptr_hash<constraint_sat_entry>
++{
++ static hashval_t hash (constraint_sat_entry *e)
++ {
++ hashval_t val = iterative_hash_object(e->ci, 0);
++ return iterative_hash_template_arg (e->args, val);
++ }
++
++ static bool equal (constraint_sat_entry *e1, constraint_sat_entry *e2)
++ {
++ return e1->ci == e2->ci && comp_template_args (e1->args, e2->args);
++ }
++};
++
++/* Memoized satisfaction results for concept checks. */
++
++struct GTY((for_user)) concept_spec_entry
++{
++ tree tmpl;
++ tree args;
++ tree result;
++};
++
++/* Hashing function and equality for constraint entries. */
++
++struct concept_spec_hasher : ggc_ptr_hash<concept_spec_entry>
++{
++ static hashval_t hash (concept_spec_entry *e)
++ {
++ return hash_tmpl_and_args (e->tmpl, e->args);
++ }
++
++ static bool equal (concept_spec_entry *e1, concept_spec_entry *e2)
++ {
++ ++comparing_specializations;
++ bool eq = e1->tmpl == e2->tmpl && comp_template_args (e1->args, e2->args);
++ --comparing_specializations;
++ return eq;
++ }
++};
++
++static GTY (()) hash_table<constraint_sat_hasher> *constraint_memos;
++static GTY (()) hash_table<concept_spec_hasher> *concept_memos;
++
++/* Search for a memoized satisfaction result. Returns one of the
++ truth value nodes if previously memoized, or NULL_TREE otherwise. */
++
++tree
++lookup_constraint_satisfaction (tree ci, tree args)
++{
++ constraint_sat_entry elt = { ci, args, NULL_TREE };
++ constraint_sat_entry* found = constraint_memos->find (&elt);
++ if (found)
++ return found->result;
++ else
++ return NULL_TREE;
++}
++
++/* Memoize the result of a satisfication test. Returns the saved result. */
++
++tree
++memoize_constraint_satisfaction (tree ci, tree args, tree result)
++{
++ constraint_sat_entry elt = {ci, args, result};
++ constraint_sat_entry** slot = constraint_memos->find_slot (&elt, INSERT);
++ constraint_sat_entry* entry = ggc_alloc<constraint_sat_entry> ();
++ *entry = elt;
++ *slot = entry;
++ return result;
++}
++
++/* Search for a memoized satisfaction result for a concept. */
++
++tree
++lookup_concept_satisfaction (tree tmpl, tree args)
++{
++ concept_spec_entry elt = { tmpl, args, NULL_TREE };
++ concept_spec_entry* found = concept_memos->find (&elt);
++ if (found)
++ return found->result;
++ else
++ return NULL_TREE;
++}
++
++/* Memoize the result of a concept check. Returns the saved result. */
++
++tree
++memoize_concept_satisfaction (tree tmpl, tree args, tree result)
++{
++ concept_spec_entry elt = {tmpl, args, result};
++ concept_spec_entry** slot = concept_memos->find_slot (&elt, INSERT);
++ concept_spec_entry* entry = ggc_alloc<concept_spec_entry> ();
++ *entry = elt;
++ *slot = entry;
++ return result;
++}
++
++static GTY (()) hash_table<concept_spec_hasher> *concept_expansions;
++
++/* Returns a prior concept specialization. This returns the substituted
++ and normalized constraints defined by the concept. */
++
++tree
++get_concept_expansion (tree tmpl, tree args)
++{
++ concept_spec_entry elt = { tmpl, args, NULL_TREE };
++ concept_spec_entry* found = concept_expansions->find (&elt);
++ if (found)
++ return found->result;
++ else
++ return NULL_TREE;
++}
++
++/* Save a concept expansion for later. */
++
++tree
++save_concept_expansion (tree tmpl, tree args, tree def)
++{
++ concept_spec_entry elt = {tmpl, args, def};
++ concept_spec_entry** slot = concept_expansions->find_slot (&elt, INSERT);
++ concept_spec_entry* entry = ggc_alloc<concept_spec_entry> ();
++ *entry = elt;
++ *slot = entry;
++ return def;
++}
++
++static hashval_t
++hash_subsumption_args (tree t1, tree t2)
++{
++ gcc_assert (TREE_CODE (t1) == CHECK_CONSTR);
++ gcc_assert (TREE_CODE (t2) == CHECK_CONSTR);
++ int val = 0;
++ val = iterative_hash_object (CHECK_CONSTR_CONCEPT (t1), val);
++ val = iterative_hash_template_arg (CHECK_CONSTR_ARGS (t1), val);
++ val = iterative_hash_object (CHECK_CONSTR_CONCEPT (t2), val);
++ val = iterative_hash_template_arg (CHECK_CONSTR_ARGS (t2), val);
++ return val;
++}
++
++/* Compare the constraints of two subsumption entries. The LEFT1 and
++ LEFT2 arguments comprise the first subsumption pair and the RIGHT1
++ and RIGHT2 arguments comprise the second. These are all CHECK_CONSTRs. */
++
++static bool
++comp_subsumption_args (tree left1, tree left2, tree right1, tree right2)
++{
++ if (CHECK_CONSTR_CONCEPT (left1) == CHECK_CONSTR_CONCEPT (right1))
++ if (CHECK_CONSTR_CONCEPT (left2) == CHECK_CONSTR_CONCEPT (right2))
++ if (comp_template_args (CHECK_CONSTR_ARGS (left1),
++ CHECK_CONSTR_ARGS (right1)))
++ return comp_template_args (CHECK_CONSTR_ARGS (left2),
++ CHECK_CONSTR_ARGS (right2));
++ return false;
++}
++
++/* Key/value pair for learning and memoizing subsumption results. This
++ associates a pair of check constraints (including arguments) with
++ a boolean value indicating the result. */
++
++struct GTY((for_user)) subsumption_entry
++{
++ tree t1;
++ tree t2;
++ bool result;
++};
++
++/* Hashing function and equality for constraint entries. */
++
++struct subsumption_hasher : ggc_ptr_hash<subsumption_entry>
++{
++ static hashval_t hash (subsumption_entry *e)
++ {
++ return hash_subsumption_args (e->t1, e->t2);
++ }
++
++ static bool equal (subsumption_entry *e1, subsumption_entry *e2)
++ {
++ ++comparing_specializations;
++ bool eq = comp_subsumption_args(e1->t1, e1->t2, e2->t1, e2->t2);
++ --comparing_specializations;
++ return eq;
++ }
++};
++
++static GTY (()) hash_table<subsumption_hasher> *subsumption_table;
++
++/* Search for a previously cached subsumption result. */
++
++bool*
++lookup_subsumption_result (tree t1, tree t2)
++{
++ subsumption_entry elt = { t1, t2, false };
++ subsumption_entry* found = subsumption_table->find (&elt);
++ if (found)
++ return &found->result;
++ else
++ return 0;
++}
++
++/* Save a subsumption result. */
++
++bool
++save_subsumption_result (tree t1, tree t2, bool result)
++{
++ subsumption_entry elt = {t1, t2, result};
++ subsumption_entry** slot = subsumption_table->find_slot (&elt, INSERT);
++ subsumption_entry* entry = ggc_alloc<subsumption_entry> ();
++ *entry = elt;
++ *slot = entry;
++ return result;
++}
++
+ /* Set up the hash table for constraint association. */
+
+ void
+ init_constraint_processing (void)
+ {
++ if (!flag_concepts)
++ return;
++
+ decl_constraints = hash_table<constr_hasher>::create_ggc(37);
++ constraint_memos = hash_table<constraint_sat_hasher>::create_ggc(37);
++ concept_memos = hash_table<concept_spec_hasher>::create_ggc(37);
++ concept_expansions = hash_table<concept_spec_hasher>::create_ggc(37);
++ subsumption_table = hash_table<subsumption_hasher>::create_ggc(37);
+ }
+
+ /* Set up the hash tables for template instantiations. */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/cp/ptree.c gcc-6-20160721/gcc/cp/ptree.c
+--- gcc-6.1.0/gcc/cp/ptree.c 2016-02-10 15:34:45.000000000 +0000
++++ gcc-6-20160721/gcc/cp/ptree.c 2016-07-21 06:18:06.000000000 +0000
+@@ -260,7 +260,6 @@
+ indent+4);
+ print_node (file, "associated_constr",
+ cinfo->associated_constr, indent+4);
+- print_node_brief (file, "assumptions", cinfo->assumptions, indent+4);
+ break;
+ }
+ case ARGUMENT_PACK_SELECT:
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/cp/search.c gcc-6-20160721/gcc/cp/search.c
+--- gcc-6.1.0/gcc/cp/search.c 2016-03-18 01:26:50.000000000 +0000
++++ gcc-6-20160721/gcc/cp/search.c 2016-07-21 06:18:06.000000000 +0000
+@@ -947,6 +947,7 @@
+ in default arguments for template parameters), and access
+ checking should be performed in the outermost parameter list. */
+ if (processing_template_decl
++ && !expanding_concept ()
+ && (!processing_template_parmlist || processing_template_decl > 1))
+ return 1;
+
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/cp/semantics.c gcc-6-20160721/gcc/cp/semantics.c
+--- gcc-6.1.0/gcc/cp/semantics.c 2016-04-20 13:24:17.000000000 +0000
++++ gcc-6-20160721/gcc/cp/semantics.c 2016-07-21 06:29:32.000000000 +0000
+@@ -1647,17 +1647,10 @@
+ && TREE_CODE (expr) != SCOPE_REF)
+ return expr;
+
+- if (TREE_CODE (expr) == COMPONENT_REF)
++ if (TREE_CODE (expr) == COMPONENT_REF
++ || TREE_CODE (expr) == SCOPE_REF)
+ REF_PARENTHESIZED_P (expr) = true;
+- else if (type_dependent_expression_p (expr)
+- /* When processing_template_decl, a SCOPE_REF may actually be
+- referring to a non-static data member of the current class, in
+- which case its TREE_TYPE may not be properly cv-qualified (the
+- cv-qualifiers of the implicit *this object haven't yet been taken
+- into account) so we have to delay building a static_cast until
+- instantiation. */
+- || (processing_template_decl
+- && TREE_CODE (expr) == SCOPE_REF))
++ else if (type_dependent_expression_p (expr))
+ expr = build1 (PAREN_EXPR, TREE_TYPE (expr), expr);
+ else if (VAR_P (expr) && DECL_HARD_REGISTER (expr))
+ /* We can't bind a hard register variable to a reference. */;
+@@ -3276,7 +3269,7 @@
+ tree initializer = convert_from_reference (decl);
+
+ /* Mark it as used now even if the use is ill-formed. */
+- if (!mark_used (decl, complain) && !(complain & tf_error))
++ if (!mark_used (decl, complain))
+ return error_mark_node;
+
+ bool saw_generic_lambda = false;
+@@ -4507,7 +4500,8 @@
+ || OMP_CLAUSE_CODE (c) == OMP_CLAUSE_FROM)
+ && !type_dependent_expression_p (t))
+ {
+- if (DECL_BIT_FIELD (TREE_OPERAND (t, 1)))
++ if (TREE_CODE (TREE_OPERAND (t, 1)) == FIELD_DECL
++ && DECL_BIT_FIELD (TREE_OPERAND (t, 1)))
+ {
+ error_at (OMP_CLAUSE_LOCATION (c),
+ "bit-field %qE in %qs clause",
+@@ -4516,7 +4510,8 @@
+ }
+ while (TREE_CODE (t) == COMPONENT_REF)
+ {
+- if (TREE_CODE (TREE_TYPE (TREE_OPERAND (t, 0))) == UNION_TYPE)
++ if (TREE_TYPE (TREE_OPERAND (t, 0))
++ && TREE_CODE (TREE_TYPE (TREE_OPERAND (t, 0))) == UNION_TYPE)
+ {
+ error_at (OMP_CLAUSE_LOCATION (c),
+ "%qE is a member of a union", t);
+@@ -4524,6 +4519,8 @@
+ }
+ t = TREE_OPERAND (t, 0);
+ }
++ if (REFERENCE_REF_P (t))
++ t = TREE_OPERAND (t, 0);
+ }
+ if (!VAR_P (t) && TREE_CODE (t) != PARM_DECL)
+ {
+@@ -5884,7 +5881,8 @@
+ }
+ if (TREE_CODE (type) == REFERENCE_TYPE)
+ type = TREE_TYPE (type);
+- if (!INTEGRAL_TYPE_P (type)
++ if (OMP_CLAUSE_LINEAR_KIND (c) != OMP_CLAUSE_LINEAR_REF
++ && !INTEGRAL_TYPE_P (type)
+ && TREE_CODE (type) != POINTER_TYPE)
+ {
+ error ("linear clause applied to non-integral non-pointer "
+@@ -6583,6 +6581,8 @@
+ {
+ while (TREE_CODE (t) == COMPONENT_REF)
+ t = TREE_OPERAND (t, 0);
++ if (REFERENCE_REF_P (t))
++ t = TREE_OPERAND (t, 0);
+ if (bitmap_bit_p (&map_field_head, DECL_UID (t)))
+ break;
+ if (bitmap_bit_p (&map_head, DECL_UID (t)))
+@@ -6621,7 +6621,8 @@
+ {
+ if (type_dependent_expression_p (t))
+ break;
+- if (DECL_BIT_FIELD (TREE_OPERAND (t, 1)))
++ if (TREE_CODE (TREE_OPERAND (t, 1)) == FIELD_DECL
++ && DECL_BIT_FIELD (TREE_OPERAND (t, 1)))
+ {
+ error_at (OMP_CLAUSE_LOCATION (c),
+ "bit-field %qE in %qs clause",
+@@ -6637,8 +6638,9 @@
+ }
+ while (TREE_CODE (t) == COMPONENT_REF)
+ {
+- if (TREE_CODE (TREE_TYPE (TREE_OPERAND (t, 0)))
+- == UNION_TYPE)
++ if (TREE_TYPE (TREE_OPERAND (t, 0))
++ && (TREE_CODE (TREE_TYPE (TREE_OPERAND (t, 0)))
++ == UNION_TYPE))
+ {
+ error_at (OMP_CLAUSE_LOCATION (c),
+ "%qE is a member of a union", t);
+@@ -6649,6 +6651,8 @@
+ }
+ if (remove)
+ break;
++ if (REFERENCE_REF_P (t))
++ t = TREE_OPERAND (t, 0);
+ if (VAR_P (t) || TREE_CODE (t) == PARM_DECL)
+ {
+ if (bitmap_bit_p (&map_field_head, DECL_UID (t)))
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/cp/tree.c gcc-6-20160721/gcc/cp/tree.c
+--- gcc-6.1.0/gcc/cp/tree.c 2016-04-13 00:06:51.000000000 +0000
++++ gcc-6-20160721/gcc/cp/tree.c 2016-07-21 06:18:06.000000000 +0000
+@@ -3139,6 +3139,11 @@
+ return cp_tree_equal (CI_ASSOCIATED_CONSTRAINTS (t1),
+ CI_ASSOCIATED_CONSTRAINTS (t2));
+
++ case CHECK_CONSTR:
++ return (CHECK_CONSTR_CONCEPT (t1) == CHECK_CONSTR_CONCEPT (t2)
++ && comp_template_args (CHECK_CONSTR_ARGS (t1),
++ CHECK_CONSTR_ARGS (t2)));
++
+ case TREE_VEC:
+ {
+ unsigned ix;
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/cp/typeck.c gcc-6-20160721/gcc/cp/typeck.c
+--- gcc-6.1.0/gcc/cp/typeck.c 2016-04-13 00:06:51.000000000 +0000
++++ gcc-6-20160721/gcc/cp/typeck.c 2016-07-19 08:40:37.000000000 +0000
+@@ -111,7 +111,7 @@
+
+ if (type == error_mark_node || COMPLETE_TYPE_P (type))
+ ;
+- else if (TREE_CODE (type) == ARRAY_TYPE && TYPE_DOMAIN (type))
++ else if (TREE_CODE (type) == ARRAY_TYPE)
+ {
+ tree t = complete_type (TREE_TYPE (type));
+ unsigned int needs_constructing, has_nontrivial_dtor;
+@@ -6270,8 +6270,7 @@
+ }
+
+ expr = build_conditional_expr (loc, ifexp, op1, op2, complain);
+- if (processing_template_decl && expr != error_mark_node
+- && TREE_CODE (expr) != VEC_COND_EXPR)
++ if (processing_template_decl && expr != error_mark_node)
+ {
+ tree min = build_min_non_dep (COND_EXPR, expr,
+ orig_ifexp, orig_op1, orig_op2);
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/cp/typeck2.c gcc-6-20160721/gcc/cp/typeck2.c
+--- gcc-6.1.0/gcc/cp/typeck2.c 2016-04-15 04:02:49.000000000 +0000
++++ gcc-6-20160721/gcc/cp/typeck2.c 2016-07-21 06:15:58.000000000 +0000
+@@ -539,6 +539,7 @@
+ break;
+
+ case TYPENAME_TYPE:
++ case DECLTYPE_TYPE:
+ emit_diagnostic (diag_kind, loc, 0,
+ "invalid use of dependent type %qT", type);
+ break;
+@@ -951,10 +952,12 @@
+ {
+ if (complain & tf_warning_or_error)
+ {
+- if (!almost_ok || pedantic)
+- pedwarn (loc, OPT_Wnarrowing, "narrowing conversion of %qE "
+- "from %qT to %qT inside { }", init, ftype, type);
+- if (pedantic && almost_ok)
++ if ((!almost_ok || pedantic)
++ && pedwarn (loc, OPT_Wnarrowing,
++ "narrowing conversion of %qE "
++ "from %qT to %qT inside { }",
++ init, ftype, type)
++ && almost_ok)
+ inform (loc, " the expression has a constant value but is not "
+ "a C++ constant-expression");
+ ok = true;
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/df-problems.c gcc-6-20160721/gcc/df-problems.c
+--- gcc-6.1.0/gcc/df-problems.c 2016-02-23 14:01:51.000000000 +0000
++++ gcc-6-20160721/gcc/df-problems.c 2016-06-29 15:15:25.000000000 +0000
+@@ -3498,13 +3498,13 @@
+
+ FOR_BB_INSNS_REVERSE (bb, insn)
+ {
++ if (!INSN_P (insn))
++ continue;
++
+ df_insn_info *insn_info = DF_INSN_INFO_GET (insn);
+ df_mw_hardreg *mw;
+ int debug_insn;
+
+- if (!INSN_P (insn))
+- continue;
+-
+ debug_insn = DEBUG_INSN_P (insn);
+
+ bitmap_clear (do_not_gen);
+Only in gcc-6.1.0/gcc/doc: aot-compile.1
+Only in gcc-6.1.0/gcc/doc: cpp.1
+Only in gcc-6.1.0/gcc/doc: cpp.info
+Only in gcc-6.1.0/gcc/doc: cppinternals.info
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/doc/extend.texi gcc-6-20160721/gcc/doc/extend.texi
+--- gcc-6.1.0/gcc/doc/extend.texi 2016-04-14 17:35:23.000000000 +0000
++++ gcc-6-20160721/gcc/doc/extend.texi 2016-07-07 19:42:07.000000000 +0000
+@@ -962,8 +962,13 @@
+ would use the following syntax to declare @code{_Complex128} to be a
+ complex @code{__float128} type:
+
++On the PowerPC Linux VSX targets, you can declare complex types using
++the corresponding internal complex type, @code{KCmode} for
++@code{__float128} type and @code{ICmode} for @code{__ibm128} type:
++
+ @smallexample
+-typedef _Complex float __attribute__((mode(KC))) _Complex128;
++typedef _Complex float __attribute__((mode(KC))) _Complex_float128;
++typedef _Complex float __attribute__((mode(IC))) _Complex_ibm128;
+ @end smallexample
+
+ Not all targets support additional floating-point types.
+@@ -13840,6 +13845,40 @@
+ returns the Time Base Register value as an unsigned long, throwing away
+ the most significant word on 32-bit environments.
+
++Additional built-in functions are available for the 64-bit PowerPC
++family of processors, for efficient use of 128-bit floating point
++(@code{__float128}) values.
++
++The following floating-point built-in functions are available with
++@code{-mfloat128} and Altivec support. All of them implement the
++function that is part of the name.
++
++@smallexample
++__float128 __builtin_fabsq (__float128)
++__float128 __builtin_copysignq (__float128, __float128)
++@end smallexample
++
++The following built-in functions are available with @code{-mfloat128}
++and Altivec support.
++
++@table @code
++@item __float128 __builtin_infq (void)
++Similar to @code{__builtin_inf}, except the return type is @code{__float128}.
++@findex __builtin_infq
++
++@item __float128 __builtin_huge_valq (void)
++Similar to @code{__builtin_huge_val}, except the return type is @code{__float128}.
++@findex __builtin_huge_valq
++
++@item __float128 __builtin_nanq (void)
++Similar to @code{__builtin_nan}, except the return type is @code{__float128}.
++@findex __builtin_nanq
++
++@item __float128 __builtin_nansq (void)
++Similar to @code{__builtin_nans}, except the return type is @code{__float128}.
++@findex __builtin_nansq
++@end table
++
+ The following built-in functions are available for the PowerPC family
+ of processors, starting with ISA 2.06 or later (@option{-mcpu=power7}
+ or @option{-mpopcntd}):
+@@ -13863,6 +13902,74 @@
+ 64-bit environment support ISA 2.06 or later.
+
+ The following built-in functions are available for the PowerPC family
++of processors, starting with ISA 3.0 or later (@option{-mcpu=power9}):
++@smallexample
++long long __builtin_darn (void);
++long long __builtin_darn_raw (void);
++int __builtin_darn_32 (void);
++
++int __builtin_dfp_dtstsfi_lt (unsigned int comparison, _Decimal64 value);
++int __builtin_dfp_dtstsfi_lt (unsigned int comparison, _Decimal128 value);
++int __builtin_dfp_dtstsfi_lt_dd (unsigned int comparison, _Decimal64 value);
++int __builtin_dfp_dtstsfi_lt_td (unsigned int comparison, _Decimal128 value);
++
++int __builtin_dfp_dtstsfi_gt (unsigned int comparison, _Decimal64 value);
++int __builtin_dfp_dtstsfi_gt (unsigned int comparison, _Decimal128 value);
++int __builtin_dfp_dtstsfi_gt_dd (unsigned int comparison, _Decimal64 value);
++int __builtin_dfp_dtstsfi_gt_td (unsigned int comparison, _Decimal128 value);
++
++int __builtin_dfp_dtstsfi_eq (unsigned int comparison, _Decimal64 value);
++int __builtin_dfp_dtstsfi_eq (unsigned int comparison, _Decimal128 value);
++int __builtin_dfp_dtstsfi_eq_dd (unsigned int comparison, _Decimal64 value);
++int __builtin_dfp_dtstsfi_eq_td (unsigned int comparison, _Decimal128 value);
++
++int __builtin_dfp_dtstsfi_ov (unsigned int comparison, _Decimal64 value);
++int __builtin_dfp_dtstsfi_ov (unsigned int comparison, _Decimal128 value);
++int __builtin_dfp_dtstsfi_ov_dd (unsigned int comparison, _Decimal64 value);
++int __builtin_dfp_dtstsfi_ov_td (unsigned int comparison, _Decimal128 value);
++@end smallexample
++
++The @code{__builtin_darn} and @code{__builtin_darn_raw}
++functions require a
++64-bit environment supporting ISA 3.0 or later.
++The @code{__builtin_darn} function provides a 64-bit conditioned
++random number. The @code{__builtin_darn_raw} function provides a
++64-bit raw random number. The @code{__builtin_darn_32} function
++provides a 32-bit random number.
++
++The @code{__builtin_dfp_dtstsfi_lt} function returns a non-zero value
++if and only if the number of signficant digits of its @code{value} argument
++is less than its @code{comparison} argument. The
++@code{__builtin_dfp_dtstsfi_lt_dd} and
++@code{__builtin_dfp_dtstsfi_lt_td} functions behave similarly, but
++require that the type of the @code{value} argument be
++@code{__Decimal64} and @code{__Decimal128} respectively.
++
++The @code{__builtin_dfp_dtstsfi_gt} function returns a non-zero value
++if and only if the number of signficant digits of its @code{value} argument
++is greater than its @code{comparison} argument. The
++@code{__builtin_dfp_dtstsfi_gt_dd} and
++@code{__builtin_dfp_dtstsfi_gt_td} functions behave similarly, but
++require that the type of the @code{value} argument be
++@code{__Decimal64} and @code{__Decimal128} respectively.
++
++The @code{__builtin_dfp_dtstsfi_eq} function returns a non-zero value
++if and only if the number of signficant digits of its @code{value} argument
++equals its @code{comparison} argument. The
++@code{__builtin_dfp_dtstsfi_eq_dd} and
++@code{__builtin_dfp_dtstsfi_eq_td} functions behave similarly, but
++require that the type of the @code{value} argument be
++@code{__Decimal64} and @code{__Decimal128} respectively.
++
++The @code{__builtin_dfp_dtstsfi_ov} function returns a non-zero value
++if and only if its @code{value} argument has an undefined number of
++significant digits, such as when @code{value} is an encoding of @code{NaN}.
++The @code{__builtin_dfp_dtstsfi_ov_dd} and
++@code{__builtin_dfp_dtstsfi_ov_td} functions behave similarly, but
++require that the type of the @code{value} argument be
++@code{__Decimal64} and @code{__Decimal128} respectively.
++
++The following built-in functions are available for the PowerPC family
+ of processors when hardware decimal floating point
+ (@option{-mhard-dfp}) is available:
+ @smallexample
+@@ -15932,6 +16039,18 @@
+ void vec_st (vector double, int, double *);
+ vector double vec_sub (vector double, vector double);
+ vector double vec_trunc (vector double);
++vector double vec_xl (int, vector double *);
++vector double vec_xl (int, double *);
++vector long long vec_xl (int, vector long long *);
++vector long long vec_xl (int, long long *);
++vector unsigned long long vec_xl (int, vector unsigned long long *);
++vector unsigned long long vec_xl (int, unsigned long long *);
++vector float vec_xl (int, vector float *);
++vector float vec_xl (int, float *);
++vector int vec_xl (int, vector int *);
++vector int vec_xl (int, int *);
++vector unsigned int vec_xl (int, vector unsigned int *);
++vector unsigned int vec_xl (int, unsigned int *);
+ vector double vec_xor (vector double, vector double);
+ vector double vec_xor (vector double, vector bool long);
+ vector double vec_xor (vector bool long, vector double);
+@@ -15941,6 +16060,18 @@
+ vector unsigned long vec_xor (vector unsigned long, vector unsigned long);
+ vector unsigned long vec_xor (vector unsigned long, vector bool long);
+ vector unsigned long vec_xor (vector bool long, vector unsigned long);
++void vec_xst (vector double, int, vector double *);
++void vec_xst (vector double, int, double *);
++void vec_xst (vector long long, int, vector long long *);
++void vec_xst (vector long long, int, long long *);
++void vec_xst (vector unsigned long long, int, vector unsigned long long *);
++void vec_xst (vector unsigned long long, int, unsigned long long *);
++void vec_xst (vector float, int, vector float *);
++void vec_xst (vector float, int, float *);
++void vec_xst (vector int, int, vector int *);
++void vec_xst (vector int, int, int *);
++void vec_xst (vector unsigned int, int, vector unsigned int *);
++void vec_xst (vector unsigned int, int, unsigned int *);
+ int vec_all_eq (vector double, vector double);
+ int vec_all_ge (vector double, vector double);
+ int vec_all_gt (vector double, vector double);
+@@ -16055,7 +16186,7 @@
+ @samp{LXVW4X}, @samp{STXVD2X}, and @samp{STXVW4X} instructions.
+
+ If the ISA 2.07 additions to the vector/scalar (power8-vector)
+-instruction set is available, the following additional functions are
++instruction set are available, the following additional functions are
+ available for both 32-bit and 64-bit targets. For 64-bit targets, you
+ can use @var{vector long} instead of @var{vector long long},
+ @var{vector bool long} instead of @var{vector bool long long}, and
+@@ -16368,7 +16499,7 @@
+ @end smallexample
+
+ If the ISA 2.07 additions to the vector/scalar (power8-vector)
+-instruction set is available, the following additional functions are
++instruction set are available, the following additional functions are
+ available for 64-bit targets. New vector types
+ (@var{vector __int128_t} and @var{vector __uint128_t}) are available
+ to hold the @var{__int128_t} and @var{__uint128_t} types to use these
+@@ -16423,6 +16554,115 @@
+ int __builtin_bcdsub_ov (vector __int128_t, vector__int128_t);
+ @end smallexample
+
++If the ISA 3.00 additions to the vector/scalar (power9-vector)
++instruction set are available:
++
++@smallexample
++vector long long vec_vctz (vector long long);
++vector unsigned long long vec_vctz (vector unsigned long long);
++vector int vec_vctz (vector int);
++vector unsigned int vec_vctz (vector int);
++vector short vec_vctz (vector short);
++vector unsigned short vec_vctz (vector unsigned short);
++vector signed char vec_vctz (vector signed char);
++vector unsigned char vec_vctz (vector unsigned char);
++
++vector signed char vec_vctzb (vector signed char);
++vector unsigned char vec_vctzb (vector unsigned char);
++
++vector long long vec_vctzd (vector long long);
++vector unsigned long long vec_vctzd (vector unsigned long long);
++
++vector short vec_vctzh (vector short);
++vector unsigned short vec_vctzh (vector unsigned short);
++
++vector int vec_vctzw (vector int);
++vector unsigned int vec_vctzw (vector int);
++
++vector int vec_vprtyb (vector int);
++vector unsigned int vec_vprtyb (vector unsigned int);
++vector long long vec_vprtyb (vector long long);
++vector unsigned long long vec_vprtyb (vector unsigned long long);
++
++vector int vec_vprtybw (vector int);
++vector unsigned int vec_vprtybw (vector unsigned int);
++
++vector long long vec_vprtybd (vector long long);
++vector unsigned long long vec_vprtybd (vector unsigned long long);
++@end smallexample
++
++
++If the ISA 3.00 additions to the vector/scalar (power9-vector)
++instruction set are available for 64-bit targets:
++
++@smallexample
++vector long vec_vprtyb (vector long);
++vector unsigned long vec_vprtyb (vector unsigned long);
++vector __int128_t vec_vprtyb (vector __int128_t);
++vector __uint128_t vec_vprtyb (vector __uint128_t);
++
++vector long vec_vprtybd (vector long);
++vector unsigned long vec_vprtybd (vector unsigned long);
++
++vector __int128_t vec_vprtybq (vector __int128_t);
++vector __uint128_t vec_vprtybd (vector __uint128_t);
++@end smallexample
++
++The following built-in vector functions are available for the PowerPC family
++of processors, starting with ISA 3.0 or later (@option{-mcpu=power9})
++or with @option{-mpower9-vector}:
++
++@smallexample
++__vector unsigned char
++vec_absd (__vector unsigned char arg1, __vector unsigned char arg2);
++__vector unsigned short
++vec_absd (__vector unsigned short arg1, __vector unsigned short arg2);
++__vector unsigned int
++vec_absd (__vector unsigned int arg1, __vector unsigned int arg2);
++
++__vector unsigned char
++vec_absdb (__vector unsigned char arg1, __vector unsigned char arg2);
++__vector unsigned short
++vec_absdh (__vector unsigned short arg1, __vector unsigned short arg2);
++__vector unsigned int
++vec_absdw (__vector unsigned int arg1, __vector unsigned int arg2);
++
++__vector unsigned char
++vec_slv (__vector unsigned char src, __vector unsigned char shift_distance);
++__vector unsigned char
++vec_srv (__vector unsigned char src, __vector unsigned char shift_distance);
++@end smallexample
++
++The @code{vec_absd}, @code{vec_absdb}, @code{vec_absdh}, and
++@code{vec_absdw} built-in functions each computes the absolute
++differences of the pairs of vector elements supplied in its two vector
++arguments, placing the absolute differences into the corresponding
++elements of the vector result.
++
++The @code{vec_slv} and @code{vec_srv} functions operate on
++all of the bytes of their @code{src} and @code{shift_distance}
++arguments in parallel. The behavior of the @code{vec_slv} is as if
++there existed a temporary array of 17 unsigned characters
++@code{slv_array} within which elements 0 through 15 are the same as
++the entries in the @code{src} array and element 16 equals 0. The
++result returned from the @code{vec_slv} function is a
++@code{__vector} of 16 unsigned characters within which element
++@code{i} is computed using the C expression
++@code{0xff & (*((unsigned short *)(slv_array + i)) << (0x07 &
++shift_distance[i]))},
++with this resulting value coerced to the @code{unsigned char} type.
++The behavior of the @code{vec_srv} is as if
++there existed a temporary array of 17 unsigned characters
++@code{srv_array} within which element 0 equals zero and
++elements 1 through 16 equal the elements 0 through 15 of
++the @code{src} array. The
++result returned from the @code{vec_srv} function is a
++@code{__vector} of 16 unsigned characters within which element
++@code{i} is computed using the C expression
++@code{0xff & (*((unsigned short *)(srv_array + i)) >>
++(0x07 & shift_distance[i]))},
++with this resulting value coerced to the @code{unsigned char} type.
++
+ If the cryptographic instructions are enabled (@option{-mcrypto} or
+ @option{-mcpu=power8}), the following builtins are enabled.
+
+@@ -16483,6 +16723,28 @@
+ integer that is 0 or 1. The third argument to these builtin functions
+ must be a constant integer in the range of 0 to 15.
+
++If the ISA 3.00 additions to the vector/scalar (power9-vector)
++instruction set are available, the following additional functions are
++available for both 32-bit and 64-bit targets.
++
++vector short vec_xl (int, vector short *);
++vector short vec_xl (int, short *);
++vector unsigned short vec_xl (int, vector unsigned short *);
++vector unsigned short vec_xl (int, unsigned short *);
++vector char vec_xl (int, vector char *);
++vector char vec_xl (int, char *);
++vector unsigned char vec_xl (int, vector unsigned char *);
++vector unsigned char vec_xl (int, unsigned char *);
++
++void vec_xst (vector short, int, vector short *);
++void vec_xst (vector short, int, short *);
++void vec_xst (vector unsigned short, int, vector unsigned short *);
++void vec_xst (vector unsigned short, int, unsigned short *);
++void vec_xst (vector char, int, vector char *);
++void vec_xst (vector char, int, char *);
++void vec_xst (vector unsigned char, int, vector unsigned char *);
++void vec_xst (vector unsigned char, int, unsigned char *);
++
+ @node PowerPC Hardware Transactional Memory Built-in Functions
+ @subsection PowerPC Hardware Transactional Memory Built-in Functions
+ GCC provides two interfaces for accessing the Hardware Transactional
+@@ -17116,6 +17378,45 @@
+ int64_t __builtin_vis_xmulxhi (int64_t, int64_t);
+ @end smallexample
+
++When you use the @option{-mvis4} switch, the VIS version 4.0 built-in
++functions also become available:
++
++@smallexample
++v8qi __builtin_vis_fpadd8 (v8qi, v8qi);
++v8qi __builtin_vis_fpadds8 (v8qi, v8qi);
++v8qi __builtin_vis_fpaddus8 (v8qi, v8qi);
++v4hi __builtin_vis_fpaddus16 (v4hi, v4hi);
++
++v8qi __builtin_vis_fpsub8 (v8qi, v8qi);
++v8qi __builtin_vis_fpsubs8 (v8qi, v8qi);
++v8qi __builtin_vis_fpsubus8 (v8qi, v8qi);
++v4hi __builtin_vis_fpsubus16 (v4hi, v4hi);
++
++long __builtin_vis_fpcmple8 (v8qi, v8qi);
++long __builtin_vis_fpcmpgt8 (v8qi, v8qi);
++long __builtin_vis_fpcmpule16 (v4hi, v4hi);
++long __builtin_vis_fpcmpugt16 (v4hi, v4hi);
++long __builtin_vis_fpcmpule32 (v2si, v2si);
++long __builtin_vis_fpcmpugt32 (v2si, v2si);
++
++v8qi __builtin_vis_fpmax8 (v8qi, v8qi);
++v4hi __builtin_vis_fpmax16 (v4hi, v4hi);
++v2si __builtin_vis_fpmax32 (v2si, v2si);
++
++v8qi __builtin_vis_fpmaxu8 (v8qi, v8qi);
++v4hi __builtin_vis_fpmaxu16 (v4hi, v4hi);
++v2si __builtin_vis_fpmaxu32 (v2si, v2si);
++
++
++v8qi __builtin_vis_fpmin8 (v8qi, v8qi);
++v4hi __builtin_vis_fpmin16 (v4hi, v4hi);
++v2si __builtin_vis_fpmin32 (v2si, v2si);
++
++v8qi __builtin_vis_fpminu8 (v8qi, v8qi);
++v4hi __builtin_vis_fpminu16 (v4hi, v4hi);
++v2si __builtin_vis_fpminu32 (v2si, v2si);
++@end smallexample
++
+ @node SPU Built-in Functions
+ @subsection SPU Built-in Functions
+
+Only in gcc-6.1.0/gcc/doc: fsf-funding.7
+Only in gcc-6.1.0/gcc/doc: g++.1
+Only in gcc-6.1.0/gcc/doc: gc-analyze.1
+Only in gcc-6.1.0/gcc/doc: gcc.1
+Only in gcc-6.1.0/gcc/doc: gcc.info
+Only in gcc-6.1.0/gcc/doc: gccinstall.info
+Only in gcc-6.1.0/gcc/doc: gccint.info
+Only in gcc-6.1.0/gcc/doc: gcj-dbtool.1
+Only in gcc-6.1.0/gcc/doc: gcj.1
+Only in gcc-6.1.0/gcc/doc: gcj.info
+Only in gcc-6.1.0/gcc/doc: gcov-tool.1
+Only in gcc-6.1.0/gcc/doc: gcov.1
+Only in gcc-6.1.0/gcc/doc: gfdl.7
+Only in gcc-6.1.0/gcc/doc: gfortran.1
+Only in gcc-6.1.0/gcc/doc: gij.1
+Only in gcc-6.1.0/gcc/doc: gpl.7
+Only in gcc-6.1.0/gcc/doc: grmic.1
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/doc/install.texi gcc-6-20160721/gcc/doc/install.texi
+--- gcc-6.1.0/gcc/doc/install.texi 2016-04-18 18:42:41.000000000 +0000
++++ gcc-6-20160721/gcc/doc/install.texi 2016-06-08 13:34:25.000000000 +0000
+@@ -1241,7 +1241,7 @@
+ PowerPC, and SPARC@. It is mandatory for ARC@. The @option{--with-cpu-32} and
+ @option{--with-cpu-64} options specify separate default CPUs for
+ 32-bit and 64-bit modes; these options are only supported for i386,
+-x86-64 and PowerPC.
++x86-64, PowerPC, and SPARC@.
+
+ @item --with-schedule=@var{cpu}
+ @itemx --with-arch=@var{cpu}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/doc/invoke.texi gcc-6-20160721/gcc/doc/invoke.texi
+--- gcc-6.1.0/gcc/doc/invoke.texi 2016-04-22 13:17:26.000000000 +0000
++++ gcc-6-20160721/gcc/doc/invoke.texi 2016-07-08 14:51:44.000000000 +0000
+@@ -996,14 +996,15 @@
+ -mpointers-to-nested-functions -mno-pointers-to-nested-functions @gol
+ -msave-toc-indirect -mno-save-toc-indirect @gol
+ -mpower8-fusion -mno-mpower8-fusion -mpower8-vector -mno-power8-vector @gol
+--mcrypto -mno-crypto -mdirect-move -mno-direct-move @gol
++-mcrypto -mno-crypto -mhtm -mno-htm -mdirect-move -mno-direct-move @gol
+ -mquad-memory -mno-quad-memory @gol
+ -mquad-memory-atomic -mno-quad-memory-atomic @gol
+ -mcompat-align-parm -mno-compat-align-parm @gol
+ -mupper-regs-df -mno-upper-regs-df -mupper-regs-sf -mno-upper-regs-sf @gol
+ -mupper-regs -mno-upper-regs -mmodulo -mno-modulo @gol
+ -mfloat128 -mno-float128 -mfloat128-hardware -mno-float128-hardware @gol
+--mpower9-fusion -mno-mpower9-fusion -mpower9-vector -mno-power9-vector}
++-mpower9-fusion -mno-mpower9-fusion -mpower9-vector -mno-power9-vector @gol
++-mpower9-dform -mno-power9-dform -mlra -mno-lra}
+
+ @emph{RX Options}
+ @gccoptlist{-m64bit-doubles -m32bit-doubles -fpu -nofpu@gol
+@@ -13669,7 +13670,6 @@
+ optimizers then assume that indexed stores exist, which is not
+ the case.
+
+-@item -mlra
+ @opindex mlra
+ Enable Local Register Allocation. This is still experimental for ARC,
+ so by default the compiler uses standard reload
+@@ -19879,9 +19879,9 @@
+ -mpopcntb -mpopcntd -mpowerpc64 @gol
+ -mpowerpc-gpopt -mpowerpc-gfxopt -msingle-float -mdouble-float @gol
+ -msimple-fpu -mstring -mmulhw -mdlmzb -mmfpgpr -mvsx @gol
+--mcrypto -mdirect-move -mpower8-fusion -mpower8-vector @gol
++-mcrypto -mdirect-move -mhtm -mpower8-fusion -mpower8-vector @gol
+ -mquad-memory -mquad-memory-atomic -mmodulo -mfloat128 -mfloat128-hardware @gol
+--mpower9-fusion -mpower9-vector}
++-mpower9-fusion -mpower9-vector -mpower9-dform}
+
+ The particular options set for any particular CPU varies between
+ compiler versions, depending on what setting seems to produce optimal
+@@ -20005,6 +20005,12 @@
+ This switch has been deprecated. Use @option{-misel} and
+ @option{-mno-isel} instead.
+
++@item -mlra
++@opindex mlra
++Enable Local Register Allocation. This is still experimental for PowerPC,
++so by default the compiler uses standard reload
++(i.e. @option{-mno-lra}).
++
+ @item -mspe
+ @itemx -mno-spe
+ @opindex mspe
+@@ -20047,6 +20053,14 @@
+ between the general purpose registers and the vector/scalar (VSX)
+ registers that were added in version 2.07 of the PowerPC ISA.
+
++@item -mhtm
++@itemx -mno-htm
++@opindex mhtm
++@opindex mno-htm
++Enable (disable) the use of the built-in functions that allow direct
++access to the Hardware Transactional Memory (HTM) instructions that
++were added in version 2.07 of the PowerPC ISA.
++
+ @item -mpower8-fusion
+ @itemx -mno-power8-fusion
+ @opindex mpower8-fusion
+@@ -20123,9 +20137,14 @@
+
+ The VSX instruction set (@option{-mvsx}, @option{-mcpu=power7}, or
+ @option{-mcpu=power8}) must be enabled to use the @option{-mfloat128}
+-option. The @code{-mfloat128} option only works on PowerPC 64-bit
++option. The @option{-mfloat128} option only works on PowerPC 64-bit
+ Linux systems.
+
++If you use the ISA 3.0 instruction set (@option{-mcpu=power9}), the
++@option{-mfloat128} option will also enable the generation of ISA 3.0
++IEEE 128-bit floating point instructions. Otherwise, IEEE 128-bit
++floating point will be done with software emulation.
++
+ @item -mfloat128-hardware
+ @itemx -mno-float128-hardware
+ @opindex mfloat128-hardware
+@@ -20133,6 +20152,13 @@
+ Enable/disable using ISA 3.0 hardware instructions to support the
+ @var{__float128} data type.
+
++If you use @option{-mfloat128-hardware}, it will enable the option
++@option{-mfloat128} as well.
++
++If you select ISA 3.0 instructions with @option{-mcpu=power9}, but do
++not use either @option{-mfloat128} or @option{-mfloat128-hardware},
++the IEEE 128-bit floating point support will not be enabled.
++
+ @item -mmodulo
+ @itemx -mno-modulo
+ @opindex mmodulo
+@@ -20154,10 +20180,19 @@
+ @opindex mpower9-vector
+ @opindex mno-power9-vector
+ Generate code that uses (does not use) the vector and scalar
+-instructions that were added in version 2.07 of the PowerPC ISA. Also
++instructions that were added in version 3.0 of the PowerPC ISA. Also
+ enable the use of built-in functions that allow more direct access to
+ the vector instructions.
+
++@item -mpower9-dform
++@itemx -mno-power9-dform
++@opindex mpower9-dform
++@opindex mno-power9-dform
++Enable (disable) scalar d-form (register + offset) memory instructions
++to load/store traditional Altivec registers. If the @var{LRA} register
++allocator is enabled, also enable (disable) vector d-form memory
++instructions.
++
+ @item -mfloat-gprs=@var{yes/single/double/no}
+ @itemx -mfloat-gprs
+ @opindex mfloat-gprs
+@@ -22070,7 +22105,7 @@
+ @samp{leon}, @samp{leon3}, @samp{leon3v7}, @samp{sparclite}, @samp{f930},
+ @samp{f934}, @samp{sparclite86x}, @samp{sparclet}, @samp{tsc701}, @samp{v9},
+ @samp{ultrasparc}, @samp{ultrasparc3}, @samp{niagara}, @samp{niagara2},
+-@samp{niagara3} and @samp{niagara4}.
++@samp{niagara3}, @samp{niagara4} and @samp{niagara7}.
+
+ Native Solaris and GNU/Linux toolchains also support the value @samp{native},
+ which selects the best architecture option for the host processor.
+@@ -22098,7 +22133,7 @@
+ tsc701
+
+ @item v9
+-ultrasparc, ultrasparc3, niagara, niagara2, niagara3, niagara4
++ultrasparc, ultrasparc3, niagara, niagara2, niagara3, niagara4, niagara7
+ @end table
+
+ By default (unless configured otherwise), GCC generates code for the V7
+@@ -22140,7 +22175,9 @@
+ additionally optimizes it for Sun UltraSPARC T2 chips. With
+ @option{-mcpu=niagara3}, the compiler additionally optimizes it for Sun
+ UltraSPARC T3 chips. With @option{-mcpu=niagara4}, the compiler
+-additionally optimizes it for Sun UltraSPARC T4 chips.
++additionally optimizes it for Sun UltraSPARC T4 chips. With
++@option{-mcpu=niagara7}, the compiler additionally optimizes it for
++Oracle SPARC M7 chips.
+
+ @item -mtune=@var{cpu_type}
+ @opindex mtune
+@@ -22150,12 +22187,13 @@
+
+ The same values for @option{-mcpu=@var{cpu_type}} can be used for
+ @option{-mtune=@var{cpu_type}}, but the only useful values are those
+-that select a particular CPU implementation. Those are @samp{cypress},
+-@samp{supersparc}, @samp{hypersparc}, @samp{leon}, @samp{leon3},
+-@samp{leon3v7}, @samp{f930}, @samp{f934}, @samp{sparclite86x}, @samp{tsc701},
+-@samp{ultrasparc}, @samp{ultrasparc3}, @samp{niagara}, @samp{niagara2},
+-@samp{niagara3} and @samp{niagara4}. With native Solaris and GNU/Linux
+-toolchains, @samp{native} can also be used.
++that select a particular CPU implementation. Those are
++@samp{cypress}, @samp{supersparc}, @samp{hypersparc}, @samp{leon},
++@samp{leon3}, @samp{leon3v7}, @samp{f930}, @samp{f934},
++@samp{sparclite86x}, @samp{tsc701}, @samp{ultrasparc},
++@samp{ultrasparc3}, @samp{niagara}, @samp{niagara2}, @samp{niagara3},
++@samp{niagara4} and @samp{niagara7}. With native Solaris and
++GNU/Linux toolchains, @samp{native} can also be used.
+
+ @item -mv8plus
+ @itemx -mno-v8plus
+@@ -22193,6 +22231,16 @@
+ instructions, such as niagara-3 and later. Setting @option{-mvis3}
+ also sets @option{-mvis2} and @option{-mvis}.
+
++@item -mvis4
++@itemx -mno-vis4
++@opindex mvis4
++@opindex mno-vis4
++With @option{-mvis4}, GCC generates code that takes advantage of
++version 4.0 of the UltraSPARC Visual Instruction Set extensions. The
++default is @option{-mvis4} when targeting a cpu that supports such
++instructions, such as niagara-7 and later. Setting @option{-mvis4}
++also sets @option{-mvis3}, @option{-mvis2} and @option{-mvis}.
++
+ @item -mcbcond
+ @itemx -mno-cbcond
+ @opindex mcbcond
+Only in gcc-6.1.0/gcc/doc: jcf-dump.1
+Only in gcc-6.1.0/gcc/doc: jv-convert.1
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/doc/md.texi gcc-6-20160721/gcc/doc/md.texi
+--- gcc-6.1.0/gcc/doc/md.texi 2016-02-22 21:27:08.000000000 +0000
++++ gcc-6-20160721/gcc/doc/md.texi 2016-06-09 23:28:23.000000000 +0000
+@@ -3214,6 +3214,9 @@
+ @item wD
+ Int constant that is the element number of the 64-bit scalar in a vector.
+
++@item wE
++Vector constant that can be loaded with the XXSPLTIB instruction.
++
+ @item wF
+ Memory operand suitable for power9 fusion load/stores.
+
+@@ -3221,13 +3224,22 @@
+ Memory operand suitable for TOC fusion memory references.
+
+ @item wL
+-Int constant that is the element number that the MFVSRLD instruction
++Int constant that is the element number that the MFVSRLD instruction.
+ targets.
+
++@item wM
++Match vector constant with all 1's if the XXLORC instruction is available.
++
++@item wO
++A memory operand suitable for the ISA 3.0 vector d-form instructions.
++
+ @item wQ
+ A memory address that will work with the @code{lq} and @code{stq}
+ instructions.
+
++@item wS
++Vector constant that can be loaded with XXSPLTIB & sign extension.
++
+ @item h
+ @samp{MQ}, @samp{CTR}, or @samp{LINK} register
+
+Only in gcc-6.1.0/gcc/doc: rebuild-gcj-db.1
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/dwarf2out.c gcc-6-20160721/gcc/dwarf2out.c
+--- gcc-6.1.0/gcc/dwarf2out.c 2016-03-17 13:43:01.000000000 +0000
++++ gcc-6-20160721/gcc/dwarf2out.c 2016-07-19 19:31:24.000000000 +0000
+@@ -15573,7 +15573,7 @@
+
+ if (stack_usage == NULL)
+ return false;
+- frame_offset += *stack_usage;
++ frame_offset_ += *stack_usage;
+ break;
+ }
+
+@@ -17805,7 +17805,7 @@
+ fieldsize = tree_to_shwi (DECL_SIZE_UNIT (field));
+ pos = int_byte_position (field);
+ gcc_assert (pos + fieldsize <= size);
+- if (val
++ if (val && fieldsize != 0
+ && !native_encode_initializer (val, array + pos, fieldsize))
+ return false;
+ }
+@@ -19401,11 +19401,13 @@
+ static void
+ retry_incomplete_types (void)
+ {
++ set_early_dwarf s;
+ int i;
+
+ for (i = vec_safe_length (incomplete_types) - 1; i >= 0; i--)
+ if (should_emit_struct_debug ((*incomplete_types)[i], DINFO_USAGE_DIR_USE))
+ gen_type_die ((*incomplete_types)[i], comp_unit_die ());
++ vec_safe_truncate (incomplete_types, 0);
+ }
+
+ /* Determine what tag to use for a record type. */
+@@ -20724,14 +20726,17 @@
+ void_type_node 2) an unprototyped function declaration (not a
+ definition). This just means that we have no info about the
+ parameters at all. */
+- if (prototype_p (TREE_TYPE (decl)))
++ if (early_dwarf)
+ {
+- /* This is the prototyped case, check for.... */
+- if (stdarg_p (TREE_TYPE (decl)))
++ if (prototype_p (TREE_TYPE (decl)))
++ {
++ /* This is the prototyped case, check for.... */
++ if (stdarg_p (TREE_TYPE (decl)))
++ gen_unspecified_parameters_die (decl, subr_die);
++ }
++ else if (DECL_INITIAL (decl) == NULL_TREE)
+ gen_unspecified_parameters_die (decl, subr_die);
+ }
+- else if (DECL_INITIAL (decl) == NULL_TREE)
+- gen_unspecified_parameters_die (decl, subr_die);
+ }
+
+ if (subr_die != old_die)
+@@ -27382,10 +27387,6 @@
+ resolve_addr (comp_unit_die ());
+ move_marked_base_types ();
+
+- /* Walk through the list of incomplete types again, trying once more to
+- emit full debugging info for them. */
+- retry_incomplete_types ();
+-
+ if (flag_eliminate_unused_debug_types)
+ prune_unused_types ();
+
+@@ -27686,6 +27687,10 @@
+ static void
+ dwarf2out_early_finish (void)
+ {
++ /* Walk through the list of incomplete types again, trying once more to
++ emit full debugging info for them. */
++ retry_incomplete_types ();
++
+ /* The point here is to flush out the limbo list so that it is empty
+ and we don't need to stream it for LTO. */
+ flush_limbo_die_list ();
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/fold-const.c gcc-6-20160721/gcc/fold-const.c
+--- gcc-6.1.0/gcc/fold-const.c 2016-04-21 11:57:28.000000000 +0000
++++ gcc-6-20160721/gcc/fold-const.c 2016-07-08 20:20:23.000000000 +0000
+@@ -117,14 +117,8 @@
+ static int operand_equal_for_comparison_p (tree, tree, tree);
+ static int twoval_comparison_p (tree, tree *, tree *, int *);
+ static tree eval_subst (location_t, tree, tree, tree, tree, tree);
+-static tree make_bit_field_ref (location_t, tree, tree,
+- HOST_WIDE_INT, HOST_WIDE_INT, int, int);
+ static tree optimize_bit_field_compare (location_t, enum tree_code,
+ tree, tree, tree);
+-static tree decode_field_reference (location_t, tree, HOST_WIDE_INT *,
+- HOST_WIDE_INT *,
+- machine_mode *, int *, int *, int *,
+- tree *, tree *);
+ static int simple_operand_p (const_tree);
+ static bool simple_operand_p_2 (tree);
+ static tree range_binop (enum tree_code, tree, tree, int, tree, int);
+@@ -836,11 +830,10 @@
+ *minus_litp = *litp, *litp = 0;
+ if (neg_conp_p)
+ *conp = negate_expr (*conp);
+- if (neg_var_p)
++ if (neg_var_p && var)
+ {
+- /* Convert to TYPE before negating a pointer type expr. */
+- if (var && POINTER_TYPE_P (TREE_TYPE (var)))
+- var = fold_convert_loc (loc, type, var);
++ /* Convert to TYPE before negating. */
++ var = fold_convert_loc (loc, type, var);
+ var = negate_expr (var);
+ }
+ }
+@@ -863,10 +856,12 @@
+ else if (*minus_litp)
+ *litp = *minus_litp, *minus_litp = 0;
+ *conp = negate_expr (*conp);
+- /* Convert to TYPE before negating a pointer type expr. */
+- if (var && POINTER_TYPE_P (TREE_TYPE (var)))
+- var = fold_convert_loc (loc, type, var);
+- var = negate_expr (var);
++ if (var)
++ {
++ /* Convert to TYPE before negating. */
++ var = fold_convert_loc (loc, type, var);
++ var = negate_expr (var);
++ }
+ }
+
+ return var;
+@@ -2199,7 +2194,6 @@
+
+ case REAL_TYPE:
+ case FIXED_POINT_TYPE:
+- case COMPLEX_TYPE:
+ case VECTOR_TYPE:
+ case VOID_TYPE:
+ return TREE_CODE (type) == TREE_CODE (orig);
+@@ -3781,15 +3775,23 @@
+
+ /* Return a BIT_FIELD_REF of type TYPE to refer to BITSIZE bits of INNER
+ starting at BITPOS. The field is unsigned if UNSIGNEDP is nonzero
+- and uses reverse storage order if REVERSEP is nonzero. */
++ and uses reverse storage order if REVERSEP is nonzero. ORIG_INNER
++ is the original memory reference used to preserve the alias set of
++ the access. */
+
+ static tree
+-make_bit_field_ref (location_t loc, tree inner, tree type,
++make_bit_field_ref (location_t loc, tree inner, tree orig_inner, tree type,
+ HOST_WIDE_INT bitsize, HOST_WIDE_INT bitpos,
+ int unsignedp, int reversep)
+ {
+ tree result, bftype;
+
++ if (get_alias_set (inner) != get_alias_set (orig_inner))
++ inner = fold_build2 (MEM_REF, TREE_TYPE (inner),
++ build_fold_addr_expr (inner),
++ build_int_cst
++ (reference_alias_ptr_type (orig_inner), 0));
++
+ if (bitpos == 0 && !reversep)
+ {
+ tree size = TYPE_SIZE (TREE_TYPE (inner));
+@@ -3915,13 +3917,13 @@
+ and return. */
+ return fold_build2_loc (loc, code, compare_type,
+ fold_build2_loc (loc, BIT_AND_EXPR, unsigned_type,
+- make_bit_field_ref (loc, linner,
++ make_bit_field_ref (loc, linner, lhs,
+ unsigned_type,
+ nbitsize, nbitpos,
+ 1, lreversep),
+ mask),
+ fold_build2_loc (loc, BIT_AND_EXPR, unsigned_type,
+- make_bit_field_ref (loc, rinner,
++ make_bit_field_ref (loc, rinner, rhs,
+ unsigned_type,
+ nbitsize, nbitpos,
+ 1, rreversep),
+@@ -3966,8 +3968,8 @@
+ /* Make a new bitfield reference, shift the constant over the
+ appropriate number of bits and mask it with the computed mask
+ (in case this was a signed field). If we changed it, make a new one. */
+- lhs = make_bit_field_ref (loc, linner, unsigned_type, nbitsize, nbitpos, 1,
+- lreversep);
++ lhs = make_bit_field_ref (loc, linner, lhs, unsigned_type,
++ nbitsize, nbitpos, 1, lreversep);
+
+ rhs = const_binop (BIT_AND_EXPR,
+ const_binop (LSHIFT_EXPR,
+@@ -4006,11 +4008,12 @@
+ do anything with. */
+
+ static tree
+-decode_field_reference (location_t loc, tree exp, HOST_WIDE_INT *pbitsize,
++decode_field_reference (location_t loc, tree *exp_, HOST_WIDE_INT *pbitsize,
+ HOST_WIDE_INT *pbitpos, machine_mode *pmode,
+ int *punsignedp, int *preversep, int *pvolatilep,
+ tree *pmask, tree *pand_mask)
+ {
++ tree exp = *exp_;
+ tree outer_type = 0;
+ tree and_mask = 0;
+ tree mask, inner, offset;
+@@ -4047,6 +4050,8 @@
+ || TREE_CODE (inner) == PLACEHOLDER_EXPR)
+ return 0;
+
++ *exp_ = exp;
++
+ /* If the number of bits in the reference is the same as the bitsize of
+ the outer type, then the outer type gives the signedness. Otherwise
+ (in case of a small bitfield) the signedness is unchanged. */
+@@ -5655,19 +5660,19 @@
+
+ ll_reversep = lr_reversep = rl_reversep = rr_reversep = 0;
+ volatilep = 0;
+- ll_inner = decode_field_reference (loc, ll_arg,
++ ll_inner = decode_field_reference (loc, &ll_arg,
+ &ll_bitsize, &ll_bitpos, &ll_mode,
+ &ll_unsignedp, &ll_reversep, &volatilep,
+ &ll_mask, &ll_and_mask);
+- lr_inner = decode_field_reference (loc, lr_arg,
++ lr_inner = decode_field_reference (loc, &lr_arg,
+ &lr_bitsize, &lr_bitpos, &lr_mode,
+ &lr_unsignedp, &lr_reversep, &volatilep,
+ &lr_mask, &lr_and_mask);
+- rl_inner = decode_field_reference (loc, rl_arg,
++ rl_inner = decode_field_reference (loc, &rl_arg,
+ &rl_bitsize, &rl_bitpos, &rl_mode,
+ &rl_unsignedp, &rl_reversep, &volatilep,
+ &rl_mask, &rl_and_mask);
+- rr_inner = decode_field_reference (loc, rr_arg,
++ rr_inner = decode_field_reference (loc, &rr_arg,
+ &rr_bitsize, &rr_bitpos, &rr_mode,
+ &rr_unsignedp, &rr_reversep, &volatilep,
+ &rr_mask, &rr_and_mask);
+@@ -5829,12 +5834,14 @@
+ lr_mask = const_binop (BIT_IOR_EXPR, lr_mask, rr_mask);
+ if (lnbitsize == rnbitsize && xll_bitpos == xlr_bitpos)
+ {
+- lhs = make_bit_field_ref (loc, ll_inner, lntype, lnbitsize, lnbitpos,
++ lhs = make_bit_field_ref (loc, ll_inner, ll_arg,
++ lntype, lnbitsize, lnbitpos,
+ ll_unsignedp || rl_unsignedp, ll_reversep);
+ if (! all_ones_mask_p (ll_mask, lnbitsize))
+ lhs = build2 (BIT_AND_EXPR, lntype, lhs, ll_mask);
+
+- rhs = make_bit_field_ref (loc, lr_inner, rntype, rnbitsize, rnbitpos,
++ rhs = make_bit_field_ref (loc, lr_inner, lr_arg,
++ rntype, rnbitsize, rnbitpos,
+ lr_unsignedp || rr_unsignedp, lr_reversep);
+ if (! all_ones_mask_p (lr_mask, rnbitsize))
+ rhs = build2 (BIT_AND_EXPR, rntype, rhs, lr_mask);
+@@ -5856,11 +5863,11 @@
+ {
+ tree type;
+
+- lhs = make_bit_field_ref (loc, ll_inner, lntype,
++ lhs = make_bit_field_ref (loc, ll_inner, ll_arg, lntype,
+ ll_bitsize + rl_bitsize,
+ MIN (ll_bitpos, rl_bitpos),
+ ll_unsignedp, ll_reversep);
+- rhs = make_bit_field_ref (loc, lr_inner, rntype,
++ rhs = make_bit_field_ref (loc, lr_inner, lr_arg, rntype,
+ lr_bitsize + rr_bitsize,
+ MIN (lr_bitpos, rr_bitpos),
+ lr_unsignedp, lr_reversep);
+@@ -5925,7 +5932,8 @@
+ reference we will make. Unless the mask is all ones the width of
+ that field, perform the mask operation. Then compare with the
+ merged constant. */
+- result = make_bit_field_ref (loc, ll_inner, lntype, lnbitsize, lnbitpos,
++ result = make_bit_field_ref (loc, ll_inner, ll_arg,
++ lntype, lnbitsize, lnbitpos,
+ ll_unsignedp || rl_unsignedp, ll_reversep);
+
+ ll_mask = const_binop (BIT_IOR_EXPR, ll_mask, rl_mask);
+@@ -7934,6 +7942,8 @@
+ case VIEW_CONVERT_EXPR:
+ if (TREE_CODE (op0) == MEM_REF)
+ {
++ if (TYPE_ALIGN (TREE_TYPE (op0)) != TYPE_ALIGN (type))
++ type = build_aligned_type (type, TYPE_ALIGN (TREE_TYPE (op0)));
+ tem = fold_build2_loc (loc, MEM_REF, type,
+ TREE_OPERAND (op0, 0), TREE_OPERAND (op0, 1));
+ REF_REVERSE_STORAGE_ORDER (tem) = REF_REVERSE_STORAGE_ORDER (op0);
+@@ -8566,9 +8576,9 @@
+ if ((offset0 == offset1
+ || (offset0 && offset1
+ && operand_equal_p (offset0, offset1, 0)))
+- && (code == EQ_EXPR
+- || code == NE_EXPR
+- || (indirect_base0 && DECL_P (base0))
++ && (equality_code
++ || (indirect_base0
++ && (DECL_P (base0) || CONSTANT_CLASS_P (base0)))
+ || POINTER_TYPE_OVERFLOW_UNDEFINED))
+
+ {
+@@ -8607,7 +8617,8 @@
+ 6.5.6/8 and /9 with respect to the signed ptrdiff_t. */
+ else if (bitpos0 == bitpos1
+ && (equality_code
+- || (indirect_base0 && DECL_P (base0))
++ || (indirect_base0
++ && (DECL_P (base0) || CONSTANT_CLASS_P (base0)))
+ || POINTER_TYPE_OVERFLOW_UNDEFINED))
+ {
+ /* By converting to signed sizetype we cover middle-end pointer
+@@ -10514,11 +10525,15 @@
+ || TREE_CODE (arg0) == BIT_IOR_EXPR
+ || TREE_CODE (arg0) == BIT_XOR_EXPR)
+ && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
+- return fold_build2_loc (loc, TREE_CODE (arg0), type,
+- fold_build2_loc (loc, code, type,
+- TREE_OPERAND (arg0, 0), arg1),
+- fold_build2_loc (loc, code, type,
+- TREE_OPERAND (arg0, 1), arg1));
++ {
++ tree arg00 = fold_convert_loc (loc, type, TREE_OPERAND (arg0, 0));
++ tree arg01 = fold_convert_loc (loc, type, TREE_OPERAND (arg0, 1));
++ return fold_build2_loc (loc, TREE_CODE (arg0), type,
++ fold_build2_loc (loc, code, type,
++ arg00, arg1),
++ fold_build2_loc (loc, code, type,
++ arg01, arg1));
++ }
+
+ /* Two consecutive rotates adding up to the some integer
+ multiple of the precision of the type can be ignored. */
+@@ -10527,7 +10542,7 @@
+ && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
+ && wi::umod_trunc (wi::add (arg1, TREE_OPERAND (arg0, 1)),
+ prec) == 0)
+- return TREE_OPERAND (arg0, 0);
++ return fold_convert_loc (loc, type, TREE_OPERAND (arg0, 0));
+
+ return NULL_TREE;
+
+@@ -11631,9 +11646,9 @@
+ /* Convert A ? 0 : 1 to !A. This prefers the use of NOT_EXPR
+ over COND_EXPR in cases such as floating point comparisons. */
+ if (integer_zerop (op1)
+- && (code == VEC_COND_EXPR ? integer_all_onesp (op2)
+- : (integer_onep (op2)
+- && !VECTOR_TYPE_P (type)))
++ && code == COND_EXPR
++ && integer_onep (op2)
++ && !VECTOR_TYPE_P (type)
+ && truth_value_p (TREE_CODE (arg0)))
+ return pedantic_non_lvalue_loc (loc,
+ fold_convert_loc (loc, type,
+@@ -12305,7 +12320,8 @@
+ || TYPE_REFERENCE_TO (expr)
+ || TYPE_CACHED_VALUES_P (expr)
+ || TYPE_CONTAINS_PLACEHOLDER_INTERNAL (expr)
+- || TYPE_NEXT_VARIANT (expr)))
++ || TYPE_NEXT_VARIANT (expr)
++ || TYPE_ALIAS_SET_KNOWN_P (expr)))
+ {
+ /* Allow these fields to be modified. */
+ tree tmp;
+@@ -12315,6 +12331,7 @@
+ TYPE_POINTER_TO (tmp) = NULL;
+ TYPE_REFERENCE_TO (tmp) = NULL;
+ TYPE_NEXT_VARIANT (tmp) = NULL;
++ TYPE_ALIAS_SET (tmp) = -1;
+ if (TYPE_CACHED_VALUES_P (tmp))
+ {
+ TYPE_CACHED_VALUES_P (tmp) = 0;
+@@ -13549,6 +13566,9 @@
+ if (!DECL_P (base))
+ base = get_base_address (base);
+
++ if (base && TREE_CODE (base) == TARGET_EXPR)
++ base = TARGET_EXPR_SLOT (base);
++
+ if (!base)
+ return false;
+
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/fortran/ChangeLog gcc-6-20160721/gcc/fortran/ChangeLog
+--- gcc-6.1.0/gcc/fortran/ChangeLog 2016-04-27 08:20:21.000000000 +0000
++++ gcc-6-20160721/gcc/fortran/ChangeLog 2016-07-16 03:54:12.000000000 +0000
+@@ -1,3 +1,249 @@
++2016-07-15 Jerry DeLisle <jvdelisle@gcc.gnu.org>
++
++ Backport from trunk:
++ PR fortran/71764
++ * trans-expr.c (gfc_trans_structure_assign): Remove assert.
++
++2016-07-13 Andre Vehreschild <vehre@gcc.gnu.org>
++
++ Backport from trunk:
++ PR fortran/71623
++ * trans-stmt.c (gfc_trans_allocate): Add code of pre block of typespec
++ in allocate to parent block.
++
++2016-07-09 Thomas Koenig <tkoenig@gcc.gnu.org>
++
++ Backport from trunk:
++ PR fortran/71783
++ * frontend-passes.c (create_var): Always allocate a charlen
++ for character variables.
++
++2016-07-08 Cesar Philippidis <cesar@codesourcery.com>
++
++ Backport from trunk:
++ 2016-07-08 Cesar Philippidis <cesar@codesourcery.com>
++
++ * parse.c (matcha): Define.
++ (decode_oacc_directive): Add spec_only local var and set it. Use
++ matcha to parse acc directives except for routine and declare. Return
++ ST_GET_FCN_CHARACTERISTICS if a non-declarative directive could be
++ matched.
++
++2016-07-02 Jakub Jelinek <jakub@redhat.com>
++
++ Backported from mainline
++ 2016-07-01 Jakub Jelinek <jakub@redhat.com>
++
++ PR fortran/71687
++ * f95-lang.c (struct binding_level): Add reversed field.
++ (clear_binding_level): Adjust initializer.
++ (getdecls): If reversed is clear, set it and nreverse the names
++ chain before returning it.
++ (poplevel): Use getdecls.
++ * trans-decl.c (gfc_generate_function_code, gfc_process_block_locals):
++ Use nreverse to pushdecl decls in the declaration order.
++
++ PR fortran/71717
++ * trans-openmp.c (gfc_omp_privatize_by_reference): Return false
++ for GFC_DECL_ASSOCIATE_VAR_P with POINTER_TYPE.
++
++ 2016-06-30 Jakub Jelinek <jakub@redhat.com>
++
++ PR fortran/71704
++ * parse.c (matchs, matcho): Move right before decode_omp_directive.
++ If spec_only, only gfc_match the keyword and if successful, goto
++ do_spec_only.
++ (matchds, matchdo): Define.
++ (decode_omp_directive): Add spec_only local var and set it.
++ Use matchds or matchdo macros instead of matchs or matcho
++ for declare target, declare simd, declare reduction and threadprivate
++ directives. Return ST_GET_FCN_CHARACTERISTICS if a non-declarative
++ directive could be matched.
++ (next_statement): For ST_GET_FCN_CHARACTERISTICS restore
++ gfc_current_locus from old_locus even if there is no label.
++
++ PR fortran/71705
++ * trans-openmp.c (gfc_trans_omp_clauses): Set TREE_ADDRESSABLE on
++ decls in to/from clauses.
++
++2016-06-29 Cesar Philippidis <cesar@codesourcery.com>
++
++ Back port from trunk
++ 2016-06-29 Cesar Philippidis <cesar@codesourcery.com>
++
++ * openmp.c (match_oacc_clause_gang): Rename to ...
++ (match_oacc_clause_gwv): this. Add support for OpenACC worker and
++ vector clauses.
++ (gfc_match_omp_clauses): Use match_oacc_clause_gwv for
++ OMP_CLAUSE_{GANG,WORKER,VECTOR}. Propagate any MATCH_ERRORs for
++ invalid OMP_CLAUSE_{ASYNC,WAIT,GANG,WORKER,VECTOR} clauses.
++ (gfc_match_oacc_wait): Propagate MATCH_ERROR for invalid
++ oacc_expr_lists. Adjust the first and needs_space arguments to
++ gfc_match_omp_clauses.
++
++2016-06-27 Paul Thomas <pault@gcc.gnu.org>
++
++ PR fortran/70673
++ * frontend-passes.c (realloc_string_callback): Add a call to
++ gfc_dep_compare_expr.
++
++2016-06-12 Dominique d'Humieres <dominiq@lps.ens.fr>
++
++ PR fortran/60751
++ * io.c (gfc_resolve_dt): Replace GFC_STD_GNU with GFC_STD_LEGACY.
++
++2016-06-10 Thomas Schwinge <thomas@codesourcery.com>
++
++ PR c/71381
++ Backport from trunk r237290:
++ * openmp.c (gfc_match_oacc_cache): Add comment.
++
++2016-06-05 Andre Vehreschild <vehre@gcc.gnu.org>
++
++ PR fortran/69659
++ * trans-array.c (gfc_trans_dummy_array_bias): For class arrays use
++ the address of the _data component to reference the arrays data
++ component.
++
++2016-06-01 Paul Thomas <pault@gcc.gnu.org>
++
++ PR fortran/71156
++ * decl.c (copy_prefix): Add checks that the module procedure
++ declaration prefixes are compliant with the interface. Invert
++ order of existing elemental and pure checks.
++ * resolve.c (resolve_fl_procedure): Invert order of elemental
++ and pure errors.
++
++2016-06-01 Jakub Jelinek <jakub@redhat.com>
++
++ * parse.c (case_decl): Move ST_OMP_* to ...
++ (case_omp_decl): ... here, new macro.
++ (verify_st_order): For case_omp_decl, complain about
++ p->state >= ORDER_EXEC, but don't change p->state otherwise.
++
++2016-05-26 Jerry DeLisle <jvdelisle@gcc.gnu.org>
++
++ Backport from trunk.
++ PR fortran/66461
++ * scanner.c (gfc_next_char_literal): Clear end_flag when adjusting
++ current locus back to old_locus.
++
++2016-05-20 Jakub Jelinek <jakub@redhat.com>
++
++ PR fortran/71204
++ * frontend-passes.c (realloc_string_callback): Clear inserted_block
++ and changed_statement before calling create_var.
++
++2016-05-15 Harald Anlauf <anlauf@gmx.de>
++
++ PR fortran/69603
++ * interface.c (compare_parameter): Check for non-NULL pointer.
++
++2016-05-14 Fritz Reese <fritzoreese@gmail.com>
++
++ Backport from trunk: r236242
++ * gfortran.texi: Update example of DEC UNION extension.
++
++ Backport from trunk: r236241
++ PR fortran/71047
++ * expr.c (gfc_default_initializer): Avoid extra component refs in
++ constructors for derived types and classes.
++
++ Backport from trunk: r235999
++ PR fortran/56226
++ * module.c (dt_upper_string): Rename to gfc_dt_upper_string
++ (dt_lower_string): Likewise.
++ * gfortran.h: Make new gfc_dt_upper/lower_string global.
++ * class.c: Use gfc_dt_upper_string.
++ * decl.c: Likewise.
++ * symbol.c: Likewise.
++ * resolve.c (resolve_component): New function.
++ (resolve_fl_derived0): Move component loop code to resolve_component.
++ * parse.c (check_component): New function.
++ (parse_derived): Move loop code to check_component.
++ * lang.opt, invoke.texi, options.c : New option -fdec-structure.
++ * libgfortran.h (bt): New basic type BT_UNION.
++ * gfortran.h (gfc_option): New option -fdec-structure.
++ (gfc_get_union_type, gfc_compare_union_types): New prototypes.
++ (gfc_bt_struct, gfc_fl_struct, case_bt_struct, case_fl_struct): New
++ macros.
++ (gfc_find_component): Change prototype.
++ * match.h (gfc_match_member_sep, gfc_match_map, gfc_match_union,
++ gfc_match_structure_decl): New prototypes.
++ * parse.h (gfc_comp_struct): New macro.
++ * symbol.c (gfc_find_component): Search for components in nested unions
++ * class.c (insert_component_ref, gfc_add_component_ref, add_proc_comp,
++ copy_vtab_proc_comps): Update calls to gfc_find_component.
++ * primary.c (gfc_convert_to_structure_constructor): Likewise.
++ * symbol.c (gfc_add_component): Likewise.
++ * resolve.c (resolve_typebound_function, resolve_typebound_subroutine,
++ resolve_typebound_procedure, resolve_component, resolve_fl_derived):
++ Likewise.
++ * expr.c (get_union_init, component_init): New functions.
++ * decl.c (match_clist_expr, match_record_decl, get_struct_decl,
++ gfc_match_map, gfc_match_union, gfc_match_structure_decl): Likewise.
++ * interface.c (compare_components, gfc_compare_union_types): Likewise.
++ * match.c (gfc_match_member_sep): Likewise.
++ * parse.c (check_component, parse_union, parse_struct_map): Likewise.
++ * resolve.c (resolve_fl_struct): Likewise.
++ * symbol.c (find_union_component): Likewise.
++ * trans-types.c (gfc_get_union_type): Likewise.
++ * parse.c (parse_derived): Use new functions.
++ * interface.c (gfc_compare_derived_types, gfc_compare_types): Likewise.
++ * expr.c (gfc_default_initializer): Likewise.
++ * gfortran.texi: Support for DEC structures, unions, and maps.
++ * gfortran.h (gfc_statement, sym_flavor): Likewise.
++ * check.c (gfc_check_kill_sub): Likewise.
++ * expr.c (gfc_copy_expr, simplify_const_ref,
++ gfc_has_default_initializer): Likewise.
++ * decl.c (build_sym, match_data_constant, add_init_expr_to_sym,
++ match_pointer_init, build_struct, variable_decl,
++ gfc_match_decl_type_spec, gfc_mach_data-decl, gfc_match_entry,
++ gfc_match_end, gfc_match_derived_decl): Likewise.
++ * interface.c (check_interface0, check_interface1,
++ gfc_search_interface): Likewise.
++ * misc.c (gfc_basic_typename, gfc_typename): Likewise.
++ * module.c (add_true_name, build_tnt, bt_types, mio_typespec,
++ fix_mio_expr, load_needed, mio_symbol, read_module, write_symbol,
++ gfc_get_module_backend_decl): Likewise.
++ * parse.h (gfc_compile_state): Likewise.
++ * parse.c (decode_specification_statement, decode_statement,
++ gfc_ascii_statement, verify_st_order, parse_spec): Likewise.
++ * primary.c (gfc_match_varspec, gfc_match_structure_constructor,
++ gfc_match_rvalue, match_variable): Likewise.
++ * resolve.c (find_arglists, resolve_structure_cons,
++ is_illegal_recursion, resolve_generic_f, get_declared_from_expr,
++ resolve_typebound_subroutine, resolve_allocate_expr,
++ nonscalar_typebound_assign, generate_component_assignments,
++ resolve_fl_variable_derived, check_defined_assignments,
++ resolve_component, resolve_symbol, resolve_equivalence_derived):
++ Likewise.
++ * symbol.c (flavors, check_conflict, gfc_add_flavor, gfc_use_derived,
++ gfc_restore_last_undo_checkpoint, gfc_type_compatible,
++ gfc_find_dt_in_generic): Likewise.
++ * trans-decl.c (gfc_get_module_backend_decl, create_function_arglist,
++ gfc_create_module_variable, check_constant_initializer): Likewise.
++ * trans-expr.c (gfc_conv_component_ref, gfc_conv_initializer,
++ gfc_trans_alloc_subarray_assign, gfc_trans_subcomponent_assign,
++ gfc_conv_structure, gfc_trans_scalar_assign, copyable_array_p):
++ Likewise.
++ * trans-io.c (transfer_namelist_element, transfer_expr,
++ gfc_trans_transfer): Likewise.
++ * trans-stmt.c (gfc_trans_deallocate): Likewise.
++ * trans-types.c (gfc_typenode_for_spec, gfc_copy_dt_decls_ifequal,
++ gfc_get_derived_type): Likewise.
++
++2016-05-11 Jakub Jelinek <jakub@redhat.com>
++
++ PR fortran/70855
++ * frontend-passes.c (inline_matmul_assign): Disable in !$omp workshare.
++
++2016-04-29 Cesar Philippidis <cesar@codesourcery.com>
++
++ PR middle-end/70626
++ * trans-openmp.c (gfc_trans_oacc_combined_directive): Duplicate
++ the reduction clause in both parallel and loop directives.
++
+ 2016-04-27 Release Manager
+
+ * GCC 6.1.0 released.
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/fortran/check.c gcc-6-20160721/gcc/fortran/check.c
+--- gcc-6.1.0/gcc/fortran/check.c 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/gcc/fortran/check.c 2016-05-14 19:52:46.000000000 +0000
+@@ -2592,7 +2592,7 @@
+ bool
+ gfc_check_kind (gfc_expr *x)
+ {
+- if (x->ts.type == BT_DERIVED || x->ts.type == BT_CLASS)
++ if (gfc_bt_struct (x->ts.type) || x->ts.type == BT_CLASS)
+ {
+ gfc_error ("%qs argument of %qs intrinsic at %L must be of "
+ "intrinsic type", gfc_current_intrinsic_arg[0]->name,
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/fortran/class.c gcc-6-20160721/gcc/fortran/class.c
+--- gcc-6.1.0/gcc/fortran/class.c 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/gcc/fortran/class.c 2016-05-14 19:52:46.000000000 +0000
+@@ -78,12 +78,11 @@
+ gcc_assert (ts->type == BT_DERIVED || ts->type == BT_CLASS);
+ type_sym = ts->u.derived;
+
+- new_ref = gfc_get_ref ();
+- new_ref->type = REF_COMPONENT;
+- new_ref->next = *ref;
+- new_ref->u.c.sym = type_sym;
+- new_ref->u.c.component = gfc_find_component (type_sym, name, true, true);
++ gfc_find_component (type_sym, name, true, true, &new_ref);
+ gcc_assert (new_ref->u.c.component);
++ while (new_ref->next)
++ new_ref = new_ref->next;
++ new_ref->next = *ref;
+
+ if (new_ref->next)
+ {
+@@ -206,8 +205,9 @@
+ void
+ gfc_add_component_ref (gfc_expr *e, const char *name)
+ {
++ gfc_component *c;
+ gfc_ref **tail = &(e->ref);
+- gfc_ref *next = NULL;
++ gfc_ref *ref, *next = NULL;
+ gfc_symbol *derived = e->symtree->n.sym->ts.u.derived;
+ while (*tail != NULL)
+ {
+@@ -237,14 +237,13 @@
+ else
+ /* Avoid losing memory. */
+ gfc_free_ref_list (*tail);
+- (*tail) = gfc_get_ref();
+- (*tail)->next = next;
+- (*tail)->type = REF_COMPONENT;
+- (*tail)->u.c.sym = derived;
+- (*tail)->u.c.component = gfc_find_component (derived, name, true, true);
+- gcc_assert((*tail)->u.c.component);
++ c = gfc_find_component (derived, name, true, true, tail);
++ gcc_assert (c);
++ for (ref = *tail; ref->next; ref = ref->next)
++ ;
++ ref->next = next;
+ if (!next)
+- e->ts = (*tail)->u.c.component->ts;
++ e->ts = c->ts;
+ }
+
+
+@@ -477,8 +476,7 @@
+ if (derived->attr.unlimited_polymorphic)
+ strcpy (dt_name, "STAR");
+ else
+- strcpy (dt_name, derived->name);
+- dt_name[0] = TOUPPER (dt_name[0]);
++ strcpy (dt_name, gfc_dt_upper_string (derived->name));
+ if (derived->attr.unlimited_polymorphic)
+ sprintf (string, "_%s", dt_name);
+ else if (derived->module)
+@@ -751,7 +749,7 @@
+ if (tb->non_overridable)
+ return;
+
+- c = gfc_find_component (vtype, name, true, true);
++ c = gfc_find_component (vtype, name, true, true, NULL);
+
+ if (c == NULL)
+ {
+@@ -820,7 +818,7 @@
+
+ for (cmp = vtab->ts.u.derived->components; cmp; cmp = cmp->next)
+ {
+- if (gfc_find_component (vtype, cmp->name, true, true))
++ if (gfc_find_component (vtype, cmp->name, true, true, NULL))
+ continue;
+
+ add_proc_comp (vtype, cmp->name, cmp->tb);
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/fortran/decl.c gcc-6-20160721/gcc/fortran/decl.c
+--- gcc-6.1.0/gcc/fortran/decl.c 2016-03-12 13:59:10.000000000 +0000
++++ gcc-6-20160721/gcc/fortran/decl.c 2016-06-01 18:46:11.000000000 +0000
+@@ -391,13 +391,13 @@
+
+ if (sym == NULL
+ || (sym->attr.flavor != FL_PARAMETER
+- && (!dt_sym || dt_sym->attr.flavor != FL_DERIVED)))
++ && (!dt_sym || !gfc_fl_struct (dt_sym->attr.flavor))))
+ {
+ gfc_error ("Symbol %qs must be a PARAMETER in DATA statement at %C",
+ name);
+ return MATCH_ERROR;
+ }
+- else if (dt_sym && dt_sym->attr.flavor == FL_DERIVED)
++ else if (dt_sym && gfc_fl_struct (dt_sym->attr.flavor))
+ return gfc_match_structure_constructor (dt_sym, result);
+
+ /* Check to see if the value is an initialization array expression. */
+@@ -606,6 +606,161 @@
+ /************************ Declaration statements *********************/
+
+
++/* Like gfc_match_init_expr, but matches a 'clist' (old-style initialization
++ list). The difference here is the expression is a list of constants
++ and is surrounded by '/'.
++ The typespec ts must match the typespec of the variable which the
++ clist is initializing.
++ The arrayspec tells whether this should match a list of constants
++ corresponding to array elements or a scalar (as == NULL). */
++
++static match
++match_clist_expr (gfc_expr **result, gfc_typespec *ts, gfc_array_spec *as)
++{
++ gfc_constructor_base array_head = NULL;
++ gfc_expr *expr = NULL;
++ match m;
++ locus where;
++ mpz_t repeat, size;
++ bool scalar;
++ int cmp;
++
++ gcc_assert (ts);
++
++ mpz_init_set_ui (repeat, 0);
++ mpz_init (size);
++ scalar = !as || !as->rank;
++
++ /* We have already matched '/' - now look for a constant list, as with
++ top_val_list from decl.c, but append the result to an array. */
++ if (gfc_match ("/") == MATCH_YES)
++ {
++ gfc_error ("Empty old style initializer list at %C");
++ goto cleanup;
++ }
++
++ where = gfc_current_locus;
++ for (;;)
++ {
++ m = match_data_constant (&expr);
++ if (m != MATCH_YES)
++ expr = NULL; /* match_data_constant may set expr to garbage */
++ if (m == MATCH_NO)
++ goto syntax;
++ if (m == MATCH_ERROR)
++ goto cleanup;
++
++ /* Found r in repeat spec r*c; look for the constant to repeat. */
++ if ( gfc_match_char ('*') == MATCH_YES)
++ {
++ if (scalar)
++ {
++ gfc_error ("Repeat spec invalid in scalar initializer at %C");
++ goto cleanup;
++ }
++ if (expr->ts.type != BT_INTEGER)
++ {
++ gfc_error ("Repeat spec must be an integer at %C");
++ goto cleanup;
++ }
++ mpz_set (repeat, expr->value.integer);
++ gfc_free_expr (expr);
++ expr = NULL;
++
++ m = match_data_constant (&expr);
++ if (m == MATCH_NO)
++ gfc_error ("Expected data constant after repeat spec at %C");
++ if (m != MATCH_YES)
++ goto cleanup;
++ }
++ /* No repeat spec, we matched the data constant itself. */
++ else
++ mpz_set_ui (repeat, 1);
++
++ if (!scalar)
++ {
++ /* Add the constant initializer as many times as repeated. */
++ for (; mpz_cmp_ui (repeat, 0) > 0; mpz_sub_ui (repeat, repeat, 1))
++ {
++ /* Make sure types of elements match */
++ if(ts && !gfc_compare_types (&expr->ts, ts)
++ && !gfc_convert_type (expr, ts, 1))
++ goto cleanup;
++
++ gfc_constructor_append_expr (&array_head,
++ gfc_copy_expr (expr), &gfc_current_locus);
++ }
++
++ gfc_free_expr (expr);
++ expr = NULL;
++ }
++
++ /* For scalar initializers quit after one element. */
++ else
++ {
++ if(gfc_match_char ('/') != MATCH_YES)
++ {
++ gfc_error ("End of scalar initializer expected at %C");
++ goto cleanup;
++ }
++ break;
++ }
++
++ if (gfc_match_char ('/') == MATCH_YES)
++ break;
++ if (gfc_match_char (',') == MATCH_NO)
++ goto syntax;
++ }
++
++ /* Set up expr as an array constructor. */
++ if (!scalar)
++ {
++ expr = gfc_get_array_expr (ts->type, ts->kind, &where);
++ expr->ts = *ts;
++ expr->value.constructor = array_head;
++
++ expr->rank = as->rank;
++ expr->shape = gfc_get_shape (expr->rank);
++
++ /* Validate sizes. */
++ gcc_assert (gfc_array_size (expr, &size));
++ gcc_assert (spec_size (as, &repeat));
++ cmp = mpz_cmp (size, repeat);
++ if (cmp < 0)
++ gfc_error ("Not enough elements in array initializer at %C");
++ else if (cmp > 0)
++ gfc_error ("Too many elements in array initializer at %C");
++ if (cmp)
++ goto cleanup;
++ }
++
++ /* Make sure scalar types match. */
++ else if (!gfc_compare_types (&expr->ts, ts)
++ && !gfc_convert_type (expr, ts, 1))
++ goto cleanup;
++
++ if (expr->ts.u.cl)
++ expr->ts.u.cl->length_from_typespec = 1;
++
++ *result = expr;
++ mpz_clear (size);
++ mpz_clear (repeat);
++ return MATCH_YES;
++
++syntax:
++ gfc_error ("Syntax error in old style initializer list at %C");
++
++cleanup:
++ if (expr)
++ expr->value.constructor = NULL;
++ gfc_free_expr (expr);
++ gfc_constructor_free (array_head);
++ mpz_clear (size);
++ mpz_clear (repeat);
++ return MATCH_ERROR;
++}
++
++
+ /* Auxiliary function to merge DIMENSION and CODIMENSION array specs. */
+
+ static bool
+@@ -1239,7 +1394,8 @@
+
+ st = gfc_find_symtree (gfc_current_ns->sym_root, u_name);
+
+- if (st != 0)
++ /* STRUCTURE types can alias symbol names */
++ if (st != 0 && st->n.sym->attr.flavor != FL_STRUCT)
+ {
+ gfc_error ("Symbol %qs at %C also declared as a type at %L", name,
+ &st->n.sym->declared_at);
+@@ -1469,7 +1625,7 @@
+
+ /* Check if the assignment can happen. This has to be put off
+ until later for derived type variables and procedure pointers. */
+- if (sym->ts.type != BT_DERIVED && init->ts.type != BT_DERIVED
++ if (!gfc_bt_struct (sym->ts.type) && !gfc_bt_struct (init->ts.type)
+ && sym->ts.type != BT_CLASS && init->ts.type != BT_CLASS
+ && !sym->attr.proc_pointer
+ && !gfc_check_assign_symbol (sym, NULL, init))
+@@ -1608,7 +1764,7 @@
+ If we mark my_int as iso_c (since we can see it's value
+ is equal to one of the named constants), then my_int_2
+ will be considered C interoperable. */
+- if (sym->ts.type != BT_CHARACTER && sym->ts.type != BT_DERIVED)
++ if (sym->ts.type != BT_CHARACTER && !gfc_bt_struct (sym->ts.type))
+ {
+ sym->ts.is_iso_c |= init->ts.is_iso_c;
+ sym->ts.is_c_interop |= init->ts.is_c_interop;
+@@ -1666,6 +1822,7 @@
+ build_struct (const char *name, gfc_charlen *cl, gfc_expr **init,
+ gfc_array_spec **as)
+ {
++ gfc_state_data *s;
+ gfc_component *c;
+ bool t = true;
+
+@@ -1689,6 +1846,35 @@
+ }
+ }
+
++ /* If we are in a nested union/map definition, gfc_add_component will not
++ properly find repeated components because:
++ (i) gfc_add_component does a flat search, where components of unions
++ and maps are implicity chained so nested components may conflict.
++ (ii) Unions and maps are not linked as components of their parent
++ structures until after they are parsed.
++ For (i) we use gfc_find_component which searches recursively, and for (ii)
++ we search each block directly from the parse stack until we find the top
++ level structure. */
++
++ s = gfc_state_stack;
++ if (s->state == COMP_UNION || s->state == COMP_MAP)
++ {
++ while (s->state == COMP_UNION || gfc_comp_struct (s->state))
++ {
++ c = gfc_find_component (s->sym, name, true, true, NULL);
++ if (c != NULL)
++ {
++ gfc_error_now ("Component '%s' at %C already declared at %L",
++ name, &c->loc);
++ return false;
++ }
++ /* Break after we've searched the entire chain. */
++ if (s->state == COMP_DERIVED || s->state == COMP_STRUCTURE)
++ break;
++ s = s->previous;
++ }
++ }
++
+ if (!gfc_add_component (gfc_current_block(), name, &c))
+ return false;
+
+@@ -1868,7 +2054,7 @@
+ {
+ match m;
+
+- if (gfc_pure (NULL) && gfc_state_stack->state != COMP_DERIVED)
++ if (gfc_pure (NULL) && !gfc_comp_struct (gfc_state_stack->state))
+ {
+ gfc_error ("Initialization of pointer at %C is not allowed in "
+ "a PURE procedure");
+@@ -2062,7 +2248,7 @@
+ /* If this symbol has already shown up in a Cray Pointer declaration,
+ and this is not a component declaration,
+ then we want to set the type & bail out. */
+- if (flag_cray_pointer && gfc_current_state () != COMP_DERIVED)
++ if (flag_cray_pointer && !gfc_comp_struct (gfc_current_state ()))
+ {
+ gfc_find_symbol (name, gfc_current_ns, 1, &sym);
+ if (sym != NULL && sym->attr.cray_pointee)
+@@ -2127,7 +2313,7 @@
+ For components of derived types, it is not true, so we don't
+ create a symbol for those yet. If we fail to create the symbol,
+ bail out. */
+- if (gfc_current_state () != COMP_DERIVED
++ if (!gfc_comp_struct (gfc_current_state ())
+ && !build_sym (name, cl, cl_deferred, &as, &var_locus))
+ {
+ m = MATCH_ERROR;
+@@ -2154,6 +2340,9 @@
+ if (!gfc_notify_std (GFC_STD_GNU, "Old-style "
+ "initialization at %C"))
+ return MATCH_ERROR;
++
++ /* Allow old style initializations for components of STRUCTUREs and MAPs
++ but not components of derived types. */
+ else if (gfc_current_state () == COMP_DERIVED)
+ {
+ gfc_error ("Invalid old style initialization for derived type "
+@@ -2162,7 +2351,23 @@
+ goto cleanup;
+ }
+
+- return match_old_style_init (name);
++ /* For structure components, read the initializer as a special
++ expression and let the rest of this function apply the initializer
++ as usual. */
++ else if (gfc_comp_struct (gfc_current_state ()))
++ {
++ m = match_clist_expr (&initializer, &current_ts, as);
++ if (m == MATCH_NO)
++ gfc_error ("Syntax error in old style initialization of %s at %C",
++ name);
++ if (m != MATCH_YES)
++ goto cleanup;
++ }
++
++ /* Otherwise we treat the old style initialization just like a
++ DATA declaration for the current variable. */
++ else
++ return match_old_style_init (name);
+ }
+
+ /* The double colon must be present in order to have initializers.
+@@ -2200,7 +2405,7 @@
+ }
+
+ if (current_attr.flavor != FL_PARAMETER && gfc_pure (NULL)
+- && gfc_state_stack->state != COMP_DERIVED)
++ && !gfc_comp_struct (gfc_state_stack->state))
+ {
+ gfc_error ("Initialization of variable at %C is not allowed in "
+ "a PURE procedure");
+@@ -2208,7 +2413,7 @@
+ }
+
+ if (current_attr.flavor != FL_PARAMETER
+- && gfc_state_stack->state != COMP_DERIVED)
++ && !gfc_comp_struct (gfc_state_stack->state))
+ gfc_unset_implicit_pure (gfc_current_ns->proc_name);
+
+ if (m != MATCH_YES)
+@@ -2217,7 +2422,7 @@
+ }
+
+ if (initializer != NULL && current_attr.allocatable
+- && gfc_current_state () == COMP_DERIVED)
++ && gfc_comp_struct (gfc_current_state ()))
+ {
+ gfc_error ("Initialization of allocatable component at %C is not "
+ "allowed");
+@@ -2228,7 +2433,7 @@
+ /* Add the initializer. Note that it is fine if initializer is
+ NULL here, because we sometimes also need to check if a
+ declaration *must* have an initialization expression. */
+- if (gfc_current_state () != COMP_DERIVED)
++ if (!gfc_comp_struct (gfc_current_state ()))
+ t = add_init_expr_to_sym (name, &initializer, &var_locus);
+ else
+ {
+@@ -2236,6 +2441,12 @@
+ && !current_attr.pointer && !initializer)
+ initializer = gfc_default_initializer (&current_ts);
+ t = build_struct (name, cl, &initializer, &as);
++
++ /* If we match a nested structure definition we expect to see the
++ * body even if the variable declarations blow up, so we need to keep
++ * the structure declaration around. */
++ if (gfc_new_block && gfc_new_block->attr.flavor == FL_STRUCT)
++ gfc_commit_symbol (gfc_new_block);
+ }
+
+ m = (t) ? MATCH_YES : MATCH_ERROR;
+@@ -2724,6 +2935,36 @@
+ }
+
+
++/* Matches a RECORD declaration. */
++
++static match
++match_record_decl (const char *name)
++{
++ locus old_loc;
++ old_loc = gfc_current_locus;
++
++ if (gfc_match (" record") == MATCH_YES)
++ {
++ if (!gfc_option.flag_dec_structure)
++ {
++ gfc_current_locus = old_loc;
++ gfc_error ("RECORD at %C is an extension, enable it with "
++ "-fdec-structure");
++ return MATCH_ERROR;
++ }
++ if (gfc_match (" /%n/", name) != MATCH_YES)
++ {
++ gfc_error ("Structure name expected after RECORD at %C");
++ gfc_current_locus = old_loc;
++ return MATCH_ERROR;
++ }
++ return MATCH_YES;
++ }
++
++ gfc_current_locus = old_loc;
++ return MATCH_NO;
++}
++
+ /* Matches a declaration-type-spec (F03:R502). If successful, sets the ts
+ structure to the matched specification. This is necessary for FUNCTION and
+ IMPLICIT statements.
+@@ -2781,7 +3022,7 @@
+ {
+ if ((m = gfc_match ("*)")) != MATCH_YES)
+ return m;
+- if (gfc_current_state () == COMP_DERIVED)
++ if (gfc_comp_struct (gfc_current_state ()))
+ {
+ gfc_error ("Assumed type at %C is not allowed for components");
+ return MATCH_ERROR;
+@@ -2892,10 +3133,51 @@
+ if (matched_type)
+ m = gfc_match_char (')');
+
+- if (m == MATCH_YES)
+- ts->type = BT_DERIVED;
++ if (m != MATCH_YES)
++ m = match_record_decl (name);
++
++ if (matched_type || m == MATCH_YES)
++ {
++ ts->type = BT_DERIVED;
++ /* We accept record/s/ or type(s) where s is a structure, but we
++ * don't need all the extra derived-type stuff for structures. */
++ if (gfc_find_symbol (gfc_dt_upper_string (name), NULL, 1, &sym))
++ {
++ gfc_error ("Type name '%s' at %C is ambiguous", name);
++ return MATCH_ERROR;
++ }
++ if (sym && sym->attr.flavor == FL_STRUCT)
++ {
++ ts->u.derived = sym;
++ return MATCH_YES;
++ }
++ /* Actually a derived type. */
++ }
++
+ else
+ {
++ /* Match nested STRUCTURE declarations; only valid within another
++ structure declaration. */
++ m = gfc_match (" structure");
++ if (m == MATCH_ERROR)
++ return MATCH_ERROR;
++ else if (m == MATCH_YES)
++ {
++ if ( gfc_current_state () != COMP_STRUCTURE
++ && gfc_current_state () != COMP_MAP)
++ return MATCH_ERROR;
++
++ m = gfc_match_structure_decl ();
++ if (m == MATCH_YES)
++ {
++ /* gfc_new_block is updated by match_structure_decl. */
++ ts->type = BT_DERIVED;
++ ts->u.derived = gfc_new_block;
++ return MATCH_YES;
++ }
++ return MATCH_ERROR;
++ }
++
+ /* Match CLASS declarations. */
+ m = gfc_match (" class ( * )");
+ if (m == MATCH_ERROR)
+@@ -2964,9 +3246,7 @@
+ stored in a symtree with the first letter of the name capitalized; the
+ symtree with the all lower-case name contains the associated
+ generic function. */
+- dt_name = gfc_get_string ("%c%s",
+- (char) TOUPPER ((unsigned char) name[0]),
+- (const char*)&name[1]);
++ dt_name = gfc_dt_upper_string (name);
+ sym = NULL;
+ dt_sym = NULL;
+ if (ts->kind != -1)
+@@ -2998,7 +3278,7 @@
+ return MATCH_NO;
+ }
+
+- if ((sym->attr.flavor != FL_UNKNOWN
++ if ((sym->attr.flavor != FL_UNKNOWN && sym->attr.flavor != FL_STRUCT
+ && !(sym->attr.flavor == FL_PROCEDURE && sym->attr.generic))
+ || sym->attr.subroutine)
+ {
+@@ -3038,7 +3318,7 @@
+
+ gfc_set_sym_referenced (dt_sym);
+
+- if (dt_sym->attr.flavor != FL_DERIVED
++ if (dt_sym->attr.flavor != FL_DERIVED && dt_sym->attr.flavor != FL_STRUCT
+ && !gfc_add_flavor (&dt_sym->attr, FL_DERIVED, sym->name, NULL))
+ return MATCH_ERROR;
+
+@@ -3480,9 +3760,7 @@
+ letter of the name capitalized; the symtree with the all
+ lower-case name contains the associated generic function. */
+ st = gfc_new_symtree (&gfc_current_ns->sym_root,
+- gfc_get_string ("%c%s",
+- (char) TOUPPER ((unsigned char) name[0]),
+- &name[1]));
++ gfc_dt_upper_string (name));
+ st->n.sym = sym;
+ sym->refs++;
+ sym->attr.imported = 1;
+@@ -4497,7 +4775,7 @@
+ return m;
+
+ if ((current_ts.type == BT_DERIVED || current_ts.type == BT_CLASS)
+- && gfc_current_state () != COMP_DERIVED)
++ && !gfc_comp_struct (gfc_current_state ()))
+ {
+ sym = gfc_use_derived (current_ts.u.derived);
+
+@@ -4526,17 +4804,19 @@
+ && !current_ts.u.derived->attr.zero_comp)
+ {
+
+- if (current_attr.pointer && gfc_current_state () == COMP_DERIVED)
++ if (current_attr.pointer && gfc_comp_struct (gfc_current_state ()))
+ goto ok;
+
+ gfc_find_symbol (current_ts.u.derived->name,
+ current_ts.u.derived->ns, 1, &sym);
+
+ /* Any symbol that we find had better be a type definition
+- which has its components defined. */
+- if (sym != NULL && sym->attr.flavor == FL_DERIVED
++ which has its components defined, or be a structure definition
++ actively being parsed. */
++ if (sym != NULL && gfc_fl_struct (sym->attr.flavor)
+ && (current_ts.u.derived->components != NULL
+- || current_ts.u.derived->attr.zero_comp))
++ || current_ts.u.derived->attr.zero_comp
++ || current_ts.u.derived == gfc_new_block))
+ goto ok;
+
+ gfc_error ("Derived type at %C has not been previously defined "
+@@ -4698,12 +4978,51 @@
+ static bool
+ copy_prefix (symbol_attribute *dest, locus *where)
+ {
+- if (current_attr.pure && !gfc_add_pure (dest, where))
++ if (dest->module_procedure)
++ {
++ if (current_attr.elemental)
++ dest->elemental = 1;
++
++ if (current_attr.pure)
++ dest->pure = 1;
++
++ if (current_attr.recursive)
++ dest->recursive = 1;
++
++ /* Module procedures are unusual in that the 'dest' is copied from
++ the interface declaration. However, this is an oportunity to
++ check that the submodule declaration is compliant with the
++ interface. */
++ if (dest->elemental && !current_attr.elemental)
++ {
++ gfc_error ("ELEMENTAL prefix in MODULE PROCEDURE interface is "
++ "missing at %L", where);
+ return false;
++ }
++
++ if (dest->pure && !current_attr.pure)
++ {
++ gfc_error ("PURE prefix in MODULE PROCEDURE interface is "
++ "missing at %L", where);
++ return false;
++ }
++
++ if (dest->recursive && !current_attr.recursive)
++ {
++ gfc_error ("RECURSIVE prefix in MODULE PROCEDURE interface is "
++ "missing at %L", where);
++ return false;
++ }
++
++ return true;
++ }
+
+ if (current_attr.elemental && !gfc_add_elemental (dest, where))
+ return false;
+
++ if (current_attr.pure && !gfc_add_pure (dest, where))
++ return false;
++
+ if (current_attr.recursive && !gfc_add_recursive (dest, where))
+ return false;
+
+@@ -5791,6 +6110,10 @@
+ gfc_error ("ENTRY statement at %C cannot appear within "
+ "an INTERFACE");
+ break;
++ case COMP_STRUCTURE:
++ gfc_error ("ENTRY statement at %C cannot appear within "
++ "a STRUCTURE block");
++ break;
+ case COMP_DERIVED:
+ gfc_error ("ENTRY statement at %C cannot appear within "
+ "a DERIVED TYPE block");
+@@ -6450,6 +6773,24 @@
+ eos_ok = 0;
+ break;
+
++ case COMP_MAP:
++ *st = ST_END_MAP;
++ target = " map";
++ eos_ok = 0;
++ break;
++
++ case COMP_UNION:
++ *st = ST_END_UNION;
++ target = " union";
++ eos_ok = 0;
++ break;
++
++ case COMP_STRUCTURE:
++ *st = ST_END_STRUCTURE;
++ target = " structure";
++ eos_ok = 0;
++ break;
++
+ case COMP_DERIVED:
+ case COMP_DERIVED_CONTAINS:
+ *st = ST_END_TYPE;
+@@ -8020,6 +8361,208 @@
+ }
+
+
++/* Common function for type declaration blocks similar to derived types, such
++ as STRUCTURES and MAPs. Unlike derived types, a structure type
++ does NOT have a generic symbol matching the name given by the user.
++ STRUCTUREs can share names with variables and PARAMETERs so we must allow
++ for the creation of an independent symbol.
++ Other parameters are a message to prefix errors with, the name of the new
++ type to be created, and the flavor to add to the resulting symbol. */
++
++static bool
++get_struct_decl (const char *name, sym_flavor fl, locus *decl,
++ gfc_symbol **result)
++{
++ gfc_symbol *sym;
++ locus where;
++
++ gcc_assert (name[0] == (char) TOUPPER (name[0]));
++
++ if (decl)
++ where = *decl;
++ else
++ where = gfc_current_locus;
++
++ if (gfc_get_symbol (name, NULL, &sym))
++ return false;
++
++ if (!sym)
++ {
++ gfc_internal_error ("Failed to create structure type '%s' at %C", name);
++ return false;
++ }
++
++ if (sym->components != NULL || sym->attr.zero_comp)
++ {
++ gfc_error ("Type definition of '%s' at %C was already defined at %L",
++ sym->name, &sym->declared_at);
++ return false;
++ }
++
++ sym->declared_at = where;
++
++ if (sym->attr.flavor != fl
++ && !gfc_add_flavor (&sym->attr, fl, sym->name, NULL))
++ return false;
++
++ if (!sym->hash_value)
++ /* Set the hash for the compound name for this type. */
++ sym->hash_value = gfc_hash_value (sym);
++
++ /* Normally the type is expected to have been completely parsed by the time
++ a field declaration with this type is seen. For unions, maps, and nested
++ structure declarations, we need to indicate that it is okay that we
++ haven't seen any components yet. This will be updated after the structure
++ is fully parsed. */
++ sym->attr.zero_comp = 0;
++
++ /* Structures always act like derived-types with the SEQUENCE attribute */
++ gfc_add_sequence (&sym->attr, sym->name, NULL);
++
++ if (result) *result = sym;
++
++ return true;
++}
++
++
++/* Match the opening of a MAP block. Like a struct within a union in C;
++ behaves identical to STRUCTURE blocks. */
++
++match
++gfc_match_map (void)
++{
++ /* Counter used to give unique internal names to map structures. */
++ static unsigned int gfc_map_id = 0;
++ char name[GFC_MAX_SYMBOL_LEN + 1];
++ gfc_symbol *sym;
++ locus old_loc;
++
++ old_loc = gfc_current_locus;
++
++ if (gfc_match_eos () != MATCH_YES)
++ {
++ gfc_error ("Junk after MAP statement at %C");
++ gfc_current_locus = old_loc;
++ return MATCH_ERROR;
++ }
++
++ /* Map blocks are anonymous so we make up unique names for the symbol table
++ which are invalid Fortran identifiers. */
++ snprintf (name, GFC_MAX_SYMBOL_LEN + 1, "MM$%u", gfc_map_id++);
++
++ if (!get_struct_decl (name, FL_STRUCT, &old_loc, &sym))
++ return MATCH_ERROR;
++
++ gfc_new_block = sym;
++
++ return MATCH_YES;
++}
++
++
++/* Match the opening of a UNION block. */
++
++match
++gfc_match_union (void)
++{
++ /* Counter used to give unique internal names to union types. */
++ static unsigned int gfc_union_id = 0;
++ char name[GFC_MAX_SYMBOL_LEN + 1];
++ gfc_symbol *sym;
++ locus old_loc;
++
++ old_loc = gfc_current_locus;
++
++ if (gfc_match_eos () != MATCH_YES)
++ {
++ gfc_error ("Junk after UNION statement at %C");
++ gfc_current_locus = old_loc;
++ return MATCH_ERROR;
++ }
++
++ /* Unions are anonymous so we make up unique names for the symbol table
++ which are invalid Fortran identifiers. */
++ snprintf (name, GFC_MAX_SYMBOL_LEN + 1, "UU$%u", gfc_union_id++);
++
++ if (!get_struct_decl (name, FL_UNION, &old_loc, &sym))
++ return MATCH_ERROR;
++
++ gfc_new_block = sym;
++
++ return MATCH_YES;
++}
++
++
++/* Match the beginning of a STRUCTURE declaration. This is similar to
++ matching the beginning of a derived type declaration with a few
++ twists. The resulting type symbol has no access control or other
++ interesting attributes. */
++
++match
++gfc_match_structure_decl (void)
++{
++ /* Counter used to give unique internal names to anonymous structures. */
++ int gfc_structure_id = 0;
++ char name[GFC_MAX_SYMBOL_LEN + 1];
++ gfc_symbol *sym;
++ match m;
++ locus where;
++
++ if(!gfc_option.flag_dec_structure)
++ {
++ gfc_error ("STRUCTURE at %C is a DEC extension, enable with "
++ "-fdec-structure");
++ return MATCH_ERROR;
++ }
++
++ name[0] = '\0';
++
++ m = gfc_match (" /%n/", name);
++ if (m != MATCH_YES)
++ {
++ /* Non-nested structure declarations require a structure name. */
++ if (!gfc_comp_struct (gfc_current_state ()))
++ {
++ gfc_error ("Structure name expected in non-nested structure "
++ "declaration at %C");
++ return MATCH_ERROR;
++ }
++ /* This is an anonymous structure; make up a unique name for it
++ (upper-case letters never make it to symbol names from the source).
++ The important thing is initializing the type variable
++ and setting gfc_new_symbol, which is immediately used by
++ parse_structure () and variable_decl () to add components of
++ this type. */
++ snprintf (name, GFC_MAX_SYMBOL_LEN + 1, "SS$%u", gfc_structure_id++);
++ }
++
++ where = gfc_current_locus;
++ /* No field list allowed after non-nested structure declaration. */
++ if (!gfc_comp_struct (gfc_current_state ())
++ && gfc_match_eos () != MATCH_YES)
++ {
++ gfc_error ("Junk after non-nested STRUCTURE statement at %C");
++ return MATCH_ERROR;
++ }
++
++ /* Make sure the name is not the name of an intrinsic type. */
++ if (gfc_is_intrinsic_typename (name))
++ {
++ gfc_error ("Structure name '%s' at %C cannot be the same as an"
++ " intrinsic type", name);
++ return MATCH_ERROR;
++ }
++
++ /* Store the actual type symbol for the structure with an upper-case first
++ letter (an invalid Fortran identifier). */
++
++ sprintf (name, gfc_dt_upper_string (name));
++ if (!get_struct_decl (name, FL_STRUCT, &where, &sym))
++ return MATCH_ERROR;
++
++ gfc_new_block = sym;
++ return MATCH_YES;
++}
++
+ /* Match the beginning of a derived type declaration. If a type name
+ was the result of a function, then it is possible to have a symbol
+ already to be known as a derived type yet have no components. */
+@@ -8037,7 +8580,7 @@
+ bool seen_attr = false;
+ gfc_interface *intr = NULL, *head;
+
+- if (gfc_current_state () == COMP_DERIVED)
++ if (gfc_comp_struct (gfc_current_state ()))
+ return MATCH_NO;
+
+ name[0] = '\0';
+@@ -8111,9 +8654,7 @@
+ if (!sym)
+ {
+ /* Use upper case to save the actual derived-type symbol. */
+- gfc_get_symbol (gfc_get_string ("%c%s",
+- (char) TOUPPER ((unsigned char) gensym->name[0]),
+- &gensym->name[1]), NULL, &sym);
++ gfc_get_symbol (gfc_dt_upper_string (gensym->name), NULL, &sym);
+ sym->name = gfc_get_string (gensym->name);
+ head = gensym->generic;
+ intr = gfc_get_interface ();
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/fortran/dump-parse-tree.c gcc-6-20160721/gcc/fortran/dump-parse-tree.c
+--- gcc-6.1.0/gcc/fortran/dump-parse-tree.c 2016-02-28 22:24:27.000000000 +0000
++++ gcc-6-20160721/gcc/fortran/dump-parse-tree.c 2016-05-14 19:52:46.000000000 +0000
+@@ -106,6 +106,7 @@
+ {
+ case BT_DERIVED:
+ case BT_CLASS:
++ case BT_UNION:
+ fprintf (dumpfile, "%s", ts->u.derived->name);
+ break;
+
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/fortran/expr.c gcc-6-20160721/gcc/fortran/expr.c
+--- gcc-6.1.0/gcc/fortran/expr.c 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/gcc/fortran/expr.c 2016-05-14 19:52:46.000000000 +0000
+@@ -335,7 +335,7 @@
+
+ case BT_HOLLERITH:
+ case BT_LOGICAL:
+- case BT_DERIVED:
++ case_bt_struct:
+ case BT_CLASS:
+ case BT_ASSUMED:
+ break; /* Already done. */
+@@ -1279,7 +1279,7 @@
+ /* For extended types, check if the desired component is in one of the
+ * parent types. */
+ while (ext > 0 && gfc_find_component (dt->components->ts.u.derived,
+- pick->name, true, true))
++ pick->name, true, true, NULL))
+ {
+ dt = dt->components->ts.u.derived;
+ c = gfc_constructor_first (c->expr->value.constructor);
+@@ -1649,7 +1649,7 @@
+
+ case AR_FULL:
+ if (p->ref->next != NULL
+- && (p->ts.type == BT_CHARACTER || p->ts.type == BT_DERIVED))
++ && (p->ts.type == BT_CHARACTER || gfc_bt_struct (p->ts.type)))
+ {
+ for (c = gfc_constructor_first (p->value.constructor);
+ c; c = gfc_constructor_next (c))
+@@ -1659,7 +1659,7 @@
+ return false;
+ }
+
+- if (p->ts.type == BT_DERIVED
++ if (gfc_bt_struct (p->ts.type)
+ && p->ref->next
+ && (c = gfc_constructor_first (p->value.constructor)))
+ {
+@@ -3926,9 +3926,9 @@
+ {
+ gfc_component *c;
+
+- gcc_assert (der->attr.flavor == FL_DERIVED);
++ gcc_assert (gfc_fl_struct (der->attr.flavor));
+ for (c = der->components; c; c = c->next)
+- if (c->ts.type == BT_DERIVED)
++ if (gfc_bt_struct (c->ts.type))
+ {
+ if (!c->attr.pointer && !c->attr.proc_pointer
+ && gfc_has_default_initializer (c->ts.u.derived))
+@@ -3975,6 +3975,10 @@
+
+ if (comp->initializer)
+ {
++ /* Save the component ref for STRUCTUREs and UNIONs. */
++ if (ts->u.derived->attr.flavor == FL_STRUCT
++ || ts->u.derived->attr.flavor == FL_UNION)
++ ctor->n.component = comp;
+ ctor->expr = gfc_copy_expr (comp->initializer);
+ if ((comp->ts.type != comp->initializer->ts.type
+ || comp->ts.kind != comp->initializer->ts.kind)
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/fortran/f95-lang.c gcc-6-20160721/gcc/fortran/f95-lang.c
+--- gcc-6.1.0/gcc/fortran/f95-lang.c 2016-02-08 15:36:16.000000000 +0000
++++ gcc-6-20160721/gcc/fortran/f95-lang.c 2016-07-02 10:25:52.000000000 +0000
+@@ -289,6 +289,9 @@
+ tree blocks;
+ /* The binding level containing this one (the enclosing binding level). */
+ struct binding_level *level_chain;
++ /* True if nreverse has been already called on names; if false, names
++ are ordered from newest declaration to oldest one. */
++ bool reversed;
+ };
+
+ /* The binding level currently in effect. */
+@@ -299,7 +302,7 @@
+ static GTY(()) struct binding_level *global_binding_level;
+
+ /* Binding level structures are initialized by copying this one. */
+-static struct binding_level clear_binding_level = { NULL, NULL, NULL };
++static struct binding_level clear_binding_level = { NULL, NULL, NULL, false };
+
+
+ /* Return true if we are in the global binding level. */
+@@ -313,6 +316,11 @@
+ tree
+ getdecls (void)
+ {
++ if (!current_binding_level->reversed)
++ {
++ current_binding_level->reversed = true;
++ current_binding_level->names = nreverse (current_binding_level->names);
++ }
+ return current_binding_level->names;
+ }
+
+@@ -350,7 +358,7 @@
+ binding level that we are about to exit and which is returned by this
+ routine. */
+ tree block_node = NULL_TREE;
+- tree decl_chain = current_binding_level->names;
++ tree decl_chain = getdecls ();
+ tree subblock_chain = current_binding_level->blocks;
+ tree subblock_node;
+
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/fortran/frontend-passes.c gcc-6-20160721/gcc/fortran/frontend-passes.c
+--- gcc-6.1.0/gcc/fortran/frontend-passes.c 2016-02-28 22:27:55.000000000 +0000
++++ gcc-6-20160721/gcc/fortran/frontend-passes.c 2016-07-10 21:26:28.000000000 +0000
+@@ -174,8 +174,17 @@
+
+ if (!gfc_check_dependency (expr1, expr2, true))
+ return 0;
+-
++
++ /* gfc_check_dependency doesn't always pick up identical expressions.
++ However, eliminating the above sends the compiler into an infinite
++ loop on valid expressions. Without this check, the gimplifier emits
++ an ICE for a = a, where a is deferred character length. */
++ if (!gfc_dep_compare_expr (expr1, expr2))
++ return 0;
++
+ current_code = c;
++ inserted_block = NULL;
++ changed_statement = NULL;
+ n = create_var (expr2, "trim");
+ co->expr2 = n;
+ return 0;
+@@ -656,12 +665,10 @@
+ {
+ gfc_expr *length;
+
++ symbol->ts.u.cl = gfc_new_charlen (ns, NULL);
+ length = constant_string_length (e);
+ if (length)
+- {
+- symbol->ts.u.cl = gfc_new_charlen (ns, NULL);
+- symbol->ts.u.cl->length = length;
+- }
++ symbol->ts.u.cl->length = length;
+ else
+ symbol->attr.allocatable = 1;
+ }
+@@ -2812,6 +2819,12 @@
+ if (in_where)
+ return 0;
+
++ /* For now don't do anything in OpenMP workshare, it confuses
++ its translation, which expects only the allowed statements in there.
++ We should figure out how to parallelize this eventually. */
++ if (in_omp_workshare)
++ return 0;
++
+ expr1 = co->expr1;
+ expr2 = co->expr2;
+ if (expr2->expr_type != EXPR_FUNCTION
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/fortran/gfortran.h gcc-6-20160721/gcc/fortran/gfortran.h
+--- gcc-6.1.0/gcc/fortran/gfortran.h 2016-03-17 15:07:54.000000000 +0000
++++ gcc-6-20160721/gcc/fortran/gfortran.h 2016-05-14 19:52:46.000000000 +0000
+@@ -62,6 +62,15 @@
+
+ #define gfc_is_whitespace(c) ((c==' ') || (c=='\t'))
+
++/* Macros to check for groups of structure-like types and flavors since
++ derived types, structures, maps, unions are often treated similarly. */
++#define gfc_bt_struct(t) \
++ ((t) == BT_DERIVED || (t) == BT_UNION)
++#define gfc_fl_struct(f) \
++ ((f) == FL_DERIVED || (f) == FL_UNION || (f) == FL_STRUCT)
++#define case_bt_struct case BT_DERIVED: case BT_UNION
++#define case_fl_struct case FL_DERIVED: case FL_UNION: case FL_STRUCT
++
+ /* Stringization. */
+ #define stringize(x) expand_macro(x)
+ #define expand_macro(x) # x
+@@ -203,6 +212,8 @@
+ ST_POINTER_ASSIGNMENT, ST_SELECT_CASE, ST_SEQUENCE, ST_SIMPLE_IF,
+ ST_STATEMENT_FUNCTION, ST_DERIVED_DECL, ST_LABEL_ASSIGNMENT, ST_ENUM,
+ ST_ENUMERATOR, ST_END_ENUM, ST_SELECT_TYPE, ST_TYPE_IS, ST_CLASS_IS,
++ ST_STRUCTURE_DECL, ST_END_STRUCTURE,
++ ST_UNION, ST_END_UNION, ST_MAP, ST_END_MAP,
+ ST_OACC_PARALLEL_LOOP, ST_OACC_END_PARALLEL_LOOP, ST_OACC_PARALLEL,
+ ST_OACC_END_PARALLEL, ST_OACC_KERNELS, ST_OACC_END_KERNELS, ST_OACC_DATA,
+ ST_OACC_END_DATA, ST_OACC_HOST_DATA, ST_OACC_END_HOST_DATA, ST_OACC_LOOP,
+@@ -254,12 +265,12 @@
+ };
+
+ /* Symbol flavors: these are all mutually exclusive.
+- 10 elements = 4 bits. */
++ 12 elements = 4 bits. */
+ enum sym_flavor
+ {
+ FL_UNKNOWN = 0, FL_PROGRAM, FL_BLOCK_DATA, FL_MODULE, FL_VARIABLE,
+ FL_PARAMETER, FL_LABEL, FL_PROCEDURE, FL_DERIVED, FL_NAMELIST,
+- FL_VOID
++ FL_UNION, FL_STRUCT, FL_VOID
+ };
+
+ /* Procedure types. 7 elements = 3 bits. */
+@@ -2523,6 +2534,8 @@
+ int flag_init_character;
+ char flag_init_character_value;
+
++ int flag_dec_structure;
++
+ int fpe;
+ int fpe_summary;
+ int rtcheck;
+@@ -2743,6 +2756,7 @@
+ int gfc_validate_kind (bt, int, bool);
+ int gfc_get_int_kind_from_width_isofortranenv (int size);
+ int gfc_get_real_kind_from_width_isofortranenv (int size);
++tree gfc_get_union_type (gfc_symbol *);
+ tree gfc_get_derived_type (gfc_symbol * derived);
+ extern int gfc_index_integer_kind;
+ extern int gfc_default_integer_kind;
+@@ -2831,7 +2845,8 @@
+ bool gfc_add_component (gfc_symbol *, const char *, gfc_component **);
+ gfc_symbol *gfc_use_derived (gfc_symbol *);
+ gfc_symtree *gfc_use_derived_tree (gfc_symtree *);
+-gfc_component *gfc_find_component (gfc_symbol *, const char *, bool, bool);
++gfc_component *gfc_find_component (gfc_symbol *, const char *, bool, bool,
++ gfc_ref **);
+
+ gfc_st_label *gfc_get_st_label (int);
+ void gfc_free_st_label (gfc_st_label *);
+@@ -3174,6 +3189,8 @@
+ void gfc_dump_module (const char *, int);
+ bool gfc_check_symbol_access (gfc_symbol *);
+ void gfc_free_use_stmts (gfc_use_list *);
++const char *gfc_dt_lower_string (const char *);
++const char *gfc_dt_upper_string (const char *);
+
+ /* primary.c */
+ symbol_attribute gfc_variable_attr (gfc_expr *, gfc_typespec *);
+Only in gcc-6.1.0/gcc/fortran: gfortran.info
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/fortran/gfortran.texi gcc-6-20160721/gcc/fortran/gfortran.texi
+--- gcc-6.1.0/gcc/fortran/gfortran.texi 2016-04-13 13:17:45.000000000 +0000
++++ gcc-6-20160721/gcc/fortran/gfortran.texi 2016-05-14 19:52:46.000000000 +0000
+@@ -474,9 +474,9 @@
+ standard-compliant Fortran 95, Fortran 90, and Fortran 77 programs,
+ including a number of standard and non-standard extensions, and can be
+ used on real-world programs. In particular, the supported extensions
+-include OpenMP, Cray-style pointers, and several Fortran 2003 and Fortran
+-2008 features, including TR 15581. However, it is still under
+-development and has a few remaining rough edges.
++include OpenMP, Cray-style pointers, some old vendor extensions, and several
++Fortran 2003 and Fortran 2008 features, including TR 15581. However, it is
++still under development and has a few remaining rough edges.
+ There also is initial support for OpenACC.
+ Note that this is an experimental feature, incomplete, and subject to
+ change in future versions of GCC. See
+@@ -1459,6 +1459,8 @@
+ * OpenACC::
+ * Argument list functions::
+ * Read/Write after EOF marker::
++* STRUCTURE and RECORD::
++* UNION and MAP::
+ @end menu
+
+ @node Old-style kind specifications
+@@ -2117,40 +2119,6 @@
+ the file before the EOF marker. As an extension, the run-time error may
+ be disabled using -std=legacy.
+
+-@node Extensions not implemented in GNU Fortran
+-@section Extensions not implemented in GNU Fortran
+-@cindex extensions, not implemented
+-
+-The long history of the Fortran language, its wide use and broad
+-userbase, the large number of different compiler vendors and the lack of
+-some features crucial to users in the first standards have lead to the
+-existence of a number of important extensions to the language. While
+-some of the most useful or popular extensions are supported by the GNU
+-Fortran compiler, not all existing extensions are supported. This section
+-aims at listing these extensions and offering advice on how best make
+-code that uses them running with the GNU Fortran compiler.
+-
+-@c More can be found here:
+-@c -- https://gcc.gnu.org/onlinedocs/gcc-3.4.6/g77/Missing-Features.html
+-@c -- the list of Fortran and libgfortran bugs closed as WONTFIX:
+-@c http://tinyurl.com/2u4h5y
+-
+-@menu
+-* STRUCTURE and RECORD::
+-@c * UNION and MAP::
+-* ENCODE and DECODE statements::
+-* Variable FORMAT expressions::
+-@c * Q edit descriptor::
+-@c * AUTOMATIC statement::
+-@c * TYPE and ACCEPT I/O Statements::
+-@c * .XOR. operator::
+-@c * CARRIAGECONTROL, DEFAULTFILE, DISPOSE and RECORDTYPE I/O specifiers::
+-@c * Omitted arguments in procedure call::
+-* Alternate complex function syntax::
+-* Volatile COMMON blocks::
+-* OPEN( ... NAME=)::
+-@end menu
+-
+
+ @node STRUCTURE and RECORD
+ @subsection @code{STRUCTURE} and @code{RECORD}
+@@ -2226,16 +2194,211 @@
+ print *, store_catalog(12)
+ @end example
+
++@noindent
++GNU Fortran implements STRUCTURES like derived types with the following
++rules and exceptions:
++
++@itemize @bullet
++@item Structures act like derived types with the @code{SEQUENCE} attribute.
++Otherwise they may contain no specifiers.
+
+-@c @node UNION and MAP
+-@c @subsection @code{UNION} and @code{MAP}
+-@c @cindex @code{UNION}
+-@c @cindex @code{MAP}
+-@c
+-@c For help writing this one, see
+-@c http://www.eng.umd.edu/~nsw/ench250/fortran1.htm#UNION and
+-@c http://www.tacc.utexas.edu/services/userguides/pgi/pgiws_ug/pgi32u06.htm
++@item Structures may share names with other symbols. For example, the following
++is invalid for derived types, but valid for structures:
+
++@smallexample
++structure /header/
++ ! ...
++end structure
++record /header/ header
++@end smallexample
++
++@item Structure types may be declared nested within another parent structure.
++The syntax is:
++@smallexample
++structure /type-name/
++ ...
++ structure [/<type-name>/] <field-list>
++...
++@end smallexample
++
++The type name may be ommitted, in which case the structure type itself is
++anonymous, and other structures of the same type cannot be instantiated. The
++following shows some examples:
++
++@example
++structure /appointment/
++ ! nested structure definition: app_time is an array of two 'time'
++ structure /time/ app_time (2)
++ integer(1) hour, minute
++ end structure
++ character(10) memo
++end structure
++
++! The 'time' structure is still usable
++record /time/ now
++now = time(5, 30)
++
++...
++
++structure /appointment/
++ ! anonymous nested structure definition
++ structure start, end
++ integer(1) hour, minute
++ end structure
++ character(10) memo
++end structure
++@end example
++
++@item Structures may contain @code{UNION} blocks. For more detail see the
++section on @ref{UNION and MAP}.
++
++@item Structures support old-style initialization of components, like
++those described in @ref{Old-style variable initialization}. For array
++initializers, an initializer may contain a repeat specification of the form
++@code{<literal-integer> * <constant-initializer>}. The value of the integer
++indicates the number of times to repeat the constant initializer when expanding
++the initializer list.
++@end itemize
++
++@node UNION and MAP
++@subsection @code{UNION} and @code{MAP}
++@cindex @code{UNION}
++@cindex @code{MAP}
++
++Unions are an old vendor extension which were commonly used with the
++non-standard @ref{STRUCTURE and RECORD} extensions. Use of @code{UNION} and
++@code{MAP} is automatically enabled with @option{-fdec-structure}.
++
++A @code{UNION} declaration occurs within a structure; within the definition of
++each union is a number of @code{MAP} blocks. Each @code{MAP} shares storage
++with its sibling maps (in the same union), and the size of the union is the
++size of the largest map within it, just as with unions in C. The major
++difference is that component references do not indicate which union or map the
++component is in (the compiler gets to figure that out).
++
++Here is a small example:
++@smallexample
++structure /myunion/
++union
++ map
++ character(2) w0, w1, w2
++ end map
++ map
++ character(6) long
++ end map
++end union
++end structure
++
++record /myunion/ rec
++! After this assignment...
++rec.long = 'hello!'
++
++! The following is true:
++! rec.w0 === 'he'
++! rec.w1 === 'll'
++! rec.w2 === 'o!'
++@end smallexample
++
++The two maps share memory, and the size of the union is ultimately six bytes:
++
++@example
++0 1 2 3 4 5 6 Byte offset
++-------------------------------
++| | | | | | |
++-------------------------------
++
++^ W0 ^ W1 ^ W2 ^
++ \-------/ \-------/ \-------/
++
++^ LONG ^
++ \---------------------------/
++@end example
++
++Following is an example mirroring the layout of an Intel x86_64 register:
++
++@example
++structure /reg/
++ union ! U0 ! rax
++ map
++ character(16) rx
++ end map
++ map
++ character(8) rh ! rah
++ union ! U1
++ map
++ character(8) rl ! ral
++ end map
++ map
++ character(8) ex ! eax
++ end map
++ map
++ character(4) eh ! eah
++ union ! U2
++ map
++ character(4) el ! eal
++ end map
++ map
++ character(4) x ! ax
++ end map
++ map
++ character(2) h ! ah
++ character(2) l ! al
++ end map
++ end union
++ end map
++ end union
++ end map
++ end union
++end structure
++record /reg/ a
++
++! After this assignment...
++a.rx = 'AAAAAAAA.BBB.C.D'
++
++! The following is true:
++a.rx === 'AAAAAAAA.BBB.C.D'
++a.rh === 'AAAAAAAA'
++a.rl === '.BBB.C.D'
++a.ex === '.BBB.C.D'
++a.eh === '.BBB'
++a.el === '.C.D'
++a.x === '.C.D'
++a.h === '.C'
++a.l === '.D'
++@end example
++
++
++@node Extensions not implemented in GNU Fortran
++@section Extensions not implemented in GNU Fortran
++@cindex extensions, not implemented
++
++The long history of the Fortran language, its wide use and broad
++userbase, the large number of different compiler vendors and the lack of
++some features crucial to users in the first standards have lead to the
++existence of a number of important extensions to the language. While
++some of the most useful or popular extensions are supported by the GNU
++Fortran compiler, not all existing extensions are supported. This section
++aims at listing these extensions and offering advice on how best make
++code that uses them running with the GNU Fortran compiler.
++
++@c More can be found here:
++@c -- https://gcc.gnu.org/onlinedocs/gcc-3.4.6/g77/Missing-Features.html
++@c -- the list of Fortran and libgfortran bugs closed as WONTFIX:
++@c http://tinyurl.com/2u4h5y
++
++@menu
++* ENCODE and DECODE statements::
++* Variable FORMAT expressions::
++@c * Q edit descriptor::
++@c * AUTOMATIC statement::
++@c * TYPE and ACCEPT I/O Statements::
++@c * .XOR. operator::
++@c * CARRIAGECONTROL, DEFAULTFILE, DISPOSE and RECORDTYPE I/O specifiers::
++@c * Omitted arguments in procedure call::
++* Alternate complex function syntax::
++* Volatile COMMON blocks::
++* OPEN( ... NAME=)::
++@end menu
+
+ @node ENCODE and DECODE statements
+ @subsection @code{ENCODE} and @code{DECODE} statements
+@@ -2355,7 +2518,6 @@
+ @code{VOLATILE} variables in @code{COMMON} blocks since revision 4.3.
+
+
+-
+ @node OPEN( ... NAME=)
+ @subsection @code{OPEN( ... NAME=)}
+ @cindex @code{NAM}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/fortran/interface.c gcc-6-20160721/gcc/fortran/interface.c
+--- gcc-6.1.0/gcc/fortran/interface.c 2016-01-24 22:18:20.000000000 +0000
++++ gcc-6-20160721/gcc/fortran/interface.c 2016-05-15 18:48:40.000000000 +0000
+@@ -387,19 +387,147 @@
+ }
+
+
++/* Compare components according to 4.4.2 of the Fortran standard. */
++
++static int
++compare_components (gfc_component *cmp1, gfc_component *cmp2,
++ gfc_symbol *derived1, gfc_symbol *derived2)
++{
++ gfc_symbol *d1, *d2;
++ bool anonymous = false;
++
++ /* Unions, maps, and anonymous structures all have names like "[xX]X$\d+"
++ which should not be compared. */
++ d1 = cmp1->ts.u.derived;
++ d2 = cmp2->ts.u.derived;
++ if ( (d1 && (d1->attr.flavor == FL_STRUCT || d1->attr.flavor == FL_UNION)
++ && ISUPPER (cmp1->name[1]))
++ || (d2 && (d2->attr.flavor == FL_STRUCT || d2->attr.flavor == FL_UNION)
++ && ISUPPER (cmp1->name[1])))
++ anonymous = true;
++
++ if (!anonymous && strcmp (cmp1->name, cmp2->name) != 0)
++ return 0;
++
++ if (cmp1->attr.access != cmp2->attr.access)
++ return 0;
++
++ if (cmp1->attr.pointer != cmp2->attr.pointer)
++ return 0;
++
++ if (cmp1->attr.dimension != cmp2->attr.dimension)
++ return 0;
++
++ if (cmp1->attr.allocatable != cmp2->attr.allocatable)
++ return 0;
++
++ if (cmp1->attr.dimension && gfc_compare_array_spec (cmp1->as, cmp2->as) == 0)
++ return 0;
++
++ /* Make sure that link lists do not put this function into an
++ endless recursive loop! */
++ if (!(cmp1->ts.type == BT_DERIVED && derived1 == cmp1->ts.u.derived)
++ && !(cmp2->ts.type == BT_DERIVED && derived2 == cmp2->ts.u.derived)
++ && gfc_compare_types (&cmp1->ts, &cmp2->ts) == 0)
++ return 0;
++
++ else if ( (cmp1->ts.type == BT_DERIVED && derived1 == cmp1->ts.u.derived)
++ && !(cmp2->ts.type == BT_DERIVED && derived2 == cmp2->ts.u.derived))
++ return 0;
++
++ else if (!(cmp1->ts.type == BT_DERIVED && derived1 == cmp1->ts.u.derived)
++ && (cmp2->ts.type == BT_DERIVED && derived2 == cmp2->ts.u.derived))
++ return 0;
++
++ return 1;
++}
++
++
++/* Compare two union types by comparing the components of their maps.
++ Because unions and maps are anonymous their types get special internal
++ names; therefore the usual derived type comparison will fail on them.
++
++ Returns nonzero if equal, as with gfc_compare_derived_types. Also as with
++ gfc_compare_derived_types, 'equal' is closer to meaning 'duplicate
++ definitions' than 'equivalent structure'. */
++
++int
++gfc_compare_union_types (gfc_symbol *un1, gfc_symbol *un2)
++{
++ gfc_component *map1, *map2, *cmp1, *cmp2;
++
++ if (un1->attr.flavor != FL_UNION || un2->attr.flavor != FL_UNION)
++ return 0;
++
++ map1 = un1->components;
++ map2 = un2->components;
++
++ /* In terms of 'equality' here we are worried about types which are
++ declared the same in two places, not types that represent equivalent
++ structures. (This is common because of FORTRAN's weird scoping rules.)
++ Though two unions with their maps in different orders could be equivalent,
++ we will say they are not equal for the purposes of this test; therefore
++ we compare the maps sequentially. */
++ for (;;)
++ {
++ cmp1 = map1->ts.u.derived->components;
++ cmp2 = map2->ts.u.derived->components;
++ for (;;)
++ {
++ /* No two fields will ever point to the same map type unless they are
++ the same component, because one map field is created with its type
++ declaration. Therefore don't worry about recursion here. */
++ /* TODO: worry about recursion into parent types of the unions? */
++ if (compare_components (cmp1, cmp2,
++ map1->ts.u.derived, map2->ts.u.derived) == 0)
++ return 0;
++
++ cmp1 = cmp1->next;
++ cmp2 = cmp2->next;
++
++ if (cmp1 == NULL && cmp2 == NULL)
++ break;
++ if (cmp1 == NULL || cmp2 == NULL)
++ return 0;
++ }
++
++ map1 = map1->next;
++ map2 = map2->next;
++
++ if (map1 == NULL && map2 == NULL)
++ break;
++ if (map1 == NULL || map2 == NULL)
++ return 0;
++ }
++
++ return 1;
++}
++
++
++
+ /* Compare two derived types using the criteria in 4.4.2 of the standard,
+ recursing through gfc_compare_types for the components. */
+
+ int
+ gfc_compare_derived_types (gfc_symbol *derived1, gfc_symbol *derived2)
+ {
+- gfc_component *dt1, *dt2;
++ gfc_component *cmp1, *cmp2;
++ bool anonymous = false;
+
+ if (derived1 == derived2)
+ return 1;
+
+ gcc_assert (derived1 && derived2);
+
++ /* MAP and anonymous STRUCTURE types have internal names of the form
++ mM* and sS* (we can get away this this because source names are converted
++ to lowerase). Compare anonymous type names specially because each
++ gets a unique name when it is declared. */
++ anonymous = (derived1->name[0] == derived2->name[0]
++ && derived1->name[1] && derived2->name[1] && derived2->name[2]
++ && derived1->name[1] == (char) TOUPPER (derived1->name[0])
++ && derived2->name[2] == (char) TOUPPER (derived2->name[0]));
++
+ /* Special case for comparing derived types across namespaces. If the
+ true names and module names are the same and the module name is
+ nonnull, then they are equal. */
+@@ -409,9 +537,11 @@
+ return 1;
+
+ /* Compare type via the rules of the standard. Both types must have
+- the SEQUENCE or BIND(C) attribute to be equal. */
++ the SEQUENCE or BIND(C) attribute to be equal. STRUCTUREs are special
++ because they can be anonymous; therefore two structures with different
++ names may be equal. */
+
+- if (strcmp (derived1->name, derived2->name))
++ if (strcmp (derived1->name, derived2->name) != 0 && !anonymous)
+ return 0;
+
+ if (derived1->component_access == ACCESS_PRIVATE
+@@ -422,53 +552,30 @@
+ && !(derived1->attr.is_bind_c && derived2->attr.is_bind_c))
+ return 0;
+
+- dt1 = derived1->components;
+- dt2 = derived2->components;
++ /* Protect against null components. */
++ if (derived1->attr.zero_comp != derived2->attr.zero_comp)
++ return 0;
++
++ if (derived1->attr.zero_comp)
++ return 1;
++
++ cmp1 = derived1->components;
++ cmp2 = derived2->components;
+
+ /* Since subtypes of SEQUENCE types must be SEQUENCE types as well, a
+ simple test can speed things up. Otherwise, lots of things have to
+ match. */
+ for (;;)
+ {
+- if (strcmp (dt1->name, dt2->name) != 0)
+- return 0;
++ if (!compare_components (cmp1, cmp2, derived1, derived2))
++ return 0;
+
+- if (dt1->attr.access != dt2->attr.access)
+- return 0;
++ cmp1 = cmp1->next;
++ cmp2 = cmp2->next;
+
+- if (dt1->attr.pointer != dt2->attr.pointer)
+- return 0;
+-
+- if (dt1->attr.dimension != dt2->attr.dimension)
+- return 0;
+-
+- if (dt1->attr.allocatable != dt2->attr.allocatable)
+- return 0;
+-
+- if (dt1->attr.dimension && gfc_compare_array_spec (dt1->as, dt2->as) == 0)
+- return 0;
+-
+- /* Make sure that link lists do not put this function into an
+- endless recursive loop! */
+- if (!(dt1->ts.type == BT_DERIVED && derived1 == dt1->ts.u.derived)
+- && !(dt2->ts.type == BT_DERIVED && derived2 == dt2->ts.u.derived)
+- && gfc_compare_types (&dt1->ts, &dt2->ts) == 0)
+- return 0;
+-
+- else if ((dt1->ts.type == BT_DERIVED && derived1 == dt1->ts.u.derived)
+- && !(dt1->ts.type == BT_DERIVED && derived1 == dt1->ts.u.derived))
+- return 0;
+-
+- else if (!(dt1->ts.type == BT_DERIVED && derived1 == dt1->ts.u.derived)
+- && (dt1->ts.type == BT_DERIVED && derived1 == dt1->ts.u.derived))
+- return 0;
+-
+- dt1 = dt1->next;
+- dt2 = dt2->next;
+-
+- if (dt1 == NULL && dt2 == NULL)
++ if (cmp1 == NULL && cmp2 == NULL)
+ break;
+- if (dt1 == NULL || dt2 == NULL)
++ if (cmp1 == NULL || cmp2 == NULL)
+ return 0;
+ }
+
+@@ -509,18 +616,18 @@
+ && (ts1->u.derived->attr.sequence || ts1->u.derived->attr.is_bind_c))
+ return 1;
+
++ if (ts1->type == BT_UNION && ts2->type == BT_UNION)
++ return gfc_compare_union_types (ts1->u.derived, ts2->u.derived);
++
+ if (ts1->type != ts2->type
+- && ((ts1->type != BT_DERIVED && ts1->type != BT_CLASS)
+- || (ts2->type != BT_DERIVED && ts2->type != BT_CLASS)))
++ && ((!gfc_bt_struct (ts1->type) && ts1->type != BT_CLASS)
++ || (!gfc_bt_struct (ts2->type) && ts2->type != BT_CLASS)))
+ return 0;
+ if (ts1->type != BT_DERIVED && ts1->type != BT_CLASS)
+ return (ts1->kind == ts2->kind);
+
+ /* Compare derived types. */
+- if (gfc_type_compatible (ts1, ts2))
+- return 1;
+-
+- return gfc_compare_derived_types (ts1->u.derived ,ts2->u.derived);
++ return gfc_type_compatible (ts1, ts2);
+ }
+
+
+@@ -1585,7 +1692,7 @@
+ functions or subroutines. */
+ if (((!p->sym->attr.function && !p->sym->attr.subroutine)
+ || !p->sym->attr.if_source)
+- && p->sym->attr.flavor != FL_DERIVED)
++ && !gfc_fl_struct (p->sym->attr.flavor))
+ {
+ if (p->sym->attr.external)
+ gfc_error ("Procedure %qs in %s at %L has no explicit interface",
+@@ -1599,14 +1706,14 @@
+
+ /* Verify that procedures are either all SUBROUTINEs or all FUNCTIONs. */
+ if ((psave->sym->attr.function && !p->sym->attr.function
+- && p->sym->attr.flavor != FL_DERIVED)
++ && !gfc_fl_struct (p->sym->attr.flavor))
+ || (psave->sym->attr.subroutine && !p->sym->attr.subroutine))
+ {
+- if (p->sym->attr.flavor != FL_DERIVED)
++ if (!gfc_fl_struct (p->sym->attr.flavor))
+ gfc_error ("In %s at %L procedures must be either all SUBROUTINEs"
+ " or all FUNCTIONs", interface_name,
+ &p->sym->declared_at);
+- else
++ else if (p->sym->attr.flavor == FL_DERIVED)
+ gfc_error ("In %s at %L procedures must be all FUNCTIONs as the "
+ "generic name is also the name of a derived type",
+ interface_name, &p->sym->declared_at);
+@@ -1666,8 +1773,8 @@
+ if (p->sym->name == q->sym->name && p->sym->module == q->sym->module)
+ continue;
+
+- if (p->sym->attr.flavor != FL_DERIVED
+- && q->sym->attr.flavor != FL_DERIVED
++ if (!gfc_fl_struct (p->sym->attr.flavor)
++ && !gfc_fl_struct (q->sym->attr.flavor)
+ && gfc_compare_interfaces (p->sym, q->sym, q->sym->name,
+ generic_flag, 0, NULL, 0, NULL, NULL))
+ {
+@@ -2006,7 +2113,7 @@
+ }
+
+ ppc = gfc_get_proc_ptr_comp (actual);
+- if (ppc)
++ if (ppc && ppc->ts.interface)
+ {
+ if (!gfc_compare_interfaces (formal, ppc->ts.interface, ppc->name, 0, 1,
+ err, sizeof(err), NULL, NULL))
+@@ -3550,7 +3657,7 @@
+
+ for (; intr; intr = intr->next)
+ {
+- if (intr->sym->attr.flavor == FL_DERIVED)
++ if (gfc_fl_struct (intr->sym->attr.flavor))
+ continue;
+ if (sub_flag && intr->sym->attr.function)
+ continue;
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/fortran/invoke.texi gcc-6-20160721/gcc/fortran/invoke.texi
+--- gcc-6.1.0/gcc/fortran/invoke.texi 2016-03-13 00:19:08.000000000 +0000
++++ gcc-6-20160721/gcc/fortran/invoke.texi 2016-05-14 19:52:46.000000000 +0000
+@@ -115,7 +115,8 @@
+ @item Fortran Language Options
+ @xref{Fortran Dialect Options,,Options controlling Fortran dialect}.
+ @gccoptlist{-fall-intrinsics -fbackslash -fcray-pointer -fd-lines-as-code @gol
+--fd-lines-as-comments -fdefault-double-8 -fdefault-integer-8 @gol
++-fd-lines-as-comments @gol
++-fdec -fdec-structure -fdefault-double-8 -fdefault-integer-8 @gol
+ -fdefault-real-8 -fdollar-ok -ffixed-line-length-@var{n} @gol
+ -ffixed-line-length-none -ffree-form -ffree-line-length-@var{n} @gol
+ -ffree-line-length-none -fimplicit-none -finteger-4-integer-8 @gol
+@@ -228,6 +229,24 @@
+ @option{-fd-lines-as-comments} option is given, they are treated as
+ comment lines.
+
++@item -fdec
++@opindex @code{fdec}
++DEC compatibility mode. Enables extensions and other features that mimic
++the default behavior of older compilers (such as DEC).
++These features are non-standard and should be avoided at all costs.
++For details on GNU Fortran's implementation of these extensions see the
++full documentation.
++
++Other flags enabled by this switch are:
++@option{-fdollar-ok} @option{-fcray-pointer} @option{-fdec-structure}
++
++@item -fdec-structure
++@opindex @code{fdec-structure}
++Enable DEC @code{STRUCTURE} and @code{RECORD} as well as @code{UNION},
++@code{MAP}, and dot ('.') as a member separator (in addition to '%'). This is
++provided for compatibility only; Fortran 90 derived types should be used
++instead where possible.
++
+ @item -fdollar-ok
+ @opindex @code{fdollar-ok}
+ @cindex @code{$}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/fortran/io.c gcc-6-20160721/gcc/fortran/io.c
+--- gcc-6.1.0/gcc/fortran/io.c 2016-02-27 19:07:13.000000000 +0000
++++ gcc-6-20160721/gcc/fortran/io.c 2016-06-12 14:04:08.000000000 +0000
+@@ -3007,7 +3007,7 @@
+ }
+
+ if (dt->extra_comma
+- && !gfc_notify_std (GFC_STD_GNU, "Comma before i/o item list at %L",
++ && !gfc_notify_std (GFC_STD_LEGACY, "Comma before i/o item list at %L",
+ &dt->extra_comma->where))
+ return false;
+
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/fortran/lang.opt gcc-6-20160721/gcc/fortran/lang.opt
+--- gcc-6.1.0/gcc/fortran/lang.opt 2016-02-01 16:20:13.000000000 +0000
++++ gcc-6-20160721/gcc/fortran/lang.opt 2016-05-14 19:52:46.000000000 +0000
+@@ -416,6 +416,14 @@
+ Fortran RejectNegative
+ Treat lines with 'D' in column one as comments.
+
++fdec
++Fortran
++Enable all DEC language extensions.
++
++fdec-structure
++Fortran
++Enable support for DEC STRUCTURE/RECORD.
++
+ fdefault-double-8
+ Fortran Var(flag_default_double)
+ Set the default double precision kind to an 8 byte wide type.
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/fortran/libgfortran.h gcc-6-20160721/gcc/fortran/libgfortran.h
+--- gcc-6.1.0/gcc/fortran/libgfortran.h 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/gcc/fortran/libgfortran.h 2016-05-14 19:52:46.000000000 +0000
+@@ -164,6 +164,6 @@
+ typedef enum
+ { BT_UNKNOWN = 0, BT_INTEGER, BT_LOGICAL, BT_REAL, BT_COMPLEX,
+ BT_DERIVED, BT_CHARACTER, BT_CLASS, BT_PROCEDURE, BT_HOLLERITH, BT_VOID,
+- BT_ASSUMED
++ BT_ASSUMED, BT_UNION
+ }
+ bt;
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/fortran/match.c gcc-6-20160721/gcc/fortran/match.c
+--- gcc-6.1.0/gcc/fortran/match.c 2016-02-28 19:07:42.000000000 +0000
++++ gcc-6-20160721/gcc/fortran/match.c 2016-05-14 19:52:46.000000000 +0000
+@@ -113,6 +113,128 @@
+
+ /******************** Generic matching subroutines ************************/
+
++/* Matches a member separator. With standard FORTRAN this is '%', but with
++ DEC structures we must carefully match dot ('.').
++ Because operators are spelled ".op.", a dotted string such as "x.y.z..."
++ can be either a component reference chain or a combination of binary
++ operations.
++ There is no real way to win because the string may be grammatically
++ ambiguous. The following rules help avoid ambiguities - they match
++ some behavior of other (older) compilers. If the rules here are changed
++ the test cases should be updated. If the user has problems with these rules
++ they probably deserve the consequences. Consider "x.y.z":
++ (1) If any user defined operator ".y." exists, this is always y(x,z)
++ (even if ".y." is the wrong type and/or x has a member y).
++ (2) Otherwise if x has a member y, and y is itself a derived type,
++ this is (x->y)->z, even if an intrinsic operator exists which
++ can handle (x,z).
++ (3) If x has no member y or (x->y) is not a derived type but ".y."
++ is an intrinsic operator (such as ".eq."), this is y(x,z).
++ (4) Lastly if there is no operator ".y." and x has no member "y", it is an
++ error.
++ It is worth noting that the logic here does not support mixed use of member
++ accessors within a single string. That is, even if x has component y and y
++ has component z, the following are all syntax errors:
++ "x%y.z" "x.y%z" "(x.y).z" "(x%y)%z"
++ */
++
++match
++gfc_match_member_sep(gfc_symbol *sym)
++{
++ char name[GFC_MAX_SYMBOL_LEN + 1];
++ locus dot_loc, start_loc;
++ gfc_intrinsic_op iop;
++ match m;
++ gfc_symbol *tsym;
++ gfc_component *c = NULL;
++
++ /* What a relief: '%' is an unambiguous member separator. */
++ if (gfc_match_char ('%') == MATCH_YES)
++ return MATCH_YES;
++
++ /* Beware ye who enter here. */
++ if (!gfc_option.flag_dec_structure || !sym)
++ return MATCH_NO;
++
++ tsym = NULL;
++
++ /* We may be given either a derived type variable or the derived type
++ declaration itself (which actually contains the components);
++ we need the latter to search for components. */
++ if (gfc_fl_struct (sym->attr.flavor))
++ tsym = sym;
++ else if (gfc_bt_struct (sym->ts.type))
++ tsym = sym->ts.u.derived;
++
++ iop = INTRINSIC_NONE;
++ name[0] = '\0';
++ m = MATCH_NO;
++
++ /* If we have to reject come back here later. */
++ start_loc = gfc_current_locus;
++
++ /* Look for a component access next. */
++ if (gfc_match_char ('.') != MATCH_YES)
++ return MATCH_NO;
++
++ /* If we accept, come back here. */
++ dot_loc = gfc_current_locus;
++
++ /* Try to match a symbol name following the dot. */
++ if (gfc_match_name (name) != MATCH_YES)
++ {
++ gfc_error ("Expected structure component or operator name "
++ "after '.' at %C");
++ goto error;
++ }
++
++ /* If no dot follows we have "x.y" which should be a component access. */
++ if (gfc_match_char ('.') != MATCH_YES)
++ goto yes;
++
++ /* Now we have a string "x.y.z" which could be a nested member access
++ (x->y)->z or a binary operation y on x and z. */
++
++ /* First use any user-defined operators ".y." */
++ if (gfc_find_uop (name, sym->ns) != NULL)
++ goto no;
++
++ /* Match accesses to existing derived-type components for
++ derived-type vars: "x.y.z" = (x->y)->z */
++ c = gfc_find_component(tsym, name, false, true, NULL);
++ if (c && (gfc_bt_struct (c->ts.type) || c->ts.type == BT_CLASS))
++ goto yes;
++
++ /* If y is not a component or has no members, try intrinsic operators. */
++ gfc_current_locus = start_loc;
++ if (gfc_match_intrinsic_op (&iop) != MATCH_YES)
++ {
++ /* If ".y." is not an intrinsic operator but y was a valid non-
++ structure component, match and leave the trailing dot to be
++ dealt with later. */
++ if (c)
++ goto yes;
++
++ gfc_error ("'%s' is neither a defined operator nor a "
++ "structure component in dotted string at %C", name);
++ goto error;
++ }
++
++ /* .y. is an intrinsic operator, overriding any possible member access. */
++ goto no;
++
++ /* Return keeping the current locus consistent with the match result. */
++error:
++ m = MATCH_ERROR;
++no:
++ gfc_current_locus = start_loc;
++ return m;
++yes:
++ gfc_current_locus = dot_loc;
++ return MATCH_YES;
++}
++
++
+ /* This function scans the current statement counting the opened and closed
+ parenthesis to make sure they are balanced. */
+
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/fortran/match.h gcc-6-20160721/gcc/fortran/match.h
+--- gcc-6.1.0/gcc/fortran/match.h 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/gcc/fortran/match.h 2016-05-14 19:52:46.000000000 +0000
+@@ -60,6 +60,7 @@
+ match gfc_match_iterator (gfc_iterator *, int);
+ match gfc_match_parens (void);
+ match gfc_match_type_spec (gfc_typespec *);
++match gfc_match_member_sep(gfc_symbol *);
+
+
+ /* Statement matchers. */
+@@ -208,6 +209,9 @@
+ match gfc_match_entry (void);
+ match gfc_match_subroutine (void);
+ match gfc_match_submod_proc (void);
++match gfc_match_map (void);
++match gfc_match_union (void);
++match gfc_match_structure_decl (void);
+ match gfc_match_derived_decl (void);
+ match gfc_match_final_decl (void);
+
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/fortran/misc.c gcc-6-20160721/gcc/fortran/misc.c
+--- gcc-6.1.0/gcc/fortran/misc.c 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/gcc/fortran/misc.c 2016-05-14 19:52:46.000000000 +0000
+@@ -83,6 +83,9 @@
+ case BT_HOLLERITH:
+ p = "HOLLERITH";
+ break;
++ case BT_UNION:
++ p = "UNION";
++ break;
+ case BT_DERIVED:
+ p = "DERIVED";
+ break;
+@@ -144,6 +147,9 @@
+ case BT_HOLLERITH:
+ sprintf (buffer, "HOLLERITH");
+ break;
++ case BT_UNION:
++ sprintf (buffer, "UNION(%s)", ts->u.derived->name);
++ break;
+ case BT_DERIVED:
+ sprintf (buffer, "TYPE(%s)", ts->u.derived->name);
+ break;
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/fortran/module.c gcc-6-20160721/gcc/fortran/module.c
+--- gcc-6.1.0/gcc/fortran/module.c 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/gcc/fortran/module.c 2016-05-14 19:52:46.000000000 +0000
+@@ -422,8 +422,8 @@
+ to convert the symtree name of a derived-type to the symbol name or to
+ the name of the associated generic function. */
+
+-static const char *
+-dt_lower_string (const char *name)
++const char *
++gfc_dt_lower_string (const char *name)
+ {
+ if (name[0] != (char) TOLOWER ((unsigned char) name[0]))
+ return gfc_get_string ("%c%s", (char) TOLOWER ((unsigned char) name[0]),
+@@ -437,8 +437,8 @@
+ symtree/symbol name of the associated generic function start with a lower-
+ case character. */
+
+-static const char *
+-dt_upper_string (const char *name)
++const char *
++gfc_dt_upper_string (const char *name)
+ {
+ if (name[0] != (char) TOUPPER ((unsigned char) name[0]))
+ return gfc_get_string ("%c%s", (char) TOUPPER ((unsigned char) name[0]),
+@@ -832,7 +832,7 @@
+
+ /* For derived types. */
+ if (name[0] != (char) TOLOWER ((unsigned char) name[0]))
+- low_name = dt_lower_string (name);
++ low_name = gfc_dt_lower_string (name);
+
+ i = 0;
+ for (u = gfc_rename_list; u; u = u->next)
+@@ -861,7 +861,7 @@
+ {
+ if (u->local_name[0] == '\0')
+ return name;
+- return dt_upper_string (u->local_name);
++ return gfc_dt_upper_string (u->local_name);
+ }
+
+ return (u->local_name[0] != '\0') ? u->local_name : name;
+@@ -989,8 +989,8 @@
+
+ t = XCNEW (true_name);
+ t->sym = sym;
+- if (sym->attr.flavor == FL_DERIVED)
+- t->name = dt_upper_string (sym->name);
++ if (gfc_fl_struct (sym->attr.flavor))
++ t->name = gfc_dt_upper_string (sym->name);
+ else
+ t->name = sym->name;
+
+@@ -1011,8 +1011,8 @@
+ build_tnt (st->left);
+ build_tnt (st->right);
+
+- if (st->n.sym->attr.flavor == FL_DERIVED)
+- name = dt_upper_string (st->n.sym->name);
++ if (gfc_fl_struct (st->n.sym->attr.flavor))
++ name = gfc_dt_upper_string (st->n.sym->name);
+ else
+ name = st->n.sym->name;
+
+@@ -2452,6 +2452,7 @@
+ minit ("COMPLEX", BT_COMPLEX),
+ minit ("LOGICAL", BT_LOGICAL),
+ minit ("CHARACTER", BT_CHARACTER),
++ minit ("UNION", BT_UNION),
+ minit ("DERIVED", BT_DERIVED),
+ minit ("CLASS", BT_CLASS),
+ minit ("PROCEDURE", BT_PROCEDURE),
+@@ -2505,7 +2506,7 @@
+
+ ts->type = MIO_NAME (bt) (ts->type, bt_types);
+
+- if (ts->type != BT_DERIVED && ts->type != BT_CLASS)
++ if (!gfc_bt_struct (ts->type) && ts->type != BT_CLASS)
+ mio_integer (&ts->kind);
+ else
+ mio_symbol_ref (&ts->u.derived);
+@@ -3322,8 +3323,8 @@
+ if (e->symtree->n.sym && check_unique_name (e->symtree->name))
+ {
+ const char *name = e->symtree->n.sym->name;
+- if (e->symtree->n.sym->attr.flavor == FL_DERIVED)
+- name = dt_upper_string (name);
++ if (gfc_fl_struct (e->symtree->n.sym->attr.flavor))
++ name = gfc_dt_upper_string (name);
+ ns_st = gfc_find_symtree (gfc_current_ns->sym_root, name);
+ }
+
+@@ -4265,7 +4266,7 @@
+
+ mio_integer (&(sym->intmod_sym_id));
+
+- if (sym->attr.flavor == FL_DERIVED)
++ if (gfc_fl_struct (sym->attr.flavor))
+ mio_integer (&(sym->hash_value));
+
+ if (sym->formal_ns
+@@ -4845,7 +4846,7 @@
+ 1, &ns->proc_name);
+
+ sym = gfc_new_symbol (p->u.rsym.true_name, ns);
+- sym->name = dt_lower_string (p->u.rsym.true_name);
++ sym->name = gfc_dt_lower_string (p->u.rsym.true_name);
+ sym->module = gfc_get_string (p->u.rsym.module);
+ if (p->u.rsym.binding_label)
+ sym->binding_label = IDENTIFIER_POINTER (get_identifier
+@@ -4857,6 +4858,12 @@
+ mio_symbol (sym);
+ sym->attr.use_assoc = 1;
+
++ /* Unliked derived types, a STRUCTURE may share names with other symbols.
++ We greedily converted the the symbol name to lowercase before we knew its
++ type, so now we must fix it. */
++ if (sym->attr.flavor == FL_STRUCT)
++ sym->name = gfc_dt_upper_string (sym->name);
++
+ /* Mark as only or rename for later diagnosis for explicitly imported
+ but not used warnings; don't mark internal symbols such as __vtab,
+ __def_init etc. Only mark them if they have been explicitly loaded. */
+@@ -5059,7 +5066,7 @@
+ can be used in expressions in the module. To avoid the module loading
+ failing, we need to associate the module's component pointer indexes
+ with the existing symbol's component pointers. */
+- if (sym->attr.flavor == FL_DERIVED)
++ if (gfc_fl_struct (sym->attr.flavor))
+ {
+ gfc_component *c;
+
+@@ -5213,7 +5220,7 @@
+ {
+ info->u.rsym.sym = gfc_new_symbol (info->u.rsym.true_name,
+ gfc_current_ns);
+- info->u.rsym.sym->name = dt_lower_string (info->u.rsym.true_name);
++ info->u.rsym.sym->name = gfc_dt_lower_string (info->u.rsym.true_name);
+ sym = info->u.rsym.sym;
+ sym->module = gfc_get_string (info->u.rsym.module);
+
+@@ -5557,10 +5564,10 @@
+
+ mio_integer (&n);
+
+- if (sym->attr.flavor == FL_DERIVED)
++ if (gfc_fl_struct (sym->attr.flavor))
+ {
+ const char *name;
+- name = dt_upper_string (sym->name);
++ name = gfc_dt_upper_string (sym->name);
+ mio_pool_string (&name);
+ }
+ else
+@@ -6568,7 +6575,7 @@
+ sym->attr.function = 1;
+ sym->attr.generic = 1;
+
+- gfc_get_sym_tree (dt_upper_string (sym->name),
++ gfc_get_sym_tree (gfc_dt_upper_string (sym->name),
+ gfc_current_ns, &tmp_symtree, false);
+ dt_sym = tmp_symtree->n.sym;
+ dt_sym->name = gfc_get_string (sym->name);
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/fortran/openmp.c gcc-6-20160721/gcc/fortran/openmp.c
+--- gcc-6.1.0/gcc/fortran/openmp.c 2016-04-06 23:07:21.000000000 +0000
++++ gcc-6-20160721/gcc/fortran/openmp.c 2016-06-29 16:08:13.000000000 +0000
+@@ -396,43 +396,67 @@
+ }
+
+ static match
+-match_oacc_clause_gang (gfc_omp_clauses *cp)
++match_oacc_clause_gwv (gfc_omp_clauses *cp, unsigned gwv)
+ {
+ match ret = MATCH_YES;
+
+ if (gfc_match (" ( ") != MATCH_YES)
+ return MATCH_NO;
+
+- /* The gang clause accepts two optional arguments, num and static.
+- The num argument may either be explicit (num: <val>) or
+- implicit without (<val> without num:). */
+-
+- while (ret == MATCH_YES)
++ if (gwv == GOMP_DIM_GANG)
+ {
+- if (gfc_match (" static :") == MATCH_YES)
++ /* The gang clause accepts two optional arguments, num and static.
++ The num argument may either be explicit (num: <val>) or
++ implicit without (<val> without num:). */
++
++ while (ret == MATCH_YES)
+ {
+- if (cp->gang_static)
+- return MATCH_ERROR;
++ if (gfc_match (" static :") == MATCH_YES)
++ {
++ if (cp->gang_static)
++ return MATCH_ERROR;
++ else
++ cp->gang_static = true;
++ if (gfc_match_char ('*') == MATCH_YES)
++ cp->gang_static_expr = NULL;
++ else if (gfc_match (" %e ", &cp->gang_static_expr) != MATCH_YES)
++ return MATCH_ERROR;
++ }
+ else
+- cp->gang_static = true;
+- if (gfc_match_char ('*') == MATCH_YES)
+- cp->gang_static_expr = NULL;
+- else if (gfc_match (" %e ", &cp->gang_static_expr) != MATCH_YES)
+- return MATCH_ERROR;
+- }
+- else
+- {
+- /* This is optional. */
+- if (cp->gang_num_expr || gfc_match (" num :") == MATCH_ERROR)
+- return MATCH_ERROR;
+- else if (gfc_match (" %e ", &cp->gang_num_expr) != MATCH_YES)
+- return MATCH_ERROR;
++ {
++ if (cp->gang_num_expr)
++ return MATCH_ERROR;
++
++ /* The 'num' argument is optional. */
++ gfc_match (" num :");
++
++ if (gfc_match (" %e ", &cp->gang_num_expr) != MATCH_YES)
++ return MATCH_ERROR;
++ }
++
++ ret = gfc_match (" , ");
+ }
++ }
++ else if (gwv == GOMP_DIM_WORKER)
++ {
++ /* The 'num' argument is optional. */
++ gfc_match (" num :");
+
+- ret = gfc_match (" , ");
++ if (gfc_match (" %e ", &cp->worker_expr) != MATCH_YES)
++ return MATCH_ERROR;
+ }
++ else if (gwv == GOMP_DIM_VECTOR)
++ {
++ /* The 'length' argument is optional. */
++ gfc_match (" length :");
++
++ if (gfc_match (" %e ", &cp->vector_expr) != MATCH_YES)
++ return MATCH_ERROR;
++ }
++ else
++ gfc_fatal_error ("Unexpected OpenACC parallelism.");
+
+- return gfc_match (" ) ");
++ return gfc_match (" )");
+ }
+
+ static match
+@@ -640,17 +664,25 @@
+ needs_space = false;
+ first = false;
+ gfc_gobble_whitespace ();
++ old_loc = gfc_current_locus;
+ if ((mask & OMP_CLAUSE_ASYNC) && !c->async)
+ if (gfc_match ("async") == MATCH_YES)
+ {
+ c->async = true;
+- needs_space = false;
+- if (gfc_match (" ( %e )", &c->async_expr) != MATCH_YES)
++ match m = gfc_match (" ( %e )", &c->async_expr);
++ if (m == MATCH_ERROR)
+ {
+- c->async_expr = gfc_get_constant_expr (BT_INTEGER,
+- gfc_default_integer_kind,
+- &gfc_current_locus);
++ gfc_current_locus = old_loc;
++ break;
++ }
++ else if (m == MATCH_NO)
++ {
++ c->async_expr
++ = gfc_get_constant_expr (BT_INTEGER,
++ gfc_default_integer_kind,
++ &gfc_current_locus);
+ mpz_set_si (c->async_expr->value.integer, GOMP_ASYNC_NOVAL);
++ needs_space = true;
+ }
+ continue;
+ }
+@@ -658,9 +690,13 @@
+ if (gfc_match ("gang") == MATCH_YES)
+ {
+ c->gang = true;
+- if (match_oacc_clause_gang(c) == MATCH_YES)
+- needs_space = false;
+- else
++ match m = match_oacc_clause_gwv (c, GOMP_DIM_GANG);
++ if (m == MATCH_ERROR)
++ {
++ gfc_current_locus = old_loc;
++ break;
++ }
++ else if (m == MATCH_NO)
+ needs_space = true;
+ continue;
+ }
+@@ -668,10 +704,13 @@
+ if (gfc_match ("worker") == MATCH_YES)
+ {
+ c->worker = true;
+- if (gfc_match (" ( num : %e )", &c->worker_expr) == MATCH_YES
+- || gfc_match (" ( %e )", &c->worker_expr) == MATCH_YES)
+- needs_space = false;
+- else
++ match m = match_oacc_clause_gwv (c, GOMP_DIM_WORKER);
++ if (m == MATCH_ERROR)
++ {
++ gfc_current_locus = old_loc;
++ break;
++ }
++ else if (m == MATCH_NO)
+ needs_space = true;
+ continue;
+ }
+@@ -683,10 +722,13 @@
+ if (gfc_match ("vector") == MATCH_YES)
+ {
+ c->vector = true;
+- if (gfc_match (" ( length : %e )", &c->vector_expr) == MATCH_YES
+- || gfc_match (" ( %e )", &c->vector_expr) == MATCH_YES)
+- needs_space = false;
+- else
++ match m = match_oacc_clause_gwv (c, GOMP_DIM_VECTOR);
++ if (m == MATCH_ERROR)
++ {
++ gfc_current_locus = old_loc;
++ break;
++ }
++ if (m == MATCH_NO)
+ needs_space = true;
+ continue;
+ }
+@@ -883,10 +925,16 @@
+ && gfc_match ("wait") == MATCH_YES)
+ {
+ c->wait = true;
+- match_oacc_expr_list (" (", &c->wait_list, false);
++ match m = match_oacc_expr_list (" (", &c->wait_list, false);
++ if (m == MATCH_ERROR)
++ {
++ gfc_current_locus = old_loc;
++ break;
++ }
++ else if (m == MATCH_NO)
++ needs_space = true;
+ continue;
+ }
+- old_loc = gfc_current_locus;
+ if ((mask & OMP_CLAUSE_REDUCTION)
+ && gfc_match ("reduction ( ") == MATCH_YES)
+ {
+@@ -1582,15 +1630,18 @@
+ {
+ gfc_omp_clauses *c = gfc_get_omp_clauses ();
+ gfc_expr_list *wait_list = NULL, *el;
++ bool space = true;
++ match m;
+
+- match_oacc_expr_list (" (", &wait_list, true);
+- gfc_match_omp_clauses (&c, OACC_WAIT_CLAUSES, false, false, true);
++ m = match_oacc_expr_list (" (", &wait_list, true);
++ if (m == MATCH_ERROR)
++ return m;
++ else if (m == MATCH_YES)
++ space = false;
+
+- if (gfc_match_omp_eos () != MATCH_YES)
+- {
+- gfc_error ("Unexpected junk in !$ACC WAIT at %C");
+- return MATCH_ERROR;
+- }
++ if (gfc_match_omp_clauses (&c, OACC_WAIT_CLAUSES, space, space, true)
++ == MATCH_ERROR)
++ return MATCH_ERROR;
+
+ if (wait_list)
+ for (el = wait_list; el; el = el->next)
+@@ -1623,6 +1674,10 @@
+ gfc_match_oacc_cache (void)
+ {
+ gfc_omp_clauses *c = gfc_get_omp_clauses ();
++ /* The OpenACC cache directive explicitly only allows "array elements or
++ subarrays", which we're currently not checking here. Either check this
++ after the call of gfc_match_omp_variable_list, or add something like a
++ only_sections variant next to its allow_sections parameter. */
+ match m = gfc_match_omp_variable_list (" (",
+ &c->lists[OMP_LIST_CACHE], true,
+ NULL, NULL, true);
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/fortran/options.c gcc-6-20160721/gcc/fortran/options.c
+--- gcc-6.1.0/gcc/fortran/options.c 2016-03-13 00:19:08.000000000 +0000
++++ gcc-6-20160721/gcc/fortran/options.c 2016-05-14 19:52:46.000000000 +0000
+@@ -47,6 +47,15 @@
+ }
+
+
++/* Set all the DEC extension flags. */
++
++static void
++set_dec_flags (int value)
++{
++ gfc_option.flag_dec_structure = value;
++}
++
++
+ /* Return language mask for Fortran options. */
+
+ unsigned int
+@@ -102,6 +111,8 @@
+ if (!global_options_set.x_cpp_warn_missing_include_dirs)
+ global_options.x_cpp_warn_missing_include_dirs = 1;
+
++ set_dec_flags (0);
++
+ set_default_std_flags ();
+
+ /* Initialize cpp-related options. */
+@@ -709,6 +720,15 @@
+ case OPT_fcheck_:
+ gfc_handle_runtime_check_option (arg);
+ break;
++
++ case OPT_fdec:
++ /* Enable all DEC extensions. */
++ set_dec_flags (1);
++ break;
++
++ case OPT_fdec_structure:
++ gfc_option.flag_dec_structure = 1;
++ break;
+ }
+
+ Fortran_handle_option_auto (&global_options, &global_options_set,
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/fortran/parse.c gcc-6-20160721/gcc/fortran/parse.c
+--- gcc-6.1.0/gcc/fortran/parse.c 2016-02-11 16:48:45.000000000 +0000
++++ gcc-6-20160721/gcc/fortran/parse.c 2016-07-08 21:27:22.000000000 +0000
+@@ -256,6 +256,7 @@
+
+ case 's':
+ match ("save", gfc_match_save, ST_ATTR_DECL);
++ match ("structure", gfc_match_structure_decl, ST_STRUCTURE_DECL);
+ break;
+
+ case 't':
+@@ -507,6 +508,7 @@
+ break;
+
+ case 'm':
++ match ("map", gfc_match_map, ST_MAP);
+ match ("module% procedure", gfc_match_modproc, ST_MODULE_PROC);
+ match ("module", gfc_match_module, ST_MODULE);
+ break;
+@@ -542,6 +544,7 @@
+ break;
+
+ case 's':
++ match ("structure", gfc_match_structure_decl, ST_STRUCTURE_DECL);
+ match ("sequence", gfc_match_eos, ST_SEQUENCE);
+ match ("stop", gfc_match_stop, ST_STOP);
+ match ("save", gfc_match_save, ST_ATTR_DECL);
+@@ -558,6 +561,7 @@
+ break;
+
+ case 'u':
++ match ("union", gfc_match_union, ST_UNION);
+ match ("unlock", gfc_match_unlock, ST_UNLOCK);
+ break;
+
+@@ -585,21 +589,12 @@
+ return ST_NONE;
+ }
+
+-/* Like match, but set a flag simd_matched if keyword matched. */
+-#define matchs(keyword, subr, st) \
+- do { \
+- if (match_word_omp_simd (keyword, subr, &old_locus, \
+- &simd_matched) == MATCH_YES) \
+- return st; \
+- else \
+- undo_new_statement (); \
+- } while (0);
+-
+-/* Like match, but don't match anything if not -fopenmp. */
+-#define matcho(keyword, subr, st) \
++/* Like match and if spec_only, goto do_spec_only without actually
++ matching. */
++#define matcha(keyword, subr, st) \
+ do { \
+- if (!flag_openmp) \
+- ; \
++ if (spec_only && gfc_match (keyword) == MATCH_YES) \
++ goto do_spec_only; \
+ else if (match_word (keyword, subr, &old_locus) \
+ == MATCH_YES) \
+ return st; \
+@@ -612,6 +607,7 @@
+ {
+ locus old_locus;
+ char c;
++ bool spec_only = false;
+
+ gfc_enforce_clean_symbol_state ();
+
+@@ -626,6 +622,10 @@
+ return ST_NONE;
+ }
+
++ if (gfc_current_state () == COMP_FUNCTION
++ && gfc_current_block ()->result->ts.kind == -1)
++ spec_only = true;
++
+ gfc_unset_implicit_pure (NULL);
+
+ old_locus = gfc_current_locus;
+@@ -639,49 +639,52 @@
+ switch (c)
+ {
+ case 'a':
+- match ("atomic", gfc_match_oacc_atomic, ST_OACC_ATOMIC);
++ matcha ("atomic", gfc_match_oacc_atomic, ST_OACC_ATOMIC);
+ break;
+ case 'c':
+- match ("cache", gfc_match_oacc_cache, ST_OACC_CACHE);
++ matcha ("cache", gfc_match_oacc_cache, ST_OACC_CACHE);
+ break;
+ case 'd':
+- match ("data", gfc_match_oacc_data, ST_OACC_DATA);
++ matcha ("data", gfc_match_oacc_data, ST_OACC_DATA);
+ match ("declare", gfc_match_oacc_declare, ST_OACC_DECLARE);
+ break;
+ case 'e':
+- match ("end atomic", gfc_match_omp_eos, ST_OACC_END_ATOMIC);
+- match ("end data", gfc_match_omp_eos, ST_OACC_END_DATA);
+- match ("end host_data", gfc_match_omp_eos, ST_OACC_END_HOST_DATA);
+- match ("end kernels loop", gfc_match_omp_eos, ST_OACC_END_KERNELS_LOOP);
+- match ("end kernels", gfc_match_omp_eos, ST_OACC_END_KERNELS);
+- match ("end loop", gfc_match_omp_eos, ST_OACC_END_LOOP);
+- match ("end parallel loop", gfc_match_omp_eos, ST_OACC_END_PARALLEL_LOOP);
+- match ("end parallel", gfc_match_omp_eos, ST_OACC_END_PARALLEL);
+- match ("enter data", gfc_match_oacc_enter_data, ST_OACC_ENTER_DATA);
+- match ("exit data", gfc_match_oacc_exit_data, ST_OACC_EXIT_DATA);
++ matcha ("end atomic", gfc_match_omp_eos, ST_OACC_END_ATOMIC);
++ matcha ("end data", gfc_match_omp_eos, ST_OACC_END_DATA);
++ matcha ("end host_data", gfc_match_omp_eos, ST_OACC_END_HOST_DATA);
++ matcha ("end kernels loop", gfc_match_omp_eos, ST_OACC_END_KERNELS_LOOP);
++ matcha ("end kernels", gfc_match_omp_eos, ST_OACC_END_KERNELS);
++ matcha ("end loop", gfc_match_omp_eos, ST_OACC_END_LOOP);
++ matcha ("end parallel loop", gfc_match_omp_eos,
++ ST_OACC_END_PARALLEL_LOOP);
++ matcha ("end parallel", gfc_match_omp_eos, ST_OACC_END_PARALLEL);
++ matcha ("enter data", gfc_match_oacc_enter_data, ST_OACC_ENTER_DATA);
++ matcha ("exit data", gfc_match_oacc_exit_data, ST_OACC_EXIT_DATA);
+ break;
+ case 'h':
+- match ("host_data", gfc_match_oacc_host_data, ST_OACC_HOST_DATA);
++ matcha ("host_data", gfc_match_oacc_host_data, ST_OACC_HOST_DATA);
+ break;
+ case 'p':
+- match ("parallel loop", gfc_match_oacc_parallel_loop, ST_OACC_PARALLEL_LOOP);
+- match ("parallel", gfc_match_oacc_parallel, ST_OACC_PARALLEL);
++ matcha ("parallel loop", gfc_match_oacc_parallel_loop,
++ ST_OACC_PARALLEL_LOOP);
++ matcha ("parallel", gfc_match_oacc_parallel, ST_OACC_PARALLEL);
+ break;
+ case 'k':
+- match ("kernels loop", gfc_match_oacc_kernels_loop, ST_OACC_KERNELS_LOOP);
+- match ("kernels", gfc_match_oacc_kernels, ST_OACC_KERNELS);
++ matcha ("kernels loop", gfc_match_oacc_kernels_loop,
++ ST_OACC_KERNELS_LOOP);
++ matcha ("kernels", gfc_match_oacc_kernels, ST_OACC_KERNELS);
+ break;
+ case 'l':
+- match ("loop", gfc_match_oacc_loop, ST_OACC_LOOP);
++ matcha ("loop", gfc_match_oacc_loop, ST_OACC_LOOP);
+ break;
+ case 'r':
+ match ("routine", gfc_match_oacc_routine, ST_OACC_ROUTINE);
+ break;
+ case 'u':
+- match ("update", gfc_match_oacc_update, ST_OACC_UPDATE);
++ matcha ("update", gfc_match_oacc_update, ST_OACC_UPDATE);
+ break;
+ case 'w':
+- match ("wait", gfc_match_oacc_wait, ST_OACC_WAIT);
++ matcha ("wait", gfc_match_oacc_wait, ST_OACC_WAIT);
+ break;
+ }
+
+@@ -696,14 +699,72 @@
+ gfc_error_recovery ();
+
+ return ST_NONE;
++
++ do_spec_only:
++ reject_statement ();
++ gfc_clear_error ();
++ gfc_buffer_error (false);
++ gfc_current_locus = old_locus;
++ return ST_GET_FCN_CHARACTERISTICS;
+ }
+
++/* Like match, but set a flag simd_matched if keyword matched
++ and if spec_only, goto do_spec_only without actually matching. */
++#define matchs(keyword, subr, st) \
++ do { \
++ if (spec_only && gfc_match (keyword) == MATCH_YES) \
++ goto do_spec_only; \
++ if (match_word_omp_simd (keyword, subr, &old_locus, \
++ &simd_matched) == MATCH_YES) \
++ return st; \
++ else \
++ undo_new_statement (); \
++ } while (0);
++
++/* Like match, but don't match anything if not -fopenmp
++ and if spec_only, goto do_spec_only without actually matching. */
++#define matcho(keyword, subr, st) \
++ do { \
++ if (!flag_openmp) \
++ ; \
++ else if (spec_only && gfc_match (keyword) == MATCH_YES) \
++ goto do_spec_only; \
++ else if (match_word (keyword, subr, &old_locus) \
++ == MATCH_YES) \
++ return st; \
++ else \
++ undo_new_statement (); \
++ } while (0);
++
++/* Like match, but set a flag simd_matched if keyword matched. */
++#define matchds(keyword, subr, st) \
++ do { \
++ if (match_word_omp_simd (keyword, subr, &old_locus, \
++ &simd_matched) == MATCH_YES) \
++ return st; \
++ else \
++ undo_new_statement (); \
++ } while (0);
++
++/* Like match, but don't match anything if not -fopenmp. */
++#define matchdo(keyword, subr, st) \
++ do { \
++ if (!flag_openmp) \
++ ; \
++ else if (match_word (keyword, subr, &old_locus) \
++ == MATCH_YES) \
++ return st; \
++ else \
++ undo_new_statement (); \
++ } while (0);
++
+ static gfc_statement
+ decode_omp_directive (void)
+ {
+ locus old_locus;
+ char c;
+ bool simd_matched = false;
++ bool spec_only = false;
+
+ gfc_enforce_clean_symbol_state ();
+
+@@ -718,6 +779,10 @@
+ return ST_NONE;
+ }
+
++ if (gfc_current_state () == COMP_FUNCTION
++ && gfc_current_block ()->result->ts.kind == -1)
++ spec_only = true;
++
+ gfc_unset_implicit_pure (NULL);
+
+ old_locus = gfc_current_locus;
+@@ -746,12 +811,12 @@
+ matcho ("critical", gfc_match_omp_critical, ST_OMP_CRITICAL);
+ break;
+ case 'd':
+- matchs ("declare reduction", gfc_match_omp_declare_reduction,
+- ST_OMP_DECLARE_REDUCTION);
+- matchs ("declare simd", gfc_match_omp_declare_simd,
+- ST_OMP_DECLARE_SIMD);
+- matcho ("declare target", gfc_match_omp_declare_target,
+- ST_OMP_DECLARE_TARGET);
++ matchds ("declare reduction", gfc_match_omp_declare_reduction,
++ ST_OMP_DECLARE_REDUCTION);
++ matchds ("declare simd", gfc_match_omp_declare_simd,
++ ST_OMP_DECLARE_SIMD);
++ matchdo ("declare target", gfc_match_omp_declare_target,
++ ST_OMP_DECLARE_TARGET);
+ matchs ("distribute parallel do simd",
+ gfc_match_omp_distribute_parallel_do_simd,
+ ST_OMP_DISTRIBUTE_PARALLEL_DO_SIMD);
+@@ -871,8 +936,8 @@
+ matcho ("teams distribute", gfc_match_omp_teams_distribute,
+ ST_OMP_TEAMS_DISTRIBUTE);
+ matcho ("teams", gfc_match_omp_teams, ST_OMP_TEAMS);
+- matcho ("threadprivate", gfc_match_omp_threadprivate,
+- ST_OMP_THREADPRIVATE);
++ matchdo ("threadprivate", gfc_match_omp_threadprivate,
++ ST_OMP_THREADPRIVATE);
+ break;
+ case 'w':
+ matcho ("workshare", gfc_match_omp_workshare, ST_OMP_WORKSHARE);
+@@ -895,6 +960,13 @@
+ gfc_error_recovery ();
+
+ return ST_NONE;
++
++ do_spec_only:
++ reject_statement ();
++ gfc_clear_error ();
++ gfc_buffer_error (false);
++ gfc_current_locus = old_locus;
++ return ST_GET_FCN_CHARACTERISTICS;
+ }
+
+ static gfc_statement
+@@ -1315,10 +1387,13 @@
+
+ gfc_buffer_error (false);
+
+- if (st == ST_GET_FCN_CHARACTERISTICS && gfc_statement_label != NULL)
++ if (st == ST_GET_FCN_CHARACTERISTICS)
+ {
+- gfc_free_st_label (gfc_statement_label);
+- gfc_statement_label = NULL;
++ if (gfc_statement_label != NULL)
++ {
++ gfc_free_st_label (gfc_statement_label);
++ gfc_statement_label = NULL;
++ }
+ gfc_current_locus = old_locus;
+ }
+
+@@ -1386,9 +1461,13 @@
+
+ #define case_decl case ST_ATTR_DECL: case ST_COMMON: case ST_DATA_DECL: \
+ case ST_EQUIVALENCE: case ST_NAMELIST: case ST_STATEMENT_FUNCTION: \
+- case ST_TYPE: case ST_INTERFACE: case ST_OMP_THREADPRIVATE: \
+- case ST_PROCEDURE: case ST_OMP_DECLARE_SIMD: case ST_OMP_DECLARE_REDUCTION: \
+- case ST_OMP_DECLARE_TARGET: case ST_OACC_ROUTINE: case ST_OACC_DECLARE
++ case ST_TYPE: case ST_INTERFACE: case ST_PROCEDURE: case ST_OACC_ROUTINE: \
++ case ST_OACC_DECLARE
++
++/* OpenMP declaration statements. */
++
++#define case_omp_decl case ST_OMP_THREADPRIVATE: case ST_OMP_DECLARE_SIMD: \
++ case ST_OMP_DECLARE_TARGET: case ST_OMP_DECLARE_REDUCTION
+
+ /* Block end statements. Errors associated with interchanging these
+ are detected in gfc_match_end(). */
+@@ -1642,6 +1721,15 @@
+ case ST_DEALLOCATE:
+ p = "DEALLOCATE";
+ break;
++ case ST_MAP:
++ p = "MAP";
++ break;
++ case ST_UNION:
++ p = "UNION";
++ break;
++ case ST_STRUCTURE_DECL:
++ p = "STRUCTURE";
++ break;
+ case ST_DERIVED_DECL:
+ p = _("derived type declaration");
+ break;
+@@ -1711,6 +1799,15 @@
+ case ST_END_WHERE:
+ p = "END WHERE";
+ break;
++ case ST_END_STRUCTURE:
++ p = "END STRUCTURE";
++ break;
++ case ST_END_UNION:
++ p = "END UNION";
++ break;
++ case ST_END_MAP:
++ p = "END MAP";
++ break;
+ case ST_END_TYPE:
+ p = "END TYPE";
+ break;
+@@ -2457,6 +2554,7 @@
+
+ case ST_PUBLIC:
+ case ST_PRIVATE:
++ case ST_STRUCTURE_DECL:
+ case ST_DERIVED_DECL:
+ case_decl:
+ if (p->state >= ORDER_EXEC)
+@@ -2465,6 +2563,14 @@
+ p->state = ORDER_SPEC;
+ break;
+
++ case_omp_decl:
++ /* The OpenMP directives have to be somewhere in the specification
++ part, but there are no further requirements on their ordering.
++ Thus don't adjust p->state, just ignore them. */
++ if (p->state >= ORDER_EXEC)
++ goto order;
++ break;
++
+ case_executable:
+ case_exec_markers:
+ if (p->state < ORDER_EXEC)
+@@ -2646,6 +2752,358 @@
+ }
+
+
++/* Set attributes for the parent symbol based on the attributes of a component
++ and raise errors if conflicting attributes are found for the component. */
++
++static void
++check_component (gfc_symbol *sym, gfc_component *c, gfc_component **lockp,
++ gfc_component **eventp)
++{
++ bool coarray, lock_type, event_type, allocatable, pointer;
++ coarray = lock_type = event_type = allocatable = pointer = false;
++ gfc_component *lock_comp = NULL, *event_comp = NULL;
++
++ if (lockp) lock_comp = *lockp;
++ if (eventp) event_comp = *eventp;
++
++ /* Look for allocatable components. */
++ if (c->attr.allocatable
++ || (c->ts.type == BT_CLASS && c->attr.class_ok
++ && CLASS_DATA (c)->attr.allocatable)
++ || (c->ts.type == BT_DERIVED && !c->attr.pointer
++ && c->ts.u.derived->attr.alloc_comp))
++ {
++ allocatable = true;
++ sym->attr.alloc_comp = 1;
++ }
++
++ /* Look for pointer components. */
++ if (c->attr.pointer
++ || (c->ts.type == BT_CLASS && c->attr.class_ok
++ && CLASS_DATA (c)->attr.class_pointer)
++ || (c->ts.type == BT_DERIVED && c->ts.u.derived->attr.pointer_comp))
++ {
++ pointer = true;
++ sym->attr.pointer_comp = 1;
++ }
++
++ /* Look for procedure pointer components. */
++ if (c->attr.proc_pointer
++ || (c->ts.type == BT_DERIVED
++ && c->ts.u.derived->attr.proc_pointer_comp))
++ sym->attr.proc_pointer_comp = 1;
++
++ /* Looking for coarray components. */
++ if (c->attr.codimension
++ || (c->ts.type == BT_CLASS && c->attr.class_ok
++ && CLASS_DATA (c)->attr.codimension))
++ {
++ coarray = true;
++ sym->attr.coarray_comp = 1;
++ }
++
++ if (c->ts.type == BT_DERIVED && c->ts.u.derived->attr.coarray_comp
++ && !c->attr.pointer)
++ {
++ coarray = true;
++ sym->attr.coarray_comp = 1;
++ }
++
++ /* Looking for lock_type components. */
++ if ((c->ts.type == BT_DERIVED
++ && c->ts.u.derived->from_intmod == INTMOD_ISO_FORTRAN_ENV
++ && c->ts.u.derived->intmod_sym_id == ISOFORTRAN_LOCK_TYPE)
++ || (c->ts.type == BT_CLASS && c->attr.class_ok
++ && CLASS_DATA (c)->ts.u.derived->from_intmod
++ == INTMOD_ISO_FORTRAN_ENV
++ && CLASS_DATA (c)->ts.u.derived->intmod_sym_id
++ == ISOFORTRAN_LOCK_TYPE)
++ || (c->ts.type == BT_DERIVED && c->ts.u.derived->attr.lock_comp
++ && !allocatable && !pointer))
++ {
++ lock_type = 1;
++ lock_comp = c;
++ sym->attr.lock_comp = 1;
++ }
++
++ /* Looking for event_type components. */
++ if ((c->ts.type == BT_DERIVED
++ && c->ts.u.derived->from_intmod == INTMOD_ISO_FORTRAN_ENV
++ && c->ts.u.derived->intmod_sym_id == ISOFORTRAN_EVENT_TYPE)
++ || (c->ts.type == BT_CLASS && c->attr.class_ok
++ && CLASS_DATA (c)->ts.u.derived->from_intmod
++ == INTMOD_ISO_FORTRAN_ENV
++ && CLASS_DATA (c)->ts.u.derived->intmod_sym_id
++ == ISOFORTRAN_EVENT_TYPE)
++ || (c->ts.type == BT_DERIVED && c->ts.u.derived->attr.event_comp
++ && !allocatable && !pointer))
++ {
++ event_type = 1;
++ event_comp = c;
++ sym->attr.event_comp = 1;
++ }
++
++ /* Check for F2008, C1302 - and recall that pointers may not be coarrays
++ (5.3.14) and that subobjects of coarray are coarray themselves (2.4.7),
++ unless there are nondirect [allocatable or pointer] components
++ involved (cf. 1.3.33.1 and 1.3.33.3). */
++
++ if (pointer && !coarray && lock_type)
++ gfc_error ("Component %s at %L of type LOCK_TYPE must have a "
++ "codimension or be a subcomponent of a coarray, "
++ "which is not possible as the component has the "
++ "pointer attribute", c->name, &c->loc);
++ else if (pointer && !coarray && c->ts.type == BT_DERIVED
++ && c->ts.u.derived->attr.lock_comp)
++ gfc_error ("Pointer component %s at %L has a noncoarray subcomponent "
++ "of type LOCK_TYPE, which must have a codimension or be a "
++ "subcomponent of a coarray", c->name, &c->loc);
++
++ if (lock_type && allocatable && !coarray)
++ gfc_error ("Allocatable component %s at %L of type LOCK_TYPE must have "
++ "a codimension", c->name, &c->loc);
++ else if (lock_type && allocatable && c->ts.type == BT_DERIVED
++ && c->ts.u.derived->attr.lock_comp)
++ gfc_error ("Allocatable component %s at %L must have a codimension as "
++ "it has a noncoarray subcomponent of type LOCK_TYPE",
++ c->name, &c->loc);
++
++ if (sym->attr.coarray_comp && !coarray && lock_type)
++ gfc_error ("Noncoarray component %s at %L of type LOCK_TYPE or with "
++ "subcomponent of type LOCK_TYPE must have a codimension or "
++ "be a subcomponent of a coarray. (Variables of type %s may "
++ "not have a codimension as already a coarray "
++ "subcomponent exists)", c->name, &c->loc, sym->name);
++
++ if (sym->attr.lock_comp && coarray && !lock_type)
++ gfc_error ("Noncoarray component %s at %L of type LOCK_TYPE or with "
++ "subcomponent of type LOCK_TYPE must have a codimension or "
++ "be a subcomponent of a coarray. (Variables of type %s may "
++ "not have a codimension as %s at %L has a codimension or a "
++ "coarray subcomponent)", lock_comp->name, &lock_comp->loc,
++ sym->name, c->name, &c->loc);
++
++ /* Similarly for EVENT TYPE. */
++
++ if (pointer && !coarray && event_type)
++ gfc_error ("Component %s at %L of type EVENT_TYPE must have a "
++ "codimension or be a subcomponent of a coarray, "
++ "which is not possible as the component has the "
++ "pointer attribute", c->name, &c->loc);
++ else if (pointer && !coarray && c->ts.type == BT_DERIVED
++ && c->ts.u.derived->attr.event_comp)
++ gfc_error ("Pointer component %s at %L has a noncoarray subcomponent "
++ "of type EVENT_TYPE, which must have a codimension or be a "
++ "subcomponent of a coarray", c->name, &c->loc);
++
++ if (event_type && allocatable && !coarray)
++ gfc_error ("Allocatable component %s at %L of type EVENT_TYPE must have "
++ "a codimension", c->name, &c->loc);
++ else if (event_type && allocatable && c->ts.type == BT_DERIVED
++ && c->ts.u.derived->attr.event_comp)
++ gfc_error ("Allocatable component %s at %L must have a codimension as "
++ "it has a noncoarray subcomponent of type EVENT_TYPE",
++ c->name, &c->loc);
++
++ if (sym->attr.coarray_comp && !coarray && event_type)
++ gfc_error ("Noncoarray component %s at %L of type EVENT_TYPE or with "
++ "subcomponent of type EVENT_TYPE must have a codimension or "
++ "be a subcomponent of a coarray. (Variables of type %s may "
++ "not have a codimension as already a coarray "
++ "subcomponent exists)", c->name, &c->loc, sym->name);
++
++ if (sym->attr.event_comp && coarray && !event_type)
++ gfc_error ("Noncoarray component %s at %L of type EVENT_TYPE or with "
++ "subcomponent of type EVENT_TYPE must have a codimension or "
++ "be a subcomponent of a coarray. (Variables of type %s may "
++ "not have a codimension as %s at %L has a codimension or a "
++ "coarray subcomponent)", event_comp->name, &event_comp->loc,
++ sym->name, c->name, &c->loc);
++
++ /* Look for private components. */
++ if (sym->component_access == ACCESS_PRIVATE
++ || c->attr.access == ACCESS_PRIVATE
++ || (c->ts.type == BT_DERIVED && c->ts.u.derived->attr.private_comp))
++ sym->attr.private_comp = 1;
++
++ if (lockp) *lockp = lock_comp;
++ if (eventp) *eventp = event_comp;
++}
++
++
++static void parse_struct_map (gfc_statement);
++
++/* Parse a union component definition within a structure definition. */
++
++static void
++parse_union (void)
++{
++ int compiling;
++ gfc_statement st;
++ gfc_state_data s;
++ gfc_component *c, *lock_comp = NULL, *event_comp = NULL;
++ gfc_symbol *un;
++
++ accept_statement(ST_UNION);
++ push_state (&s, COMP_UNION, gfc_new_block);
++ un = gfc_new_block;
++
++ compiling = 1;
++
++ while (compiling)
++ {
++ st = next_statement ();
++ /* Only MAP declarations valid within a union. */
++ switch (st)
++ {
++ case ST_NONE:
++ unexpected_eof ();
++
++ case ST_MAP:
++ accept_statement (ST_MAP);
++ parse_struct_map (ST_MAP);
++ /* Add a component to the union for each map. */
++ if (!gfc_add_component (un, gfc_new_block->name, &c))
++ {
++ gfc_internal_error ("failed to create map component '%s'",
++ gfc_new_block->name);
++ reject_statement ();
++ return;
++ }
++ c->ts.type = BT_DERIVED;
++ c->ts.u.derived = gfc_new_block;
++ /* Normally components get their initialization expressions when they
++ are created in decl.c (build_struct) so we can look through the
++ flat component list for initializers during resolution. Unions and
++ maps create components along with their type definitions so we
++ have to generate initializers here. */
++ c->initializer = gfc_default_initializer (&c->ts);
++ break;
++
++ case ST_END_UNION:
++ compiling = 0;
++ accept_statement (ST_END_UNION);
++ break;
++
++ default:
++ unexpected_statement (st);
++ break;
++ }
++ }
++
++ for (c = un->components; c; c = c->next)
++ check_component (un, c, &lock_comp, &event_comp);
++
++ /* Add the union as a component in its parent structure. */
++ pop_state ();
++ if (!gfc_add_component (gfc_current_block (), un->name, &c))
++ {
++ gfc_internal_error ("failed to create union component '%s'", un->name);
++ reject_statement ();
++ return;
++ }
++ c->ts.type = BT_UNION;
++ c->ts.u.derived = un;
++ c->initializer = gfc_default_initializer (&c->ts);
++
++ un->attr.zero_comp = un->components == NULL;
++}
++
++
++/* Parse a STRUCTURE or MAP. */
++
++static void
++parse_struct_map (gfc_statement block)
++{
++ int compiling_type;
++ gfc_statement st;
++ gfc_state_data s;
++ gfc_symbol *sym;
++ gfc_component *c, *lock_comp = NULL, *event_comp = NULL;
++ gfc_compile_state comp;
++ gfc_statement ends;
++
++ if (block == ST_STRUCTURE_DECL)
++ {
++ comp = COMP_STRUCTURE;
++ ends = ST_END_STRUCTURE;
++ }
++ else
++ {
++ gcc_assert (block == ST_MAP);
++ comp = COMP_MAP;
++ ends = ST_END_MAP;
++ }
++
++ accept_statement(block);
++ push_state (&s, comp, gfc_new_block);
++
++ gfc_new_block->component_access = ACCESS_PUBLIC;
++ compiling_type = 1;
++
++ while (compiling_type)
++ {
++ st = next_statement ();
++ switch (st)
++ {
++ case ST_NONE:
++ unexpected_eof ();
++
++ /* Nested structure declarations will be captured as ST_DATA_DECL. */
++ case ST_STRUCTURE_DECL:
++ /* Let a more specific error make it to decode_statement(). */
++ if (gfc_error_check () == 0)
++ gfc_error ("Syntax error in nested structure declaration at %C");
++ reject_statement ();
++ /* Skip the rest of this statement. */
++ gfc_error_recovery ();
++ break;
++
++ case ST_UNION:
++ accept_statement (ST_UNION);
++ parse_union ();
++ break;
++
++ case ST_DATA_DECL:
++ /* The data declaration was a nested/ad-hoc STRUCTURE field. */
++ accept_statement (ST_DATA_DECL);
++ if (gfc_new_block && gfc_new_block != gfc_current_block ()
++ && gfc_new_block->attr.flavor == FL_STRUCT)
++ parse_struct_map (ST_STRUCTURE_DECL);
++ break;
++
++ case ST_END_STRUCTURE:
++ case ST_END_MAP:
++ if (st == ends)
++ {
++ accept_statement (st);
++ compiling_type = 0;
++ }
++ else
++ unexpected_statement (st);
++ break;
++
++ default:
++ unexpected_statement (st);
++ break;
++ }
++ }
++
++ /* Validate each component. */
++ sym = gfc_current_block ();
++ for (c = sym->components; c; c = c->next)
++ check_component (sym, c, &lock_comp, &event_comp);
++
++ sym->attr.zero_comp = (sym->components == NULL);
++
++ /* Allow parse_union to find this structure to add to its list of maps. */
++ if (block == ST_MAP)
++ gfc_new_block = gfc_current_block ();
++
++ pop_state ();
++}
++
++
+ /* Parse a derived type. */
+
+ static void
+@@ -2762,170 +3220,7 @@
+ */
+ sym = gfc_current_block ();
+ for (c = sym->components; c; c = c->next)
+- {
+- bool coarray, lock_type, event_type, allocatable, pointer;
+- coarray = lock_type = event_type = allocatable = pointer = false;
+-
+- /* Look for allocatable components. */
+- if (c->attr.allocatable
+- || (c->ts.type == BT_CLASS && c->attr.class_ok
+- && CLASS_DATA (c)->attr.allocatable)
+- || (c->ts.type == BT_DERIVED && !c->attr.pointer
+- && c->ts.u.derived->attr.alloc_comp))
+- {
+- allocatable = true;
+- sym->attr.alloc_comp = 1;
+- }
+-
+- /* Look for pointer components. */
+- if (c->attr.pointer
+- || (c->ts.type == BT_CLASS && c->attr.class_ok
+- && CLASS_DATA (c)->attr.class_pointer)
+- || (c->ts.type == BT_DERIVED && c->ts.u.derived->attr.pointer_comp))
+- {
+- pointer = true;
+- sym->attr.pointer_comp = 1;
+- }
+-
+- /* Look for procedure pointer components. */
+- if (c->attr.proc_pointer
+- || (c->ts.type == BT_DERIVED
+- && c->ts.u.derived->attr.proc_pointer_comp))
+- sym->attr.proc_pointer_comp = 1;
+-
+- /* Looking for coarray components. */
+- if (c->attr.codimension
+- || (c->ts.type == BT_CLASS && c->attr.class_ok
+- && CLASS_DATA (c)->attr.codimension))
+- {
+- coarray = true;
+- sym->attr.coarray_comp = 1;
+- }
+-
+- if (c->ts.type == BT_DERIVED && c->ts.u.derived->attr.coarray_comp
+- && !c->attr.pointer)
+- {
+- coarray = true;
+- sym->attr.coarray_comp = 1;
+- }
+-
+- /* Looking for lock_type components. */
+- if ((c->ts.type == BT_DERIVED
+- && c->ts.u.derived->from_intmod == INTMOD_ISO_FORTRAN_ENV
+- && c->ts.u.derived->intmod_sym_id == ISOFORTRAN_LOCK_TYPE)
+- || (c->ts.type == BT_CLASS && c->attr.class_ok
+- && CLASS_DATA (c)->ts.u.derived->from_intmod
+- == INTMOD_ISO_FORTRAN_ENV
+- && CLASS_DATA (c)->ts.u.derived->intmod_sym_id
+- == ISOFORTRAN_LOCK_TYPE)
+- || (c->ts.type == BT_DERIVED && c->ts.u.derived->attr.lock_comp
+- && !allocatable && !pointer))
+- {
+- lock_type = 1;
+- lock_comp = c;
+- sym->attr.lock_comp = 1;
+- }
+-
+- /* Looking for event_type components. */
+- if ((c->ts.type == BT_DERIVED
+- && c->ts.u.derived->from_intmod == INTMOD_ISO_FORTRAN_ENV
+- && c->ts.u.derived->intmod_sym_id == ISOFORTRAN_EVENT_TYPE)
+- || (c->ts.type == BT_CLASS && c->attr.class_ok
+- && CLASS_DATA (c)->ts.u.derived->from_intmod
+- == INTMOD_ISO_FORTRAN_ENV
+- && CLASS_DATA (c)->ts.u.derived->intmod_sym_id
+- == ISOFORTRAN_EVENT_TYPE)
+- || (c->ts.type == BT_DERIVED && c->ts.u.derived->attr.event_comp
+- && !allocatable && !pointer))
+- {
+- event_type = 1;
+- event_comp = c;
+- sym->attr.event_comp = 1;
+- }
+-
+- /* Check for F2008, C1302 - and recall that pointers may not be coarrays
+- (5.3.14) and that subobjects of coarray are coarray themselves (2.4.7),
+- unless there are nondirect [allocatable or pointer] components
+- involved (cf. 1.3.33.1 and 1.3.33.3). */
+-
+- if (pointer && !coarray && lock_type)
+- gfc_error ("Component %s at %L of type LOCK_TYPE must have a "
+- "codimension or be a subcomponent of a coarray, "
+- "which is not possible as the component has the "
+- "pointer attribute", c->name, &c->loc);
+- else if (pointer && !coarray && c->ts.type == BT_DERIVED
+- && c->ts.u.derived->attr.lock_comp)
+- gfc_error ("Pointer component %s at %L has a noncoarray subcomponent "
+- "of type LOCK_TYPE, which must have a codimension or be a "
+- "subcomponent of a coarray", c->name, &c->loc);
+-
+- if (lock_type && allocatable && !coarray)
+- gfc_error ("Allocatable component %s at %L of type LOCK_TYPE must have "
+- "a codimension", c->name, &c->loc);
+- else if (lock_type && allocatable && c->ts.type == BT_DERIVED
+- && c->ts.u.derived->attr.lock_comp)
+- gfc_error ("Allocatable component %s at %L must have a codimension as "
+- "it has a noncoarray subcomponent of type LOCK_TYPE",
+- c->name, &c->loc);
+-
+- if (sym->attr.coarray_comp && !coarray && lock_type)
+- gfc_error ("Noncoarray component %s at %L of type LOCK_TYPE or with "
+- "subcomponent of type LOCK_TYPE must have a codimension or "
+- "be a subcomponent of a coarray. (Variables of type %s may "
+- "not have a codimension as already a coarray "
+- "subcomponent exists)", c->name, &c->loc, sym->name);
+-
+- if (sym->attr.lock_comp && coarray && !lock_type)
+- gfc_error ("Noncoarray component %s at %L of type LOCK_TYPE or with "
+- "subcomponent of type LOCK_TYPE must have a codimension or "
+- "be a subcomponent of a coarray. (Variables of type %s may "
+- "not have a codimension as %s at %L has a codimension or a "
+- "coarray subcomponent)", lock_comp->name, &lock_comp->loc,
+- sym->name, c->name, &c->loc);
+-
+- /* Similarly for EVENT TYPE. */
+-
+- if (pointer && !coarray && event_type)
+- gfc_error ("Component %s at %L of type EVENT_TYPE must have a "
+- "codimension or be a subcomponent of a coarray, "
+- "which is not possible as the component has the "
+- "pointer attribute", c->name, &c->loc);
+- else if (pointer && !coarray && c->ts.type == BT_DERIVED
+- && c->ts.u.derived->attr.event_comp)
+- gfc_error ("Pointer component %s at %L has a noncoarray subcomponent "
+- "of type EVENT_TYPE, which must have a codimension or be a "
+- "subcomponent of a coarray", c->name, &c->loc);
+-
+- if (event_type && allocatable && !coarray)
+- gfc_error ("Allocatable component %s at %L of type EVENT_TYPE must have "
+- "a codimension", c->name, &c->loc);
+- else if (event_type && allocatable && c->ts.type == BT_DERIVED
+- && c->ts.u.derived->attr.event_comp)
+- gfc_error ("Allocatable component %s at %L must have a codimension as "
+- "it has a noncoarray subcomponent of type EVENT_TYPE",
+- c->name, &c->loc);
+-
+- if (sym->attr.coarray_comp && !coarray && event_type)
+- gfc_error ("Noncoarray component %s at %L of type EVENT_TYPE or with "
+- "subcomponent of type EVENT_TYPE must have a codimension or "
+- "be a subcomponent of a coarray. (Variables of type %s may "
+- "not have a codimension as already a coarray "
+- "subcomponent exists)", c->name, &c->loc, sym->name);
+-
+- if (sym->attr.event_comp && coarray && !event_type)
+- gfc_error ("Noncoarray component %s at %L of type EVENT_TYPE or with "
+- "subcomponent of type EVENT_TYPE must have a codimension or "
+- "be a subcomponent of a coarray. (Variables of type %s may "
+- "not have a codimension as %s at %L has a codimension or a "
+- "coarray subcomponent)", event_comp->name, &event_comp->loc,
+- sym->name, c->name, &c->loc);
+-
+- /* Look for private components. */
+- if (sym->component_access == ACCESS_PRIVATE
+- || c->attr.access == ACCESS_PRIVATE
+- || (c->ts.type == BT_DERIVED && c->ts.u.derived->attr.private_comp))
+- sym->attr.private_comp = 1;
+- }
++ check_component (sym, c, &lock_comp, &event_comp);
+
+ if (!seen_component)
+ sym->attr.zero_comp = 1;
+@@ -3348,8 +3643,10 @@
+ case ST_PARAMETER:
+ case ST_PUBLIC:
+ case ST_PRIVATE:
++ case ST_STRUCTURE_DECL:
+ case ST_DERIVED_DECL:
+ case_decl:
++ case_omp_decl:
+ declSt:
+ if (!verify_st_order (&ss, st, false))
+ {
+@@ -3364,6 +3661,10 @@
+ parse_interface ();
+ break;
+
++ case ST_STRUCTURE_DECL:
++ parse_struct_map (ST_STRUCTURE_DECL);
++ break;
++
+ case ST_DERIVED_DECL:
+ parse_derived ();
+ break;
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/fortran/parse.h gcc-6-20160721/gcc/fortran/parse.h
+--- gcc-6.1.0/gcc/fortran/parse.h 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/gcc/fortran/parse.h 2016-05-14 19:52:46.000000000 +0000
+@@ -28,6 +28,7 @@
+ COMP_NONE, COMP_PROGRAM, COMP_MODULE, COMP_SUBMODULE, COMP_SUBROUTINE,
+ COMP_FUNCTION, COMP_BLOCK_DATA, COMP_INTERFACE, COMP_DERIVED,
+ COMP_DERIVED_CONTAINS, COMP_BLOCK, COMP_ASSOCIATE, COMP_IF,
++ COMP_STRUCTURE, COMP_UNION, COMP_MAP,
+ COMP_DO, COMP_SELECT, COMP_FORALL, COMP_WHERE, COMP_CONTAINS, COMP_ENUM,
+ COMP_SELECT_TYPE, COMP_OMP_STRUCTURED_BLOCK, COMP_CRITICAL, COMP_DO_CONCURRENT
+ };
+@@ -58,6 +59,8 @@
+
+ #define gfc_current_block() (gfc_state_stack->sym)
+ #define gfc_current_state() (gfc_state_stack->state)
++#define gfc_comp_struct(s) \
++ ((s) == COMP_DERIVED || (s) == COMP_STRUCTURE || (s) == COMP_MAP)
+
+ int gfc_check_do_variable (gfc_symtree *);
+ bool gfc_find_state (gfc_compile_state);
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/fortran/primary.c gcc-6-20160721/gcc/fortran/primary.c
+--- gcc-6.1.0/gcc/fortran/primary.c 2016-02-07 20:15:55.000000000 +0000
++++ gcc-6-20160721/gcc/fortran/primary.c 2016-05-14 19:52:46.000000000 +0000
+@@ -1883,11 +1883,12 @@
+ bool ppc_arg)
+ {
+ char name[GFC_MAX_SYMBOL_LEN + 1];
+- gfc_ref *substring, *tail;
++ gfc_ref *substring, *tail, *tmp;
+ gfc_component *component;
+ gfc_symbol *sym = primary->symtree->n.sym;
+ match m;
+ bool unknown;
++ char sep;
+
+ tail = NULL;
+
+@@ -1972,25 +1973,31 @@
+ if (equiv_flag)
+ return MATCH_YES;
+
+- if (sym->ts.type == BT_UNKNOWN && gfc_peek_ascii_char () == '%'
++ /* With DEC extensions, member separator may be '.' or '%'. */
++ sep = gfc_peek_ascii_char ();
++ m = gfc_match_member_sep (sym);
++ if (m == MATCH_ERROR)
++ return MATCH_ERROR;
++
++ if (sym->ts.type == BT_UNKNOWN && m == MATCH_YES
+ && gfc_get_default_type (sym->name, sym->ns)->type == BT_DERIVED)
+ gfc_set_default_type (sym, 0, sym->ns);
+
+- if (sym->ts.type == BT_UNKNOWN && gfc_match_char ('%') == MATCH_YES)
++ if (sym->ts.type == BT_UNKNOWN && m == MATCH_YES)
+ {
+ gfc_error ("Symbol %qs at %C has no IMPLICIT type", sym->name);
+ return MATCH_ERROR;
+ }
+ else if ((sym->ts.type != BT_DERIVED && sym->ts.type != BT_CLASS)
+- && gfc_match_char ('%') == MATCH_YES)
++ && m == MATCH_YES)
+ {
+- gfc_error ("Unexpected %<%%%> for nonderived-type variable %qs at %C",
+- sym->name);
++ gfc_error ("Unexpected %<%c%> for nonderived-type variable %qs at %C",
++ sep, sym->name);
+ return MATCH_ERROR;
+ }
+
+ if ((sym->ts.type != BT_DERIVED && sym->ts.type != BT_CLASS)
+- || gfc_match_char ('%') != MATCH_YES)
++ || m != MATCH_YES)
+ goto check_substring;
+
+ sym = sym->ts.u.derived;
+@@ -2061,15 +2068,24 @@
+ break;
+ }
+
+- component = gfc_find_component (sym, name, false, false);
++ component = gfc_find_component (sym, name, false, false, &tmp);
+ if (component == NULL)
+ return MATCH_ERROR;
+
+- tail = extend_ref (primary, tail);
+- tail->type = REF_COMPONENT;
++ /* Extend the reference chain determined by gfc_find_component. */
++ if (primary->ref == NULL)
++ primary->ref = tmp;
++ else
++ {
++ /* Set by the for loop below for the last component ref. */
++ gcc_assert (tail != NULL);
++ tail->next = tmp;
++ }
+
+- tail->u.c.component = component;
+- tail->u.c.sym = sym;
++ /* The reference chain may be longer than one hop for union
++ subcomponents; find the new tail. */
++ for (tail = tmp; tail->next; tail = tail->next)
++ ;
+
+ primary->ts = component->ts;
+
+@@ -2119,7 +2135,7 @@
+ }
+
+ if ((component->ts.type != BT_DERIVED && component->ts.type != BT_CLASS)
+- || gfc_match_char ('%') != MATCH_YES)
++ || gfc_match_member_sep (component->ts.u.derived) != MATCH_YES)
+ break;
+
+ sym = component->ts.u.derived;
+@@ -2127,7 +2143,7 @@
+
+ check_substring:
+ unknown = false;
+- if (primary->ts.type == BT_UNKNOWN && sym->attr.flavor != FL_DERIVED)
++ if (primary->ts.type == BT_UNKNOWN && !gfc_fl_struct (sym->attr.flavor))
+ {
+ if (gfc_get_default_type (sym->name, sym->ns)->type == BT_CHARACTER)
+ {
+@@ -2548,11 +2564,11 @@
+ /* Find the current component in the structure definition and check
+ its access is not private. */
+ if (comp)
+- this_comp = gfc_find_component (sym, comp->name, false, false);
++ this_comp = gfc_find_component (sym, comp->name, false, false, NULL);
+ else
+ {
+ this_comp = gfc_find_component (sym, (const char *)comp_tail->name,
+- false, false);
++ false, false, NULL);
+ comp = NULL; /* Reset needed! */
+ }
+
+@@ -2596,7 +2612,7 @@
+ if (comp && comp == sym->components
+ && sym->attr.extension
+ && comp_tail->val
+- && (comp_tail->val->ts.type != BT_DERIVED
++ && (!gfc_bt_struct (comp_tail->val->ts.type)
+ ||
+ comp_tail->val->ts.u.derived != this_comp->ts.u.derived))
+ {
+@@ -2697,7 +2713,7 @@
+ e->symtree = symtree;
+ e->expr_type = EXPR_FUNCTION;
+
+- gcc_assert (sym->attr.flavor == FL_DERIVED
++ gcc_assert (gfc_fl_struct (sym->attr.flavor)
+ && symtree->n.sym->attr.flavor == FL_PROCEDURE);
+ e->value.function.esym = sym;
+ e->symtree->n.sym->attr.generic = 1;
+@@ -2795,15 +2811,29 @@
+ if (m != MATCH_YES)
+ return m;
+
+- if (gfc_find_state (COMP_INTERFACE)
+- && !gfc_current_ns->has_import_set)
+- i = gfc_get_sym_tree (name, NULL, &symtree, false);
+- else
+- i = gfc_get_ha_sym_tree (name, &symtree);
+-
+- if (i)
++ /* Check if the symbol exists. */
++ if (gfc_find_sym_tree (name, NULL, 1, &symtree))
+ return MATCH_ERROR;
+
++ /* If the symbol doesn't exist, create it unless the name matches a FL_STRUCT
++ type. For derived types we create a generic symbol which links to the
++ derived type symbol; STRUCTUREs are simpler and must not conflict with
++ variables. */
++ if (!symtree)
++ if (gfc_find_sym_tree (gfc_dt_upper_string (name), NULL, 1, &symtree))
++ return MATCH_ERROR;
++ if (!symtree || symtree->n.sym->attr.flavor != FL_STRUCT)
++ {
++ if (gfc_find_state (COMP_INTERFACE)
++ && !gfc_current_ns->has_import_set)
++ i = gfc_get_sym_tree (name, NULL, &symtree, false);
++ else
++ i = gfc_get_ha_sym_tree (name, &symtree);
++ if (i)
++ return MATCH_ERROR;
++ }
++
++
+ sym = symtree->n.sym;
+ e = NULL;
+ where = gfc_current_locus;
+@@ -2914,6 +2944,7 @@
+
+ break;
+
++ case FL_STRUCT:
+ case FL_DERIVED:
+ sym = gfc_use_derived (sym);
+ if (sym == NULL)
+@@ -3054,10 +3085,12 @@
+ via an IMPLICIT statement. This can't wait for the
+ resolution phase. */
+
+- if (gfc_peek_ascii_char () == '%'
++ old_loc = gfc_current_locus;
++ if (gfc_match_member_sep (sym) == MATCH_YES
+ && sym->ts.type == BT_UNKNOWN
+ && gfc_get_default_type (sym->name, sym->ns)->type == BT_DERIVED)
+ gfc_set_default_type (sym, 0, sym->ns);
++ gfc_current_locus = old_loc;
+
+ /* If the symbol has a (co)dimension attribute, the expression is a
+ variable. */
+@@ -3210,13 +3243,19 @@
+ break;
+
+ generic_function:
+- gfc_get_sym_tree (name, NULL, &symtree, false); /* Can't fail */
++ /* Look for symbol first; if not found, look for STRUCTURE type symbol
++ specially. Creates a generic symbol for derived types. */
++ gfc_find_sym_tree (name, NULL, 1, &symtree);
++ if (!symtree)
++ gfc_find_sym_tree (gfc_dt_upper_string (name), NULL, 1, &symtree);
++ if (!symtree || symtree->n.sym->attr.flavor != FL_STRUCT)
++ gfc_get_sym_tree (name, NULL, &symtree, false); /* Can't fail */
+
+ e = gfc_get_expr ();
+ e->symtree = symtree;
+ e->expr_type = EXPR_FUNCTION;
+
+- if (sym->attr.flavor == FL_DERIVED)
++ if (gfc_fl_struct (sym->attr.flavor))
+ {
+ e->value.function.esym = sym;
+ e->symtree->n.sym->attr.generic = 1;
+@@ -3260,10 +3299,10 @@
+ static match
+ match_variable (gfc_expr **result, int equiv_flag, int host_flag)
+ {
+- gfc_symbol *sym;
++ gfc_symbol *sym, *dt_sym;
+ gfc_symtree *st;
+ gfc_expr *expr;
+- locus where;
++ locus where, old_loc;
+ match m;
+
+ /* Since nothing has any business being an lvalue in a module
+@@ -3294,6 +3333,17 @@
+ sym->attr.implied_index = 0;
+
+ gfc_set_sym_referenced (sym);
++
++ /* STRUCTUREs may share names with variables, but derived types may not. */
++ if (sym->attr.flavor == FL_PROCEDURE && sym->generic
++ && (dt_sym = gfc_find_dt_in_generic (sym)))
++ {
++ if (dt_sym->attr.flavor == FL_DERIVED)
++ gfc_error ("Derived type '%s' cannot be used as a variable at %C",
++ sym->name);
++ return MATCH_ERROR;
++ }
++
+ switch (sym->attr.flavor)
+ {
+ case FL_VARIABLE:
+@@ -3379,11 +3429,13 @@
+ implicit_ns = gfc_current_ns;
+ else
+ implicit_ns = sym->ns;
+-
+- if (gfc_peek_ascii_char () == '%'
++
++ old_loc = gfc_current_locus;
++ if (gfc_match_member_sep (sym) == MATCH_YES
+ && sym->ts.type == BT_UNKNOWN
+ && gfc_get_default_type (sym->name, implicit_ns)->type == BT_DERIVED)
+ gfc_set_default_type (sym, 0, implicit_ns);
++ gfc_current_locus = old_loc;
+ }
+
+ expr = gfc_get_expr ();
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/fortran/resolve.c gcc-6-20160721/gcc/fortran/resolve.c
+--- gcc-6.1.0/gcc/fortran/resolve.c 2016-04-04 10:32:32.000000000 +0000
++++ gcc-6-20160721/gcc/fortran/resolve.c 2016-06-01 18:46:11.000000000 +0000
+@@ -535,7 +535,7 @@
+ find_arglists (gfc_symbol *sym)
+ {
+ if (sym->attr.if_source == IFSRC_UNKNOWN || sym->ns != gfc_current_ns
+- || sym->attr.flavor == FL_DERIVED || sym->attr.intrinsic)
++ || gfc_fl_struct (sym->attr.flavor) || sym->attr.intrinsic)
+ return;
+
+ resolve_formal_arglist (sym);
+@@ -1116,6 +1116,7 @@
+
+
+ static bool resolve_fl_derived0 (gfc_symbol *sym);
++static bool resolve_fl_struct (gfc_symbol *sym);
+
+
+ /* Resolve all of the elements of a structure constructor and make sure that
+@@ -1132,8 +1133,13 @@
+
+ t = true;
+
+- if (expr->ts.type == BT_DERIVED)
+- resolve_fl_derived0 (expr->ts.u.derived);
++ if (expr->ts.type == BT_DERIVED || expr->ts.type == BT_UNION)
++ {
++ if (expr->ts.u.derived->attr.flavor == FL_DERIVED)
++ resolve_fl_derived0 (expr->ts.u.derived);
++ else
++ resolve_fl_struct (expr->ts.u.derived);
++ }
+
+ cons = gfc_constructor_first (expr->value.constructor);
+
+@@ -1561,7 +1567,7 @@
+ gfc_namespace* real_context;
+
+ if (sym->attr.flavor == FL_PROGRAM
+- || sym->attr.flavor == FL_DERIVED)
++ || gfc_fl_struct (sym->attr.flavor))
+ return false;
+
+ gcc_assert (sym->attr.flavor == FL_PROCEDURE);
+@@ -2548,7 +2554,7 @@
+ generic:
+ if (!intr)
+ for (intr = sym->generic; intr; intr = intr->next)
+- if (intr->sym->attr.flavor == FL_DERIVED)
++ if (gfc_fl_struct (intr->sym->attr.flavor))
+ break;
+
+ if (sym->ns->parent == NULL)
+@@ -5715,7 +5721,7 @@
+ continue;
+
+ if ((ref->u.c.component->ts.type == BT_CLASS
+- || (check_types && ref->u.c.component->ts.type == BT_DERIVED))
++ || (check_types && gfc_bt_struct (ref->u.c.component->ts.type)))
+ && ref->u.c.component->attr.flavor != FL_PROCEDURE)
+ {
+ declared = ref->u.c.component->ts.u.derived;
+@@ -5978,7 +5984,7 @@
+ is present. */
+ ts = expr->ts;
+ declared = ts.u.derived;
+- c = gfc_find_component (declared, "_vptr", true, true);
++ c = gfc_find_component (declared, "_vptr", true, true, NULL);
+ if (c->ts.u.derived == NULL)
+ c->ts.u.derived = gfc_find_derived_vtab (declared);
+
+@@ -6025,14 +6031,14 @@
+ return false;
+
+ /* Weed out cases of the ultimate component being a derived type. */
+- if ((class_ref && class_ref->u.c.component->ts.type == BT_DERIVED)
++ if ((class_ref && gfc_bt_struct (class_ref->u.c.component->ts.type))
+ || (!class_ref && st->n.sym->ts.type != BT_CLASS))
+ {
+ gfc_free_ref_list (new_ref);
+ return resolve_compcall (e, NULL);
+ }
+
+- c = gfc_find_component (declared, "_data", true, true);
++ c = gfc_find_component (declared, "_data", true, true, NULL);
+ declared = c->ts.u.derived;
+
+ /* Treat the call as if it is a typebound procedure, in order to roll
+@@ -6111,7 +6117,7 @@
+ that any delays in resolution are corrected and that the vtab
+ is present. */
+ declared = expr->ts.u.derived;
+- c = gfc_find_component (declared, "_vptr", true, true);
++ c = gfc_find_component (declared, "_vptr", true, true, NULL);
+ if (c->ts.u.derived == NULL)
+ c->ts.u.derived = gfc_find_derived_vtab (declared);
+
+@@ -6156,7 +6162,7 @@
+ get_declared_from_expr (&class_ref, &new_ref, code->expr1, true);
+
+ /* Weed out cases of the ultimate component being a derived type. */
+- if ((class_ref && class_ref->u.c.component->ts.type == BT_DERIVED)
++ if ((class_ref && gfc_bt_struct (class_ref->u.c.component->ts.type))
+ || (!class_ref && st->n.sym->ts.type != BT_CLASS))
+ {
+ gfc_free_ref_list (new_ref);
+@@ -7140,7 +7146,7 @@
+ gfc_typespec ts;
+ gfc_expr *init_e;
+
+- if (code->ext.alloc.ts.type == BT_DERIVED)
++ if (gfc_bt_struct (code->ext.alloc.ts.type))
+ ts = code->ext.alloc.ts;
+ else
+ ts = e->ts;
+@@ -7148,7 +7154,7 @@
+ if (ts.type == BT_CLASS)
+ ts = ts.u.derived->components->ts;
+
+- if (ts.type == BT_DERIVED && (init_e = gfc_default_initializer (&ts)))
++ if (gfc_bt_struct (ts.type) && (init_e = gfc_default_initializer (&ts)))
+ {
+ gfc_code *init_st = gfc_get_code (EXEC_INIT_ASSIGN);
+ init_st->loc = code->loc;
+@@ -7282,7 +7288,7 @@
+ sym = a->expr->symtree->n.sym;
+
+ /* TODO - check derived type components. */
+- if (sym->ts.type == BT_DERIVED || sym->ts.type == BT_CLASS)
++ if (gfc_bt_struct (sym->ts.type) || sym->ts.type == BT_CLASS)
+ continue;
+
+ if ((ar->start[i] != NULL
+@@ -8220,7 +8226,7 @@
+ if (!gfc_build_class_symbol (&sym->ts, &attr, &as))
+ gcc_unreachable ();
+ /* Make sure the _vptr is set. */
+- c = gfc_find_component (sym->ts.u.derived, "_vptr", true, true);
++ c = gfc_find_component (sym->ts.u.derived, "_vptr", true, true, NULL);
+ if (c->ts.u.derived == NULL)
+ c->ts.u.derived = gfc_find_derived_vtab (sym->ts.u.derived);
+ CLASS_DATA (sym)->attr.pointer = 1;
+@@ -9911,7 +9917,7 @@
+
+ for (c= derived->components; c; c = c->next)
+ {
+- if ((c->ts.type != BT_DERIVED
++ if ((!gfc_bt_struct (c->ts.type)
+ || c->attr.pointer
+ || c->attr.allocatable
+ || c->attr.proc_pointer_comp
+@@ -10051,7 +10057,7 @@
+
+ /* The intrinsic assignment does the right thing for pointers
+ of all kinds and allocatable components. */
+- if (comp1->ts.type != BT_DERIVED
++ if (!gfc_bt_struct (comp1->ts.type)
+ || comp1->attr.pointer
+ || comp1->attr.allocatable
+ || comp1->attr.proc_pointer_comp
+@@ -11433,7 +11439,7 @@
+ gfc_find_symbol (sym->ts.u.derived->name, sym->ns, 0, &s);
+ if (s && s->attr.generic)
+ s = gfc_find_dt_in_generic (s);
+- if (s && s->attr.flavor != FL_DERIVED)
++ if (s && !gfc_fl_struct (s->attr.flavor))
+ {
+ gfc_error ("The type %qs cannot be host associated at %L "
+ "because it is blocked by an incompatible object "
+@@ -11959,17 +11965,17 @@
+ goto check_formal;
+
+ /* Check the procedure characteristics. */
+- if (sym->attr.pure != iface->attr.pure)
++ if (sym->attr.elemental != iface->attr.elemental)
+ {
+- gfc_error ("Mismatch in PURE attribute between MODULE "
++ gfc_error ("Mismatch in ELEMENTAL attribute between MODULE "
+ "PROCEDURE at %L and its interface in %s",
+ &sym->declared_at, module_name);
+ return false;
+ }
+
+- if (sym->attr.elemental != iface->attr.elemental)
++ if (sym->attr.pure != iface->attr.pure)
+ {
+- gfc_error ("Mismatch in ELEMENTAL attribute between MODULE "
++ gfc_error ("Mismatch in PURE attribute between MODULE "
+ "PROCEDURE at %L and its interface in %s",
+ &sym->declared_at, module_name);
+ return false;
+@@ -12733,7 +12739,8 @@
+ }
+
+ /* Try to find a name collision with an inherited component. */
+- if (super_type && gfc_find_component (super_type, stree->name, true, true))
++ if (super_type && gfc_find_component (super_type, stree->name, true, true,
++ NULL))
+ {
+ gfc_error ("Procedure %qs at %L has the same name as an inherited"
+ " component of %qs",
+@@ -12881,7 +12888,7 @@
+
+ for (c = derived->components; c; c = c->next)
+ {
+- if (c->ts.type != BT_DERIVED
++ if (!gfc_bt_struct (c->ts.type)
+ || c->attr.pointer
+ || c->attr.allocatable
+ || c->attr.proc_pointer_comp
+@@ -12907,435 +12914,498 @@
+ }
+
+
+-/* Resolve the components of a derived type. This does not have to wait until
+- resolution stage, but can be done as soon as the dt declaration has been
+- parsed. */
++/* Resolve a single component of a derived type or structure. */
+
+ static bool
+-resolve_fl_derived0 (gfc_symbol *sym)
++resolve_component (gfc_component *c, gfc_symbol *sym)
+ {
+- gfc_symbol* super_type;
+- gfc_component *c;
++ gfc_symbol *super_type;
+
+- if (sym->attr.unlimited_polymorphic)
++ if (c->attr.artificial)
+ return true;
+
+- super_type = gfc_get_derived_super_type (sym);
++ /* F2008, C442. */
++ if ((!sym->attr.is_class || c != sym->components)
++ && c->attr.codimension
++ && (!c->attr.allocatable || (c->as && c->as->type != AS_DEFERRED)))
++ {
++ gfc_error ("Coarray component %qs at %L must be allocatable with "
++ "deferred shape", c->name, &c->loc);
++ return false;
++ }
+
+- /* F2008, C432. */
+- if (super_type && sym->attr.coarray_comp && !super_type->attr.coarray_comp)
++ /* F2008, C443. */
++ if (c->attr.codimension && c->ts.type == BT_DERIVED
++ && c->ts.u.derived->ts.is_iso_c)
+ {
+- gfc_error ("As extending type %qs at %L has a coarray component, "
+- "parent type %qs shall also have one", sym->name,
+- &sym->declared_at, super_type->name);
++ gfc_error ("Component %qs at %L of TYPE(C_PTR) or TYPE(C_FUNPTR) "
++ "shall not be a coarray", c->name, &c->loc);
+ return false;
+ }
+
+- /* Ensure the extended type gets resolved before we do. */
+- if (super_type && !resolve_fl_derived0 (super_type))
+- return false;
++ /* F2008, C444. */
++ if (gfc_bt_struct (c->ts.type) && c->ts.u.derived->attr.coarray_comp
++ && (c->attr.codimension || c->attr.pointer || c->attr.dimension
++ || c->attr.allocatable))
++ {
++ gfc_error ("Component %qs at %L with coarray component "
++ "shall be a nonpointer, nonallocatable scalar",
++ c->name, &c->loc);
++ return false;
++ }
+
+- /* An ABSTRACT type must be extensible. */
+- if (sym->attr.abstract && !gfc_type_is_extensible (sym))
++ /* F2008, C448. */
++ if (c->attr.contiguous && (!c->attr.dimension || !c->attr.pointer))
+ {
+- gfc_error ("Non-extensible derived-type %qs at %L must not be ABSTRACT",
+- sym->name, &sym->declared_at);
++ gfc_error ("Component %qs at %L has the CONTIGUOUS attribute but "
++ "is not an array pointer", c->name, &c->loc);
+ return false;
+ }
+
+- c = (sym->attr.is_class) ? sym->components->ts.u.derived->components
+- : sym->components;
++ if (c->attr.proc_pointer && c->ts.interface)
++ {
++ gfc_symbol *ifc = c->ts.interface;
+
+- bool success = true;
++ if (!sym->attr.vtype && !check_proc_interface (ifc, &c->loc))
++ {
++ c->tb->error = 1;
++ return false;
++ }
+
+- for ( ; c != NULL; c = c->next)
++ if (ifc->attr.if_source || ifc->attr.intrinsic)
++ {
++ /* Resolve interface and copy attributes. */
++ if (ifc->formal && !ifc->formal_ns)
++ resolve_symbol (ifc);
++ if (ifc->attr.intrinsic)
++ gfc_resolve_intrinsic (ifc, &ifc->declared_at);
++
++ if (ifc->result)
++ {
++ c->ts = ifc->result->ts;
++ c->attr.allocatable = ifc->result->attr.allocatable;
++ c->attr.pointer = ifc->result->attr.pointer;
++ c->attr.dimension = ifc->result->attr.dimension;
++ c->as = gfc_copy_array_spec (ifc->result->as);
++ c->attr.class_ok = ifc->result->attr.class_ok;
++ }
++ else
++ {
++ c->ts = ifc->ts;
++ c->attr.allocatable = ifc->attr.allocatable;
++ c->attr.pointer = ifc->attr.pointer;
++ c->attr.dimension = ifc->attr.dimension;
++ c->as = gfc_copy_array_spec (ifc->as);
++ c->attr.class_ok = ifc->attr.class_ok;
++ }
++ c->ts.interface = ifc;
++ c->attr.function = ifc->attr.function;
++ c->attr.subroutine = ifc->attr.subroutine;
++
++ c->attr.pure = ifc->attr.pure;
++ c->attr.elemental = ifc->attr.elemental;
++ c->attr.recursive = ifc->attr.recursive;
++ c->attr.always_explicit = ifc->attr.always_explicit;
++ c->attr.ext_attr |= ifc->attr.ext_attr;
++ /* Copy char length. */
++ if (ifc->ts.type == BT_CHARACTER && ifc->ts.u.cl)
++ {
++ gfc_charlen *cl = gfc_new_charlen (sym->ns, ifc->ts.u.cl);
++ if (cl->length && !cl->resolved
++ && !gfc_resolve_expr (cl->length))
++ {
++ c->tb->error = 1;
++ return false;
++ }
++ c->ts.u.cl = cl;
++ }
++ }
++ }
++ else if (c->attr.proc_pointer && c->ts.type == BT_UNKNOWN)
+ {
+- if (c->attr.artificial)
+- continue;
++ /* Since PPCs are not implicitly typed, a PPC without an explicit
++ interface must be a subroutine. */
++ gfc_add_subroutine (&c->attr, c->name, &c->loc);
++ }
+
+- /* F2008, C442. */
+- if ((!sym->attr.is_class || c != sym->components)
+- && c->attr.codimension
+- && (!c->attr.allocatable || (c->as && c->as->type != AS_DEFERRED)))
+- {
+- gfc_error ("Coarray component %qs at %L must be allocatable with "
+- "deferred shape", c->name, &c->loc);
+- success = false;
+- continue;
+- }
++ /* Procedure pointer components: Check PASS arg. */
++ if (c->attr.proc_pointer && !c->tb->nopass && c->tb->pass_arg_num == 0
++ && !sym->attr.vtype)
++ {
++ gfc_symbol* me_arg;
+
+- /* F2008, C443. */
+- if (c->attr.codimension && c->ts.type == BT_DERIVED
+- && c->ts.u.derived->ts.is_iso_c)
+- {
+- gfc_error ("Component %qs at %L of TYPE(C_PTR) or TYPE(C_FUNPTR) "
+- "shall not be a coarray", c->name, &c->loc);
+- success = false;
+- continue;
+- }
++ if (c->tb->pass_arg)
++ {
++ gfc_formal_arglist* i;
+
+- /* F2008, C444. */
+- if (c->ts.type == BT_DERIVED && c->ts.u.derived->attr.coarray_comp
+- && (c->attr.codimension || c->attr.pointer || c->attr.dimension
+- || c->attr.allocatable))
+- {
+- gfc_error ("Component %qs at %L with coarray component "
+- "shall be a nonpointer, nonallocatable scalar",
+- c->name, &c->loc);
+- success = false;
+- continue;
+- }
++ /* If an explicit passing argument name is given, walk the arg-list
++ and look for it. */
+
+- /* F2008, C448. */
+- if (c->attr.contiguous && (!c->attr.dimension || !c->attr.pointer))
+- {
+- gfc_error ("Component %qs at %L has the CONTIGUOUS attribute but "
+- "is not an array pointer", c->name, &c->loc);
+- success = false;
+- continue;
+- }
++ me_arg = NULL;
++ c->tb->pass_arg_num = 1;
++ for (i = c->ts.interface->formal; i; i = i->next)
++ {
++ if (!strcmp (i->sym->name, c->tb->pass_arg))
++ {
++ me_arg = i->sym;
++ break;
++ }
++ c->tb->pass_arg_num++;
++ }
+
+- if (c->attr.proc_pointer && c->ts.interface)
+- {
+- gfc_symbol *ifc = c->ts.interface;
++ if (!me_arg)
++ {
++ gfc_error ("Procedure pointer component %qs with PASS(%s) "
++ "at %L has no argument %qs", c->name,
++ c->tb->pass_arg, &c->loc, c->tb->pass_arg);
++ c->tb->error = 1;
++ return false;
++ }
++ }
++ else
++ {
++ /* Otherwise, take the first one; there should in fact be at least
++ one. */
++ c->tb->pass_arg_num = 1;
++ if (!c->ts.interface->formal)
++ {
++ gfc_error ("Procedure pointer component %qs with PASS at %L "
++ "must have at least one argument",
++ c->name, &c->loc);
++ c->tb->error = 1;
++ return false;
++ }
++ me_arg = c->ts.interface->formal->sym;
++ }
+
+- if (!sym->attr.vtype && !check_proc_interface (ifc, &c->loc))
+- {
+- c->tb->error = 1;
+- success = false;
+- continue;
+- }
++ /* Now check that the argument-type matches. */
++ gcc_assert (me_arg);
++ if ((me_arg->ts.type != BT_DERIVED && me_arg->ts.type != BT_CLASS)
++ || (me_arg->ts.type == BT_DERIVED && me_arg->ts.u.derived != sym)
++ || (me_arg->ts.type == BT_CLASS
++ && CLASS_DATA (me_arg)->ts.u.derived != sym))
++ {
++ gfc_error ("Argument %qs of %qs with PASS(%s) at %L must be of"
++ " the derived type %qs", me_arg->name, c->name,
++ me_arg->name, &c->loc, sym->name);
++ c->tb->error = 1;
++ return false;
++ }
+
+- if (ifc->attr.if_source || ifc->attr.intrinsic)
+- {
+- /* Resolve interface and copy attributes. */
+- if (ifc->formal && !ifc->formal_ns)
+- resolve_symbol (ifc);
+- if (ifc->attr.intrinsic)
+- gfc_resolve_intrinsic (ifc, &ifc->declared_at);
++ /* Check for C453. */
++ if (me_arg->attr.dimension)
++ {
++ gfc_error ("Argument %qs of %qs with PASS(%s) at %L "
++ "must be scalar", me_arg->name, c->name, me_arg->name,
++ &c->loc);
++ c->tb->error = 1;
++ return false;
++ }
+
+- if (ifc->result)
+- {
+- c->ts = ifc->result->ts;
+- c->attr.allocatable = ifc->result->attr.allocatable;
+- c->attr.pointer = ifc->result->attr.pointer;
+- c->attr.dimension = ifc->result->attr.dimension;
+- c->as = gfc_copy_array_spec (ifc->result->as);
+- c->attr.class_ok = ifc->result->attr.class_ok;
+- }
+- else
+- {
+- c->ts = ifc->ts;
+- c->attr.allocatable = ifc->attr.allocatable;
+- c->attr.pointer = ifc->attr.pointer;
+- c->attr.dimension = ifc->attr.dimension;
+- c->as = gfc_copy_array_spec (ifc->as);
+- c->attr.class_ok = ifc->attr.class_ok;
+- }
+- c->ts.interface = ifc;
+- c->attr.function = ifc->attr.function;
+- c->attr.subroutine = ifc->attr.subroutine;
+-
+- c->attr.pure = ifc->attr.pure;
+- c->attr.elemental = ifc->attr.elemental;
+- c->attr.recursive = ifc->attr.recursive;
+- c->attr.always_explicit = ifc->attr.always_explicit;
+- c->attr.ext_attr |= ifc->attr.ext_attr;
+- /* Copy char length. */
+- if (ifc->ts.type == BT_CHARACTER && ifc->ts.u.cl)
+- {
+- gfc_charlen *cl = gfc_new_charlen (sym->ns, ifc->ts.u.cl);
+- if (cl->length && !cl->resolved
+- && !gfc_resolve_expr (cl->length))
+- {
+- c->tb->error = 1;
+- success = false;
+- continue;
+- }
+- c->ts.u.cl = cl;
+- }
+- }
+- }
+- else if (c->attr.proc_pointer && c->ts.type == BT_UNKNOWN)
+- {
+- /* Since PPCs are not implicitly typed, a PPC without an explicit
+- interface must be a subroutine. */
+- gfc_add_subroutine (&c->attr, c->name, &c->loc);
+- }
++ if (me_arg->attr.pointer)
++ {
++ gfc_error ("Argument %qs of %qs with PASS(%s) at %L "
++ "may not have the POINTER attribute", me_arg->name,
++ c->name, me_arg->name, &c->loc);
++ c->tb->error = 1;
++ return false;
++ }
+
+- /* Procedure pointer components: Check PASS arg. */
+- if (c->attr.proc_pointer && !c->tb->nopass && c->tb->pass_arg_num == 0
+- && !sym->attr.vtype)
+- {
+- gfc_symbol* me_arg;
++ if (me_arg->attr.allocatable)
++ {
++ gfc_error ("Argument %qs of %qs with PASS(%s) at %L "
++ "may not be ALLOCATABLE", me_arg->name, c->name,
++ me_arg->name, &c->loc);
++ c->tb->error = 1;
++ return false;
++ }
+
+- if (c->tb->pass_arg)
+- {
+- gfc_formal_arglist* i;
++ if (gfc_type_is_extensible (sym) && me_arg->ts.type != BT_CLASS)
++ {
++ gfc_error ("Non-polymorphic passed-object dummy argument of %qs"
++ " at %L", c->name, &c->loc);
++ return false;
++ }
+
+- /* If an explicit passing argument name is given, walk the arg-list
+- and look for it. */
++ }
+
+- me_arg = NULL;
+- c->tb->pass_arg_num = 1;
+- for (i = c->ts.interface->formal; i; i = i->next)
+- {
+- if (!strcmp (i->sym->name, c->tb->pass_arg))
+- {
+- me_arg = i->sym;
+- break;
+- }
+- c->tb->pass_arg_num++;
+- }
++ /* Check type-spec if this is not the parent-type component. */
++ if (((sym->attr.is_class
++ && (!sym->components->ts.u.derived->attr.extension
++ || c != sym->components->ts.u.derived->components))
++ || (!sym->attr.is_class
++ && (!sym->attr.extension || c != sym->components)))
++ && !sym->attr.vtype
++ && !resolve_typespec_used (&c->ts, &c->loc, c->name))
++ return false;
+
+- if (!me_arg)
+- {
+- gfc_error ("Procedure pointer component %qs with PASS(%s) "
+- "at %L has no argument %qs", c->name,
+- c->tb->pass_arg, &c->loc, c->tb->pass_arg);
+- c->tb->error = 1;
+- success = false;
+- continue;
+- }
+- }
+- else
+- {
+- /* Otherwise, take the first one; there should in fact be at least
+- one. */
+- c->tb->pass_arg_num = 1;
+- if (!c->ts.interface->formal)
+- {
+- gfc_error ("Procedure pointer component %qs with PASS at %L "
+- "must have at least one argument",
+- c->name, &c->loc);
+- c->tb->error = 1;
+- success = false;
+- continue;
+- }
+- me_arg = c->ts.interface->formal->sym;
+- }
++ super_type = gfc_get_derived_super_type (sym);
+
+- /* Now check that the argument-type matches. */
+- gcc_assert (me_arg);
+- if ((me_arg->ts.type != BT_DERIVED && me_arg->ts.type != BT_CLASS)
+- || (me_arg->ts.type == BT_DERIVED && me_arg->ts.u.derived != sym)
+- || (me_arg->ts.type == BT_CLASS
+- && CLASS_DATA (me_arg)->ts.u.derived != sym))
+- {
+- gfc_error ("Argument %qs of %qs with PASS(%s) at %L must be of"
+- " the derived type %qs", me_arg->name, c->name,
+- me_arg->name, &c->loc, sym->name);
+- c->tb->error = 1;
+- success = false;
+- continue;
+- }
++ /* If this type is an extension, set the accessibility of the parent
++ component. */
++ if (super_type
++ && ((sym->attr.is_class
++ && c == sym->components->ts.u.derived->components)
++ || (!sym->attr.is_class && c == sym->components))
++ && strcmp (super_type->name, c->name) == 0)
++ c->attr.access = super_type->attr.access;
++
++ /* If this type is an extension, see if this component has the same name
++ as an inherited type-bound procedure. */
++ if (super_type && !sym->attr.is_class
++ && gfc_find_typebound_proc (super_type, NULL, c->name, true, NULL))
++ {
++ gfc_error ("Component %qs of %qs at %L has the same name as an"
++ " inherited type-bound procedure",
++ c->name, sym->name, &c->loc);
++ return false;
++ }
+
+- /* Check for C453. */
+- if (me_arg->attr.dimension)
+- {
+- gfc_error ("Argument %qs of %qs with PASS(%s) at %L "
+- "must be scalar", me_arg->name, c->name, me_arg->name,
+- &c->loc);
+- c->tb->error = 1;
+- success = false;
+- continue;
+- }
++ if (c->ts.type == BT_CHARACTER && !c->attr.proc_pointer
++ && !c->ts.deferred)
++ {
++ if (c->ts.u.cl->length == NULL
++ || (!resolve_charlen(c->ts.u.cl))
++ || !gfc_is_constant_expr (c->ts.u.cl->length))
++ {
++ gfc_error ("Character length of component %qs needs to "
++ "be a constant specification expression at %L",
++ c->name,
++ c->ts.u.cl->length ? &c->ts.u.cl->length->where : &c->loc);
++ return false;
++ }
++ }
+
+- if (me_arg->attr.pointer)
+- {
+- gfc_error ("Argument %qs of %qs with PASS(%s) at %L "
+- "may not have the POINTER attribute", me_arg->name,
+- c->name, me_arg->name, &c->loc);
+- c->tb->error = 1;
+- success = false;
+- continue;
+- }
++ if (c->ts.type == BT_CHARACTER && c->ts.deferred
++ && !c->attr.pointer && !c->attr.allocatable)
++ {
++ gfc_error ("Character component %qs of %qs at %L with deferred "
++ "length must be a POINTER or ALLOCATABLE",
++ c->name, sym->name, &c->loc);
++ return false;
++ }
+
+- if (me_arg->attr.allocatable)
+- {
+- gfc_error ("Argument %qs of %qs with PASS(%s) at %L "
+- "may not be ALLOCATABLE", me_arg->name, c->name,
+- me_arg->name, &c->loc);
+- c->tb->error = 1;
+- success = false;
+- continue;
+- }
++ /* Add the hidden deferred length field. */
++ if (c->ts.type == BT_CHARACTER && c->ts.deferred && !c->attr.function
++ && !sym->attr.is_class)
++ {
++ char name[GFC_MAX_SYMBOL_LEN+9];
++ gfc_component *strlen;
++ sprintf (name, "_%s_length", c->name);
++ strlen = gfc_find_component (sym, name, true, true, NULL);
++ if (strlen == NULL)
++ {
++ if (!gfc_add_component (sym, name, &strlen))
++ return false;
++ strlen->ts.type = BT_INTEGER;
++ strlen->ts.kind = gfc_charlen_int_kind;
++ strlen->attr.access = ACCESS_PRIVATE;
++ strlen->attr.artificial = 1;
++ }
++ }
+
+- if (gfc_type_is_extensible (sym) && me_arg->ts.type != BT_CLASS)
+- {
+- gfc_error ("Non-polymorphic passed-object dummy argument of %qs"
+- " at %L", c->name, &c->loc);
+- success = false;
+- continue;
+- }
++ if (c->ts.type == BT_DERIVED
++ && sym->component_access != ACCESS_PRIVATE
++ && gfc_check_symbol_access (sym)
++ && !is_sym_host_assoc (c->ts.u.derived, sym->ns)
++ && !c->ts.u.derived->attr.use_assoc
++ && !gfc_check_symbol_access (c->ts.u.derived)
++ && !gfc_notify_std (GFC_STD_F2003, "the component %qs is a "
++ "PRIVATE type and cannot be a component of "
++ "%qs, which is PUBLIC at %L", c->name,
++ sym->name, &sym->declared_at))
++ return false;
+
+- }
++ if ((sym->attr.sequence || sym->attr.is_bind_c) && c->ts.type == BT_CLASS)
++ {
++ gfc_error ("Polymorphic component %s at %L in SEQUENCE or BIND(C) "
++ "type %s", c->name, &c->loc, sym->name);
++ return false;
++ }
+
+- /* Check type-spec if this is not the parent-type component. */
+- if (((sym->attr.is_class
+- && (!sym->components->ts.u.derived->attr.extension
+- || c != sym->components->ts.u.derived->components))
+- || (!sym->attr.is_class
+- && (!sym->attr.extension || c != sym->components)))
+- && !sym->attr.vtype
+- && !resolve_typespec_used (&c->ts, &c->loc, c->name))
+- return false;
++ if (sym->attr.sequence)
++ {
++ if (c->ts.type == BT_DERIVED && c->ts.u.derived->attr.sequence == 0)
++ {
++ gfc_error ("Component %s of SEQUENCE type declared at %L does "
++ "not have the SEQUENCE attribute",
++ c->ts.u.derived->name, &sym->declared_at);
++ return false;
++ }
++ }
+
+- /* If this type is an extension, set the accessibility of the parent
+- component. */
+- if (super_type
+- && ((sym->attr.is_class
+- && c == sym->components->ts.u.derived->components)
+- || (!sym->attr.is_class && c == sym->components))
+- && strcmp (super_type->name, c->name) == 0)
+- c->attr.access = super_type->attr.access;
+-
+- /* If this type is an extension, see if this component has the same name
+- as an inherited type-bound procedure. */
+- if (super_type && !sym->attr.is_class
+- && gfc_find_typebound_proc (super_type, NULL, c->name, true, NULL))
+- {
+- gfc_error ("Component %qs of %qs at %L has the same name as an"
+- " inherited type-bound procedure",
+- c->name, sym->name, &c->loc);
+- return false;
+- }
++ if (c->ts.type == BT_DERIVED && c->ts.u.derived->attr.generic)
++ c->ts.u.derived = gfc_find_dt_in_generic (c->ts.u.derived);
++ else if (c->ts.type == BT_CLASS && c->attr.class_ok
++ && CLASS_DATA (c)->ts.u.derived->attr.generic)
++ CLASS_DATA (c)->ts.u.derived
++ = gfc_find_dt_in_generic (CLASS_DATA (c)->ts.u.derived);
+
+- if (c->ts.type == BT_CHARACTER && !c->attr.proc_pointer
+- && !c->ts.deferred)
+- {
+- if (c->ts.u.cl->length == NULL
+- || (!resolve_charlen(c->ts.u.cl))
+- || !gfc_is_constant_expr (c->ts.u.cl->length))
+- {
+- gfc_error ("Character length of component %qs needs to "
+- "be a constant specification expression at %L",
+- c->name,
+- c->ts.u.cl->length ? &c->ts.u.cl->length->where : &c->loc);
+- return false;
+- }
+- }
++ if (!sym->attr.is_class && c->ts.type == BT_DERIVED && !sym->attr.vtype
++ && c->attr.pointer && c->ts.u.derived->components == NULL
++ && !c->ts.u.derived->attr.zero_comp)
++ {
++ gfc_error ("The pointer component %qs of %qs at %L is a type "
++ "that has not been declared", c->name, sym->name,
++ &c->loc);
++ return false;
++ }
+
+- if (c->ts.type == BT_CHARACTER && c->ts.deferred
+- && !c->attr.pointer && !c->attr.allocatable)
+- {
+- gfc_error ("Character component %qs of %qs at %L with deferred "
+- "length must be a POINTER or ALLOCATABLE",
+- c->name, sym->name, &c->loc);
+- return false;
+- }
++ if (c->ts.type == BT_CLASS && c->attr.class_ok
++ && CLASS_DATA (c)->attr.class_pointer
++ && CLASS_DATA (c)->ts.u.derived->components == NULL
++ && !CLASS_DATA (c)->ts.u.derived->attr.zero_comp
++ && !UNLIMITED_POLY (c))
++ {
++ gfc_error ("The pointer component %qs of %qs at %L is a type "
++ "that has not been declared", c->name, sym->name,
++ &c->loc);
++ return false;
++ }
+
+- /* Add the hidden deferred length field. */
+- if (c->ts.type == BT_CHARACTER && c->ts.deferred && !c->attr.function
+- && !sym->attr.is_class)
+- {
+- char name[GFC_MAX_SYMBOL_LEN+9];
+- gfc_component *strlen;
+- sprintf (name, "_%s_length", c->name);
+- strlen = gfc_find_component (sym, name, true, true);
+- if (strlen == NULL)
+- {
+- if (!gfc_add_component (sym, name, &strlen))
+- return false;
+- strlen->ts.type = BT_INTEGER;
+- strlen->ts.kind = gfc_charlen_int_kind;
+- strlen->attr.access = ACCESS_PRIVATE;
+- strlen->attr.artificial = 1;
+- }
+- }
++ /* C437. */
++ if (c->ts.type == BT_CLASS && c->attr.flavor != FL_PROCEDURE
++ && (!c->attr.class_ok
++ || !(CLASS_DATA (c)->attr.class_pointer
++ || CLASS_DATA (c)->attr.allocatable)))
++ {
++ gfc_error ("Component %qs with CLASS at %L must be allocatable "
++ "or pointer", c->name, &c->loc);
++ /* Prevent a recurrence of the error. */
++ c->ts.type = BT_UNKNOWN;
++ return false;
++ }
+
+- if (c->ts.type == BT_DERIVED
+- && sym->component_access != ACCESS_PRIVATE
+- && gfc_check_symbol_access (sym)
+- && !is_sym_host_assoc (c->ts.u.derived, sym->ns)
+- && !c->ts.u.derived->attr.use_assoc
+- && !gfc_check_symbol_access (c->ts.u.derived)
+- && !gfc_notify_std (GFC_STD_F2003, "the component %qs is a "
+- "PRIVATE type and cannot be a component of "
+- "%qs, which is PUBLIC at %L", c->name,
+- sym->name, &sym->declared_at))
+- return false;
++ /* Ensure that all the derived type components are put on the
++ derived type list; even in formal namespaces, where derived type
++ pointer components might not have been declared. */
++ if (c->ts.type == BT_DERIVED
++ && c->ts.u.derived
++ && c->ts.u.derived->components
++ && c->attr.pointer
++ && sym != c->ts.u.derived)
++ add_dt_to_dt_list (c->ts.u.derived);
+
+- if ((sym->attr.sequence || sym->attr.is_bind_c) && c->ts.type == BT_CLASS)
+- {
+- gfc_error ("Polymorphic component %s at %L in SEQUENCE or BIND(C) "
+- "type %s", c->name, &c->loc, sym->name);
+- return false;
+- }
++ if (!gfc_resolve_array_spec (c->as,
++ !(c->attr.pointer || c->attr.proc_pointer
++ || c->attr.allocatable)))
++ return false;
+
+- if (sym->attr.sequence)
+- {
+- if (c->ts.type == BT_DERIVED && c->ts.u.derived->attr.sequence == 0)
+- {
+- gfc_error ("Component %s of SEQUENCE type declared at %L does "
+- "not have the SEQUENCE attribute",
+- c->ts.u.derived->name, &sym->declared_at);
+- return false;
+- }
+- }
++ if (c->initializer && !sym->attr.vtype
++ && !gfc_check_assign_symbol (sym, c, c->initializer))
++ return false;
+
+- if (c->ts.type == BT_DERIVED && c->ts.u.derived->attr.generic)
+- c->ts.u.derived = gfc_find_dt_in_generic (c->ts.u.derived);
+- else if (c->ts.type == BT_CLASS && c->attr.class_ok
+- && CLASS_DATA (c)->ts.u.derived->attr.generic)
+- CLASS_DATA (c)->ts.u.derived
+- = gfc_find_dt_in_generic (CLASS_DATA (c)->ts.u.derived);
++ return true;
++}
+
+- if (!sym->attr.is_class && c->ts.type == BT_DERIVED && !sym->attr.vtype
+- && c->attr.pointer && c->ts.u.derived->components == NULL
+- && !c->ts.u.derived->attr.zero_comp)
+- {
+- gfc_error ("The pointer component %qs of %qs at %L is a type "
+- "that has not been declared", c->name, sym->name,
+- &c->loc);
+- return false;
+- }
+
+- if (c->ts.type == BT_CLASS && c->attr.class_ok
+- && CLASS_DATA (c)->attr.class_pointer
+- && CLASS_DATA (c)->ts.u.derived->components == NULL
+- && !CLASS_DATA (c)->ts.u.derived->attr.zero_comp
+- && !UNLIMITED_POLY (c))
+- {
+- gfc_error ("The pointer component %qs of %qs at %L is a type "
+- "that has not been declared", c->name, sym->name,
+- &c->loc);
+- return false;
+- }
++/* Be nice about the locus for a structure expression - show the locus of the
++ first non-null sub-expression if we can. */
+
+- /* C437. */
+- if (c->ts.type == BT_CLASS && c->attr.flavor != FL_PROCEDURE
+- && (!c->attr.class_ok
+- || !(CLASS_DATA (c)->attr.class_pointer
+- || CLASS_DATA (c)->attr.allocatable)))
+- {
+- gfc_error ("Component %qs with CLASS at %L must be allocatable "
+- "or pointer", c->name, &c->loc);
+- /* Prevent a recurrence of the error. */
+- c->ts.type = BT_UNKNOWN;
+- return false;
+- }
++static locus *
++cons_where (gfc_expr *struct_expr)
++{
++ gfc_constructor *cons;
+
+- /* Ensure that all the derived type components are put on the
+- derived type list; even in formal namespaces, where derived type
+- pointer components might not have been declared. */
+- if (c->ts.type == BT_DERIVED
+- && c->ts.u.derived
+- && c->ts.u.derived->components
+- && c->attr.pointer
+- && sym != c->ts.u.derived)
+- add_dt_to_dt_list (c->ts.u.derived);
++ gcc_assert (struct_expr && struct_expr->expr_type == EXPR_STRUCTURE);
+
+- if (!gfc_resolve_array_spec (c->as,
+- !(c->attr.pointer || c->attr.proc_pointer
+- || c->attr.allocatable)))
+- return false;
++ cons = gfc_constructor_first (struct_expr->value.constructor);
++ for (; cons; cons = gfc_constructor_next (cons))
++ {
++ if (cons->expr && cons->expr->expr_type != EXPR_NULL)
++ return &cons->expr->where;
++ }
+
+- if (c->initializer && !sym->attr.vtype
+- && !gfc_check_assign_symbol (sym, c, c->initializer))
+- return false;
++ return &struct_expr->where;
++}
++
++/* Resolve the components of a structure type. Much less work than derived
++ types. */
++
++static bool
++resolve_fl_struct (gfc_symbol *sym)
++{
++ gfc_component *c;
++ gfc_expr *init = NULL;
++ bool success;
++
++ /* Make sure UNIONs do not have overlapping initializers. */
++ if (sym->attr.flavor == FL_UNION)
++ {
++ for (c = sym->components; c; c = c->next)
++ {
++ if (init && c->initializer)
++ {
++ gfc_error ("Conflicting initializers in union at %L and %L",
++ cons_where (init), cons_where (c->initializer));
++ gfc_free_expr (c->initializer);
++ c->initializer = NULL;
++ }
++ if (init == NULL)
++ init = c->initializer;
++ }
+ }
+
++ success = true;
++ for (c = sym->components; c; c = c->next)
++ if (!resolve_component (c, sym))
++ success = false;
++
++ if (!success)
++ return false;
++
++ if (sym->components)
++ add_dt_to_dt_list (sym);
++
++ return true;
++}
++
++
++/* Resolve the components of a derived type. This does not have to wait until
++ resolution stage, but can be done as soon as the dt declaration has been
++ parsed. */
++
++static bool
++resolve_fl_derived0 (gfc_symbol *sym)
++{
++ gfc_symbol* super_type;
++ gfc_component *c;
++ bool success;
++
++ if (sym->attr.unlimited_polymorphic)
++ return true;
++
++ super_type = gfc_get_derived_super_type (sym);
++
++ /* F2008, C432. */
++ if (super_type && sym->attr.coarray_comp && !super_type->attr.coarray_comp)
++ {
++ gfc_error ("As extending type %qs at %L has a coarray component, "
++ "parent type %qs shall also have one", sym->name,
++ &sym->declared_at, super_type->name);
++ return false;
++ }
++
++ /* Ensure the extended type gets resolved before we do. */
++ if (super_type && !resolve_fl_derived0 (super_type))
++ return false;
++
++ /* An ABSTRACT type must be extensible. */
++ if (sym->attr.abstract && !gfc_type_is_extensible (sym))
++ {
++ gfc_error ("Non-extensible derived-type %qs at %L must not be ABSTRACT",
++ sym->name, &sym->declared_at);
++ return false;
++ }
++
++ c = (sym->attr.is_class) ? sym->components->ts.u.derived->components
++ : sym->components;
++
++ success = true;
++ for ( ; c != NULL; c = c->next)
++ if (!resolve_component (c, sym))
++ success = false;
++
+ if (!success)
+ return false;
+
+@@ -13396,8 +13466,8 @@
+ if (sym->attr.is_class && sym->ts.u.derived == NULL)
+ {
+ /* Fix up incomplete CLASS symbols. */
+- gfc_component *data = gfc_find_component (sym, "_data", true, true);
+- gfc_component *vptr = gfc_find_component (sym, "_vptr", true, true);
++ gfc_component *data = gfc_find_component (sym, "_data", true, true, NULL);
++ gfc_component *vptr = gfc_find_component (sym, "_vptr", true, true, NULL);
+
+ /* Nothing more to do for unlimited polymorphic entities. */
+ if (data->ts.u.derived->attr.unlimited_polymorphic)
+@@ -13616,6 +13686,11 @@
+ return;
+ sym->resolved = 1;
+
++ /* No symbol will ever have union type; only components can be unions.
++ Union type declaration symbols have type BT_UNKNOWN but flavor FL_UNION
++ (just like derived type declaration symbols have flavor FL_DERIVED). */
++ gcc_assert (sym->ts.type != BT_UNION);
++
+ if (sym->attr.artificial)
+ return;
+
+@@ -13687,6 +13762,10 @@
+ if (sym->attr.flavor == FL_DERIVED && !resolve_fl_derived (sym))
+ return;
+
++ else if ((sym->attr.flavor == FL_STRUCT || sym->attr.flavor == FL_UNION)
++ && !resolve_fl_struct (sym))
++ return;
++
+ /* Symbols that are module procedures with results (functions) have
+ the types and array specification copied for type checking in
+ procedures that call them, as well as for saving to a module
+@@ -15030,7 +15109,7 @@
+
+ for (; c ; c = c->next)
+ {
+- if (c->ts.type == BT_DERIVED
++ if (gfc_bt_struct (c->ts.type)
+ && (!resolve_equivalence_derived(c->ts.u.derived, sym, e)))
+ return false;
+
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/fortran/scanner.c gcc-6-20160721/gcc/fortran/scanner.c
+--- gcc-6.1.0/gcc/fortran/scanner.c 2016-03-19 20:28:38.000000000 +0000
++++ gcc-6-20160721/gcc/fortran/scanner.c 2016-05-27 01:05:21.000000000 +0000
+@@ -1556,6 +1556,7 @@
+ not_continuation:
+ c = '\n';
+ gfc_current_locus = old_loc;
++ end_flag = 0;
+
+ done:
+ if (c == '\n')
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/fortran/symbol.c gcc-6-20160721/gcc/fortran/symbol.c
+--- gcc-6.1.0/gcc/fortran/symbol.c 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/gcc/fortran/symbol.c 2016-05-14 19:52:46.000000000 +0000
+@@ -40,6 +40,7 @@
+ minit ("VARIABLE", FL_VARIABLE), minit ("PARAMETER", FL_PARAMETER),
+ minit ("LABEL", FL_LABEL), minit ("PROCEDURE", FL_PROCEDURE),
+ minit ("DERIVED", FL_DERIVED), minit ("NAMELIST", FL_NAMELIST),
++ minit ("UNION", FL_UNION), minit ("STRUCTURE", FL_STRUCT),
+ minit (NULL, -1)
+ };
+
+@@ -444,7 +445,7 @@
+ case FL_BLOCK_DATA:
+ case FL_MODULE:
+ case FL_LABEL:
+- case FL_DERIVED:
++ case_fl_struct:
+ case FL_PARAMETER:
+ a1 = gfc_code2string (flavors, attr->flavor);
+ a2 = save;
+@@ -740,7 +741,7 @@
+
+ break;
+
+- case FL_DERIVED:
++ case_fl_struct:
+ conf2 (dummy);
+ conf2 (pointer);
+ conf2 (target);
+@@ -1579,7 +1580,7 @@
+ {
+
+ if ((f == FL_PROGRAM || f == FL_BLOCK_DATA || f == FL_MODULE
+- || f == FL_PARAMETER || f == FL_LABEL || f == FL_DERIVED
++ || f == FL_PARAMETER || f == FL_LABEL || gfc_fl_struct(f)
+ || f == FL_NAMELIST) && check_used (attr, name, where))
+ return false;
+
+@@ -2048,6 +2049,11 @@
+ {
+ gfc_component *p, *tail;
+
++ /* Check for existing components with the same name, but not for union
++ components or containers. Unions and maps are anonymous so they have
++ unique internal names which will never conflict.
++ Don't use gfc_find_component here because it calls gfc_use_derived,
++ but the derived type may not be fully defined yet. */
+ tail = NULL;
+
+ for (p = sym->components; p; p = p->next)
+@@ -2063,7 +2069,8 @@
+ }
+
+ if (sym->attr.extension
+- && gfc_find_component (sym->components->ts.u.derived, name, true, true))
++ && gfc_find_component (sym->components->ts.u.derived,
++ name, true, true, NULL))
+ {
+ gfc_error ("Component %qs at %C already in the parent type "
+ "at %L", name, &sym->components->ts.u.derived->declared_at);
+@@ -2154,7 +2161,7 @@
+ return NULL;
+ }
+
+- if (s == NULL || s->attr.flavor != FL_DERIVED)
++ if (s == NULL || !gfc_fl_struct (s->attr.flavor))
+ goto bad;
+
+ /* Get rid of symbol sym, translating all references to s. */
+@@ -2188,28 +2195,113 @@
+ }
+
+
++/* Find the component with the given name in the union type symbol.
++ If ref is not NULL it will be set to the chain of components through which
++ the component can actually be accessed. This is necessary for unions because
++ intermediate structures may be maps, nested structures, or other unions,
++ all of which may (or must) be 'anonymous' to user code. */
++
++static gfc_component *
++find_union_component (gfc_symbol *un, const char *name,
++ bool noaccess, gfc_ref **ref)
++{
++ gfc_component *m, *check;
++ gfc_ref *sref, *tmp;
++
++ for (m = un->components; m; m = m->next)
++ {
++ check = gfc_find_component (m->ts.u.derived, name, noaccess, true, &tmp);
++ if (check == NULL)
++ continue;
++
++ /* Found component somewhere in m; chain the refs together. */
++ if (ref)
++ {
++ /* Map ref. */
++ sref = gfc_get_ref ();
++ sref->type = REF_COMPONENT;
++ sref->u.c.component = m;
++ sref->u.c.sym = m->ts.u.derived;
++ sref->next = tmp;
++
++ *ref = sref;
++ }
++ /* Other checks (such as access) were done in the recursive calls. */
++ return check;
++ }
++ return NULL;
++}
++
++
+ /* Given a derived type node and a component name, try to locate the
+ component structure. Returns the NULL pointer if the component is
+ not found or the components are private. If noaccess is set, no access
+- checks are done. */
++ checks are done. If silent is set, an error will not be generated if
++ the component cannot be found or accessed.
++
++ If ref is not NULL, *ref is set to represent the chain of components
++ required to get to the ultimate component.
++
++ If the component is simply a direct subcomponent, or is inherited from a
++ parent derived type in the given derived type, this is a single ref with its
++ component set to the returned component.
++
++ Otherwise, *ref is constructed as a chain of subcomponents. This occurs
++ when the component is found through an implicit chain of nested union and
++ map components. Unions and maps are "anonymous" substructures in FORTRAN
++ which cannot be explicitly referenced, but the reference chain must be
++ considered as in C for backend translation to correctly compute layouts.
++ (For example, x.a may refer to x->(UNION)->(MAP)->(UNION)->(MAP)->a). */
+
+ gfc_component *
+ gfc_find_component (gfc_symbol *sym, const char *name,
+- bool noaccess, bool silent)
++ bool noaccess, bool silent, gfc_ref **ref)
+ {
+- gfc_component *p;
++ gfc_component *p, *check;
++ gfc_ref *sref = NULL, *tmp = NULL;
+
+ if (name == NULL || sym == NULL)
+ return NULL;
+
+- sym = gfc_use_derived (sym);
++ if (sym->attr.flavor == FL_DERIVED)
++ sym = gfc_use_derived (sym);
++ else
++ gcc_assert (gfc_fl_struct (sym->attr.flavor));
+
+ if (sym == NULL)
+ return NULL;
+
++ /* Handle UNIONs specially - mutually recursive with gfc_find_component. */
++ if (sym->attr.flavor == FL_UNION)
++ return find_union_component (sym, name, noaccess, ref);
++
++ if (ref) *ref = NULL;
+ for (p = sym->components; p; p = p->next)
+- if (strcmp (p->name, name) == 0)
+- break;
++ {
++ /* Nest search into union's maps. */
++ if (p->ts.type == BT_UNION)
++ {
++ check = find_union_component (p->ts.u.derived, name, noaccess, &tmp);
++ if (check != NULL)
++ {
++ /* Union ref. */
++ if (ref)
++ {
++ sref = gfc_get_ref ();
++ sref->type = REF_COMPONENT;
++ sref->u.c.component = p;
++ sref->u.c.sym = p->ts.u.derived;
++ sref->next = tmp;
++ *ref = sref;
++ }
++ return check;
++ }
++ }
++ else if (strcmp (p->name, name) == 0)
++ break;
++
++ continue;
++ }
+
+ if (p && sym->attr.use_assoc && !noaccess)
+ {
+@@ -2231,7 +2323,7 @@
+ && sym->components->ts.type == BT_DERIVED)
+ {
+ p = gfc_find_component (sym->components->ts.u.derived, name,
+- noaccess, silent);
++ noaccess, silent, ref);
+ /* Do not overwrite the error. */
+ if (p == NULL)
+ return p;
+@@ -2241,6 +2333,25 @@
+ gfc_error ("%qs at %C is not a member of the %qs structure",
+ name, sym->name);
+
++ /* Component was found; build the ultimate component reference. */
++ if (p != NULL && ref)
++ {
++ tmp = gfc_get_ref ();
++ tmp->type = REF_COMPONENT;
++ tmp->u.c.component = p;
++ tmp->u.c.sym = sym;
++ /* Link the final component ref to the end of the chain of subrefs. */
++ if (sref)
++ {
++ *ref = sref;
++ for (; sref->next; sref = sref->next)
++ ;
++ sref->next = tmp;
++ }
++ else
++ *ref = tmp;
++ }
++
+ return p;
+ }
+
+@@ -3338,11 +3449,9 @@
+ /* The derived type is saved in the symtree with the first
+ letter capitalized; the all lower-case version to the
+ derived type contains its associated generic function. */
+- if (p->attr.flavor == FL_DERIVED)
+- gfc_delete_symtree (&p->ns->sym_root, gfc_get_string ("%c%s",
+- (char) TOUPPER ((unsigned char) p->name[0]),
+- &p->name[1]));
+- else
++ if (gfc_fl_struct (p->attr.flavor))
++ gfc_delete_symtree (&p->ns->sym_root,gfc_dt_upper_string (p->name));
++ else
+ gfc_delete_symtree (&p->ns->sym_root, p->name);
+
+ gfc_release_symbol (p);
+@@ -4526,10 +4635,7 @@
+ const char *hidden_name;
+ gfc_interface *intr, *head;
+
+- hidden_name = gfc_get_string ("%c%s",
+- (char) TOUPPER ((unsigned char)
+- tmp_sym->name[0]),
+- &tmp_sym->name[1]);
++ hidden_name = gfc_dt_upper_string (tmp_sym->name);
+ tmp_symtree = gfc_find_symtree (gfc_current_ns->sym_root,
+ hidden_name);
+ gcc_assert (tmp_symtree == NULL);
+@@ -4740,6 +4846,8 @@
+ bool is_class2 = (ts2->type == BT_CLASS);
+ bool is_derived1 = (ts1->type == BT_DERIVED);
+ bool is_derived2 = (ts2->type == BT_DERIVED);
++ bool is_union1 = (ts1->type == BT_UNION);
++ bool is_union2 = (ts2->type == BT_UNION);
+
+ if (is_class1
+ && ts1->u.derived->components
+@@ -4749,10 +4857,11 @@
+ || ts1->u.derived->attr.unlimited_polymorphic))
+ return 1;
+
+- if (!is_derived1 && !is_derived2 && !is_class1 && !is_class2)
++ if (!is_derived1 && !is_derived2 && !is_class1 && !is_class2
++ && !is_union1 && !is_union2)
+ return (ts1->type == ts2->type);
+
+- if (is_derived1 && is_derived2)
++ if ((is_derived1 && is_derived2) || (is_union1 && is_union1))
+ return gfc_compare_derived_types (ts1->u.derived, ts2->u.derived);
+
+ if (is_derived1 && is_class2)
+@@ -4821,12 +4930,12 @@
+ {
+ gfc_interface *intr = NULL;
+
+- if (!sym || sym->attr.flavor == FL_DERIVED)
++ if (!sym || gfc_fl_struct (sym->attr.flavor))
+ return sym;
+
+ if (sym->attr.generic)
+ for (intr = sym->generic; intr; intr = intr->next)
+- if (intr->sym->attr.flavor == FL_DERIVED)
++ if (gfc_fl_struct (intr->sym->attr.flavor))
+ break;
+ return intr ? intr->sym : NULL;
+ }
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/fortran/trans-array.c gcc-6-20160721/gcc/fortran/trans-array.c
+--- gcc-6.1.0/gcc/fortran/trans-array.c 2016-04-04 09:32:28.000000000 +0000
++++ gcc-6-20160721/gcc/fortran/trans-array.c 2016-06-05 18:09:27.000000000 +0000
+@@ -6376,7 +6376,12 @@
+ stmtCleanup = gfc_finish_block (&cleanup);
+
+ /* Only do the cleanup if the array was repacked. */
+- tmp = build_fold_indirect_ref_loc (input_location, dumdesc);
++ if (is_classarray)
++ /* For a class array the dummy array descriptor is in the _class
++ component. */
++ tmp = gfc_class_data_get (dumdesc);
++ else
++ tmp = build_fold_indirect_ref_loc (input_location, dumdesc);
+ tmp = gfc_conv_descriptor_data_get (tmp);
+ tmp = fold_build2_loc (input_location, NE_EXPR, boolean_type_node,
+ tmp, tmpdesc);
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/fortran/trans-decl.c gcc-6-20160721/gcc/fortran/trans-decl.c
+--- gcc-6.1.0/gcc/fortran/trans-decl.c 2016-03-28 09:05:01.000000000 +0000
++++ gcc-6-20160721/gcc/fortran/trans-decl.c 2016-07-20 13:24:19.000000000 +0000
+@@ -732,6 +732,7 @@
+ st = NULL;
+ s = NULL;
+
++ /* Check for a symbol with the same name. */
+ if (gsym)
+ gfc_find_symbol (sym->name, gsym->ns, 0, &s);
+
+@@ -748,22 +749,37 @@
+ st->n.sym = sym;
+ sym->refs++;
+ }
+- else if (sym->attr.flavor == FL_DERIVED)
++ else if (gfc_fl_struct (sym->attr.flavor))
+ {
+ if (s && s->attr.flavor == FL_PROCEDURE)
+ {
+ gfc_interface *intr;
+ gcc_assert (s->attr.generic);
+ for (intr = s->generic; intr; intr = intr->next)
+- if (intr->sym->attr.flavor == FL_DERIVED)
++ if (gfc_fl_struct (intr->sym->attr.flavor))
+ {
+ s = intr->sym;
+ break;
+ }
+ }
+
+- if (!s->backend_decl)
+- s->backend_decl = gfc_get_derived_type (s);
++ /* Normally we can assume that s is a derived-type symbol since it
++ shares a name with the derived-type sym. However if sym is a
++ STRUCTURE, it may in fact share a name with any other basic type
++ variable. If s is in fact of derived type then we can continue
++ looking for a duplicate type declaration. */
++ if (sym->attr.flavor == FL_STRUCT && s->ts.type == BT_DERIVED)
++ {
++ s = s->ts.u.derived;
++ }
++
++ if (gfc_fl_struct (s->attr.flavor) && !s->backend_decl)
++ {
++ if (s->attr.flavor == FL_UNION)
++ s->backend_decl = gfc_get_union_type (s);
++ else
++ s->backend_decl = gfc_get_derived_type (s);
++ }
+ gfc_copy_dt_decls_ifequal (s, sym, true);
+ return true;
+ }
+@@ -2384,7 +2400,7 @@
+ Thus, we will use a hidden argument in that case. */
+ else if (f->sym->attr.optional && f->sym->attr.value
+ && !f->sym->attr.dimension && f->sym->ts.type != BT_CLASS
+- && f->sym->ts.type != BT_DERIVED)
++ && !gfc_bt_struct (f->sym->ts.type))
+ {
+ tree tmp;
+ strcpy (&name[1], f->sym->name);
+@@ -4596,7 +4612,7 @@
+ && sym->ts.type == BT_DERIVED)
+ sym->backend_decl = gfc_typenode_for_spec (&(sym->ts));
+
+- if (sym->attr.flavor == FL_DERIVED
++ if (gfc_fl_struct (sym->attr.flavor)
+ && sym->backend_decl
+ && TREE_CODE (sym->backend_decl) == RECORD_TYPE)
+ {
+@@ -4839,7 +4855,7 @@
+ }
+ else switch (ts->type)
+ {
+- case BT_DERIVED:
++ case_bt_struct:
+ if (expr->expr_type != EXPR_STRUCTURE)
+ return false;
+ cm = expr->ts.u.derived->components;
+@@ -6260,7 +6276,7 @@
+ gfc_finish_block (&cleanup));
+
+ /* Add all the decls we created during processing. */
+- decl = saved_function_decls;
++ decl = nreverse (saved_function_decls);
+ while (decl)
+ {
+ tree next;
+@@ -6319,7 +6335,7 @@
+ function has already called cgraph_create_node, which also created
+ the cgraph node for this function. */
+ if (!has_coarray_vars || flag_coarray != GFC_FCOARRAY_LIB)
+- (void) cgraph_node::create (fndecl);
++ (void) cgraph_node::get_create (fndecl);
+ }
+ else
+ cgraph_node::finalize_function (fndecl, true);
+@@ -6452,7 +6468,7 @@
+ if (flag_coarray == GFC_FCOARRAY_LIB && has_coarray_vars)
+ generate_coarray_init (ns);
+
+- decl = saved_local_decls;
++ decl = nreverse (saved_local_decls);
+ while (decl)
+ {
+ tree next;
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/fortran/trans-expr.c gcc-6-20160721/gcc/fortran/trans-expr.c
+--- gcc-6.1.0/gcc/fortran/trans-expr.c 2016-03-29 16:54:24.000000000 +0000
++++ gcc-6-20160721/gcc/fortran/trans-expr.c 2016-07-16 03:54:12.000000000 +0000
+@@ -2297,6 +2297,7 @@
+ tree tmp;
+ tree decl;
+ tree field;
++ tree context;
+
+ c = ref->u.c.component;
+
+@@ -2307,15 +2308,20 @@
+ field = c->backend_decl;
+ gcc_assert (field && TREE_CODE (field) == FIELD_DECL);
+ decl = se->expr;
++ context = DECL_FIELD_CONTEXT (field);
+
+ /* Components can correspond to fields of different containing
+ types, as components are created without context, whereas
+ a concrete use of a component has the type of decl as context.
+ So, if the type doesn't match, we search the corresponding
+ FIELD_DECL in the parent type. To not waste too much time
+- we cache this result in norestrict_decl. */
+-
+- if (DECL_FIELD_CONTEXT (field) != TREE_TYPE (decl))
++ we cache this result in norestrict_decl.
++ On the other hand, if the context is a UNION or a MAP (a
++ RECORD_TYPE within a UNION_TYPE) always use the given FIELD_DECL. */
++
++ if (context != TREE_TYPE (decl)
++ && !( TREE_CODE (TREE_TYPE (field)) == UNION_TYPE /* Field is union */
++ || TREE_CODE (context) == UNION_TYPE)) /* Field is map */
+ {
+ tree f2 = c->norestrict_decl;
+ if (!f2 || DECL_FIELD_CONTEXT (f2) != TREE_TYPE (decl))
+@@ -6715,7 +6721,7 @@
+ {
+ switch (ts->type)
+ {
+- case BT_DERIVED:
++ case_bt_struct:
+ case BT_CLASS:
+ gfc_init_se (&se, NULL);
+ if (ts->type == BT_CLASS && expr->expr_type == EXPR_NULL)
+@@ -6860,7 +6866,7 @@
+ gfc_add_modify (&block, dest, se.expr);
+
+ /* Deal with arrays of derived types with allocatable components. */
+- if (cm->ts.type == BT_DERIVED
++ if (gfc_bt_struct (cm->ts.type)
+ && cm->ts.u.derived->attr.alloc_comp)
+ tmp = gfc_copy_alloc_comp (cm->ts.u.derived,
+ se.expr, dest,
+@@ -7033,7 +7039,7 @@
+ /* Ensure that cm->ts.u.cl->backend_decl is a componentref to _%s_length
+ component. */
+ sprintf (name, "_%s_length", cm->name);
+- strlen = gfc_find_component (sym, name, true, true);
++ strlen = gfc_find_component (sym, name, true, true, NULL);
+ lhs_cl_size = fold_build3_loc (input_location, COMPONENT_REF,
+ gfc_charlen_type_node,
+ TREE_OPERAND (comp, 0),
+@@ -7245,7 +7251,7 @@
+ fold_convert (TREE_TYPE (tmp), se.expr));
+ gfc_add_block_to_block (&block, &se.post);
+ }
+- else if (expr->ts.type == BT_DERIVED && expr->ts.f90_type != BT_VOID)
++ else if (gfc_bt_struct (expr->ts.type) && expr->ts.f90_type != BT_VOID)
+ {
+ if (expr->expr_type != EXPR_STRUCTURE)
+ {
+@@ -7352,7 +7358,6 @@
+ {
+ gfc_se se, lse;
+
+- gcc_assert (cm->backend_decl == NULL);
+ gfc_init_se (&se, NULL);
+ gfc_init_se (&lse, NULL);
+ gfc_conv_expr (&se, gfc_constructor_first (expr->value.constructor)->expr);
+@@ -7416,6 +7421,24 @@
+ return;
+ }
+
++ /* Though unions appear to have multiple map components, they must only
++ have a single initializer since each map overlaps. TODO: squash map
++ constructors? */
++ if (expr->ts.type == BT_UNION)
++ {
++ c = gfc_constructor_first (expr->value.constructor);
++ cm = c->n.component;
++ val = gfc_conv_initializer (c->expr, &expr->ts,
++ TREE_TYPE (cm->backend_decl),
++ cm->attr.dimension, cm->attr.pointer,
++ cm->attr.proc_pointer);
++ val = unshare_expr_without_location (val);
++
++ /* Append it to the constructor list. */
++ CONSTRUCTOR_APPEND_ELT (v, cm->backend_decl, val);
++ goto finish;
++ }
++
+ cm = expr->ts.u.derived->components;
+
+ for (c = gfc_constructor_first (expr->value.constructor);
+@@ -7462,6 +7485,7 @@
+ CONSTRUCTOR_APPEND_ELT (v, cm->backend_decl, val);
+ }
+ }
++finish:
+ se->expr = build_constructor (type, v);
+ if (init)
+ TREE_CONSTANT (se->expr) = 1;
+@@ -8246,7 +8270,7 @@
+ gfc_trans_string_copy (&block, llen, lse->expr, ts.kind, rlen,
+ rse->expr, ts.kind);
+ }
+- else if (ts.type == BT_DERIVED && ts.u.derived->attr.alloc_comp)
++ else if (gfc_bt_struct (ts.type) && ts.u.derived->attr.alloc_comp)
+ {
+ tree tmp_var = NULL_TREE;
+ cond = NULL_TREE;
+@@ -8299,7 +8323,7 @@
+ gfc_add_expr_to_block (&block, tmp);
+ }
+ }
+- else if (ts.type == BT_DERIVED || ts.type == BT_CLASS)
++ else if (gfc_bt_struct (ts.type) || ts.type == BT_CLASS)
+ {
+ gfc_add_block_to_block (&block, &lse->pre);
+ gfc_add_block_to_block (&block, &rse->pre);
+@@ -9503,7 +9527,7 @@
+ case BT_CHARACTER:
+ return false;
+
+- case BT_DERIVED:
++ case_bt_struct:
+ return !expr->ts.u.derived->attr.alloc_comp;
+
+ default:
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/fortran/trans-io.c gcc-6-20160721/gcc/fortran/trans-io.c
+--- gcc-6.1.0/gcc/fortran/trans-io.c 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/gcc/fortran/trans-io.c 2016-05-14 19:52:46.000000000 +0000
+@@ -1685,7 +1685,7 @@
+ gfc_add_expr_to_block (block, tmp);
+ }
+
+- if (ts->type == BT_DERIVED && ts->u.derived->components)
++ if (gfc_bt_struct (ts->type) && ts->u.derived->components)
+ {
+ gfc_component *cmp;
+
+@@ -2211,7 +2211,7 @@
+
+ break;
+
+- case BT_DERIVED:
++ case_bt_struct:
+ if (ts->u.derived->components == NULL)
+ return;
+
+@@ -2330,7 +2330,7 @@
+ gcc_assert (ref && ref->type == REF_ARRAY);
+ }
+
+- if (expr->ts.type != BT_DERIVED
++ if (!gfc_bt_struct (expr->ts.type)
+ && ref && ref->next == NULL
+ && !is_subref_array (expr))
+ {
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/fortran/trans-openmp.c gcc-6-20160721/gcc/fortran/trans-openmp.c
+--- gcc-6.1.0/gcc/fortran/trans-openmp.c 2016-03-17 15:07:54.000000000 +0000
++++ gcc-6-20160721/gcc/fortran/trans-openmp.c 2016-07-02 10:24:41.000000000 +0000
+@@ -61,6 +61,7 @@
+ if (GFC_DECL_GET_SCALAR_POINTER (decl)
+ || GFC_DECL_GET_SCALAR_ALLOCATABLE (decl)
+ || GFC_DECL_CRAY_POINTEE (decl)
++ || GFC_DECL_ASSOCIATE_VAR_P (decl)
+ || VOID_TYPE_P (TREE_TYPE (TREE_TYPE (decl))))
+ return false;
+
+@@ -2180,6 +2181,8 @@
+ tree decl = gfc_get_symbol_decl (n->sym);
+ if (gfc_omp_privatize_by_reference (decl))
+ decl = build_fold_indirect_ref (decl);
++ else if (DECL_P (decl))
++ TREE_ADDRESSABLE (decl) = 1;
+ if (GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (decl)))
+ {
+ tree type = TREE_TYPE (decl);
+@@ -3497,7 +3500,8 @@
+ construct_clauses.independent = false;
+ construct_clauses.tile_list = NULL;
+ construct_clauses.lists[OMP_LIST_PRIVATE] = NULL;
+- construct_clauses.lists[OMP_LIST_REDUCTION] = NULL;
++ if (construct_code == OACC_KERNELS)
++ construct_clauses.lists[OMP_LIST_REDUCTION] = NULL;
+ oacc_clauses = gfc_trans_omp_clauses (&block, &construct_clauses,
+ code->loc);
+ }
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/fortran/trans-stmt.c gcc-6-20160721/gcc/fortran/trans-stmt.c
+--- gcc-6.1.0/gcc/fortran/trans-stmt.c 2016-03-28 09:05:01.000000000 +0000
++++ gcc-6-20160721/gcc/fortran/trans-stmt.c 2016-07-13 16:09:57.000000000 +0000
+@@ -5694,9 +5694,11 @@
+ tmp = gfc_get_char_type (code->ext.alloc.ts.kind);
+ tmp = TYPE_SIZE_UNIT (tmp);
+ tmp = fold_convert (TREE_TYPE (se_sz.expr), tmp);
++ gfc_add_block_to_block (&block, &se_sz.pre);
+ expr3_esize = fold_build2_loc (input_location, MULT_EXPR,
+ TREE_TYPE (se_sz.expr),
+ tmp, se_sz.expr);
++ expr3_esize = gfc_evaluate_now (expr3_esize, &block);
+ }
+ }
+
+@@ -5895,6 +5897,7 @@
+ source= or mold= expression. */
+ gfc_init_se (&se_sz, NULL);
+ gfc_conv_expr (&se_sz, code->ext.alloc.ts.u.cl->length);
++ gfc_add_block_to_block (&block, &se_sz.pre);
+ gfc_add_modify (&block, al_len,
+ fold_convert (TREE_TYPE (al_len),
+ se_sz.expr));
+@@ -5979,11 +5982,19 @@
+ specified by a type spec for deferred length character
+ arrays or unlimited polymorphic objects without a
+ source= or mold= expression. */
+- gfc_init_se (&se_sz, NULL);
+- gfc_conv_expr (&se_sz, code->ext.alloc.ts.u.cl->length);
+- gfc_add_modify (&block, al_len,
+- fold_convert (TREE_TYPE (al_len),
+- se_sz.expr));
++ if (expr3_esize == NULL_TREE || code->ext.alloc.ts.kind != 1)
++ {
++ gfc_init_se (&se_sz, NULL);
++ gfc_conv_expr (&se_sz, code->ext.alloc.ts.u.cl->length);
++ gfc_add_block_to_block (&block, &se_sz.pre);
++ gfc_add_modify (&block, al_len,
++ fold_convert (TREE_TYPE (al_len),
++ se_sz.expr));
++ }
++ else
++ gfc_add_modify (&block, al_len,
++ fold_convert (TREE_TYPE (al_len),
++ expr3_esize));
+ }
+ else
+ /* No length information needed, because type to allocate
+@@ -6275,7 +6286,7 @@
+ {
+ gfc_ref *ref;
+
+- if (expr->ts.type == BT_DERIVED && expr->ts.u.derived->attr.alloc_comp
++ if (gfc_bt_struct (expr->ts.type) && expr->ts.u.derived->attr.alloc_comp
+ && !gfc_is_finalizable (expr->ts.u.derived, NULL))
+ {
+ gfc_ref *last = NULL;
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/fortran/trans-types.c gcc-6-20160721/gcc/fortran/trans-types.c
+--- gcc-6.1.0/gcc/fortran/trans-types.c 2016-02-27 11:57:16.000000000 +0000
++++ gcc-6-20160721/gcc/fortran/trans-types.c 2016-05-14 19:52:46.000000000 +0000
+@@ -1101,6 +1101,10 @@
+ gfc_index_one_node);
+ break;
+
++ case BT_UNION:
++ basetype = gfc_get_union_type (spec->u.derived);
++ break;
++
+ case BT_DERIVED:
+ case BT_CLASS:
+ basetype = gfc_get_derived_type (spec->u.derived);
+@@ -2314,7 +2318,9 @@
+ for (; to_cm; to_cm = to_cm->next, from_cm = from_cm->next)
+ {
+ to_cm->backend_decl = from_cm->backend_decl;
+- if (from_cm->ts.type == BT_DERIVED
++ if (from_cm->ts.type == BT_UNION)
++ gfc_get_union_type (to_cm->ts.u.derived);
++ else if (from_cm->ts.type == BT_DERIVED
+ && (!from_cm->attr.pointer || from_gsym))
+ gfc_get_derived_type (to_cm->ts.u.derived);
+ else if (from_cm->ts.type == BT_CLASS
+@@ -2349,6 +2355,62 @@
+ }
+
+
++/* Build a tree node for a union type. Requires building each map
++ structure which is an element of the union. */
++
++tree
++gfc_get_union_type (gfc_symbol *un)
++{
++ gfc_component *map = NULL;
++ tree typenode = NULL, map_type = NULL, map_field = NULL;
++ tree *chain = NULL;
++
++ if (un->backend_decl)
++ {
++ if (TYPE_FIELDS (un->backend_decl) || un->attr.proc_pointer_comp)
++ return un->backend_decl;
++ else
++ typenode = un->backend_decl;
++ }
++ else
++ {
++ typenode = make_node (UNION_TYPE);
++ TYPE_NAME (typenode) = get_identifier (un->name);
++ }
++
++ /* Add each contained MAP as a field. */
++ for (map = un->components; map; map = map->next)
++ {
++ gcc_assert (map->ts.type == BT_DERIVED);
++
++ /* The map's type node, which is defined within this union's context. */
++ map_type = gfc_get_derived_type (map->ts.u.derived);
++ TYPE_CONTEXT (map_type) = typenode;
++
++ /* The map field's declaration. */
++ map_field = gfc_add_field_to_struct(typenode, get_identifier(map->name),
++ map_type, &chain);
++ if (map->loc.lb)
++ gfc_set_decl_location (map_field, &map->loc);
++ else if (un->declared_at.lb)
++ gfc_set_decl_location (map_field, &un->declared_at);
++
++ DECL_PACKED (map_field) |= TYPE_PACKED (typenode);
++ DECL_NAMELESS(map_field) = true;
++
++ /* We should never clobber another backend declaration for this map,
++ because each map component is unique. */
++ if (!map->backend_decl)
++ map->backend_decl = map_field;
++ }
++
++ un->backend_decl = typenode;
++ gfc_finish_type (typenode);
++
++ return typenode;
++}
++
++
+ /* Build a tree node for a derived type. If there are equal
+ derived types, with different local names, these are built
+ at the same time. If an equal derived type has been built
+@@ -2491,6 +2553,9 @@
+ will be built and so we can return the type. */
+ for (c = derived->components; c; c = c->next)
+ {
++ if (c->ts.type == BT_UNION && c->ts.u.derived->backend_decl == NULL)
++ c->ts.u.derived->backend_decl = gfc_get_union_type (c->ts.u.derived);
++
+ if (c->ts.type != BT_DERIVED && c->ts.type != BT_CLASS)
+ continue;
+
+@@ -2520,7 +2585,10 @@
+ return derived->backend_decl;
+
+ /* Build the type member list. Install the newly created RECORD_TYPE
+- node as DECL_CONTEXT of each FIELD_DECL. */
++ node as DECL_CONTEXT of each FIELD_DECL. In this case we must go
++ through only the top-level linked list of components so we correctly
++ build UNION_TYPE nodes for BT_UNION components. MAPs and other nested
++ types are built as part of gfc_get_union_type. */
+ for (c = derived->components; c; c = c->next)
+ {
+ /* Prevent infinite recursion, when the procedure pointer type is
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/function.c gcc-6-20160721/gcc/function.c
+--- gcc-6.1.0/gcc/function.c 2016-01-08 16:01:12.000000000 +0000
++++ gcc-6-20160721/gcc/function.c 2016-06-22 13:15:48.000000000 +0000
+@@ -3314,6 +3314,8 @@
+ set_mem_attributes (parmreg, parm, 1);
+ }
+
++ /* We need to preserve an address based on VIRTUAL_STACK_VARS_REGNUM for
++ the debug info in case it is not legitimate. */
+ if (GET_MODE (parmreg) != GET_MODE (rtl))
+ {
+ rtx tempreg = gen_reg_rtx (GET_MODE (rtl));
+@@ -3323,7 +3325,8 @@
+ all->last_conversion_insn);
+ emit_move_insn (tempreg, rtl);
+ tempreg = convert_to_mode (GET_MODE (parmreg), tempreg, unsigned_p);
+- emit_move_insn (parmreg, tempreg);
++ emit_move_insn (MEM_P (parmreg) ? copy_rtx (parmreg) : parmreg,
++ tempreg);
+ all->first_conversion_insn = get_insns ();
+ all->last_conversion_insn = get_last_insn ();
+ end_sequence ();
+@@ -3331,7 +3334,7 @@
+ did_conversion = true;
+ }
+ else
+- emit_move_insn (parmreg, rtl);
++ emit_move_insn (MEM_P (parmreg) ? copy_rtx (parmreg) : parmreg, rtl);
+
+ rtl = parmreg;
+
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/gcc.c gcc-6-20160721/gcc/gcc.c
+--- gcc-6.1.0/gcc/gcc.c 2016-02-19 22:18:38.000000000 +0000
++++ gcc-6-20160721/gcc/gcc.c 2016-06-30 14:39:10.000000000 +0000
+@@ -7667,12 +7667,14 @@
+ for (unsigned j = 0; e->values[j].arg != NULL; j++)
+ {
+ char *with_arg = concat (opt_text, e->values[j].arg, NULL);
+- add_misspelling_candidates (m_option_suggestions, with_arg);
++ add_misspelling_candidates (m_option_suggestions, option,
++ with_arg);
+ free (with_arg);
+ }
+ }
+ else
+- add_misspelling_candidates (m_option_suggestions, opt_text);
++ add_misspelling_candidates (m_option_suggestions, option,
++ opt_text);
+ break;
+
+ case OPT_fsanitize_:
+@@ -7696,7 +7698,8 @@
+ /* Add with_arg and all of its variant spellings e.g.
+ "-fno-sanitize=address" to candidates (albeit without
+ leading dashes). */
+- add_misspelling_candidates (m_option_suggestions, with_arg);
++ add_misspelling_candidates (m_option_suggestions, option,
++ with_arg);
+ free (with_arg);
+ }
+ }
+Only in gcc-6.1.0/gcc: gengtype-lex.c
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/genmodes.c gcc-6-20160721/gcc/genmodes.c
+--- gcc-6.1.0/gcc/genmodes.c 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/gcc/genmodes.c 2016-06-27 18:25:58.000000000 +0000
+@@ -66,6 +66,7 @@
+ this mode as a component. */
+ struct mode_data *next_cont; /* Next mode in that list. */
+
++ struct mode_data *complex; /* complex type with mode as component. */
+ const char *file; /* file and line of definition, */
+ unsigned int line; /* for error reporting */
+ unsigned int counter; /* Rank ordering of modes */
+@@ -83,7 +84,7 @@
+ static const struct mode_data blank_mode = {
+ 0, "<unknown>", MAX_MODE_CLASS,
+ -1U, -1U, -1U, -1U,
+- 0, 0, 0, 0, 0,
++ 0, 0, 0, 0, 0, 0,
+ "<unknown>", 0, 0, 0, 0, false, 0
+ };
+
+@@ -472,6 +473,7 @@
+
+ c = new_mode (cclass, buf, file, line);
+ c->component = m;
++ m->complex = c;
+ }
+ }
+
+@@ -1381,6 +1383,22 @@
+ }
+
+ static void
++emit_mode_complex (void)
++{
++ int c;
++ struct mode_data *m;
++
++ print_decl ("unsigned char", "mode_complex", "NUM_MACHINE_MODES");
++
++ for_all_modes (c, m)
++ tagged_printf ("%smode",
++ m->complex ? m->complex->name : void_mode->name,
++ m->name);
++
++ print_closer ();
++}
++
++static void
+ emit_mode_mask (void)
+ {
+ int c;
+@@ -1745,6 +1763,7 @@
+ emit_mode_size ();
+ emit_mode_nunits ();
+ emit_mode_wider ();
++ emit_mode_complex ();
+ emit_mode_mask ();
+ emit_mode_inner ();
+ emit_mode_unit_size ();
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/gimple-fold.c gcc-6-20160721/gcc/gimple-fold.c
+--- gcc-6.1.0/gcc/gimple-fold.c 2016-01-26 15:51:51.000000000 +0000
++++ gcc-6-20160721/gcc/gimple-fold.c 2016-07-19 17:33:58.000000000 +0000
+@@ -795,22 +795,21 @@
+ {
+ tree src_base, dest_base, fn;
+ HOST_WIDE_INT src_offset = 0, dest_offset = 0;
+- HOST_WIDE_INT size = -1;
+- HOST_WIDE_INT maxsize = -1;
+- bool reverse;
++ HOST_WIDE_INT maxsize;
+
+ srcvar = TREE_OPERAND (src, 0);
+- src_base = get_ref_base_and_extent (srcvar, &src_offset,
+- &size, &maxsize, &reverse);
++ src_base = get_addr_base_and_unit_offset (srcvar, &src_offset);
++ if (src_base == NULL)
++ src_base = srcvar;
+ destvar = TREE_OPERAND (dest, 0);
+- dest_base = get_ref_base_and_extent (destvar, &dest_offset,
+- &size, &maxsize, &reverse);
++ dest_base = get_addr_base_and_unit_offset (destvar,
++ &dest_offset);
++ if (dest_base == NULL)
++ dest_base = destvar;
+ if (tree_fits_uhwi_p (len))
+ maxsize = tree_to_uhwi (len);
+ else
+ maxsize = -1;
+- src_offset /= BITS_PER_UNIT;
+- dest_offset /= BITS_PER_UNIT;
+ if (SSA_VAR_P (src_base)
+ && SSA_VAR_P (dest_base))
+ {
+@@ -3039,10 +3038,25 @@
+ }
+ if (targets.length () == 1)
+ {
+- gimple_call_set_fndecl (stmt, targets[0]->decl);
++ tree fndecl = targets[0]->decl;
++ gimple_call_set_fndecl (stmt, fndecl);
+ changed = true;
++ /* If changing the call to __cxa_pure_virtual
++ or similar noreturn function, adjust gimple_call_fntype
++ too. */
++ if ((gimple_call_flags (stmt) & ECF_NORETURN)
++ && VOID_TYPE_P (TREE_TYPE (TREE_TYPE (fndecl)))
++ && TYPE_ARG_TYPES (TREE_TYPE (fndecl))
++ && (TREE_VALUE (TYPE_ARG_TYPES (TREE_TYPE (fndecl)))
++ == void_type_node))
++ gimple_call_set_fntype (stmt, TREE_TYPE (fndecl));
+ /* If the call becomes noreturn, remove the lhs. */
+- if (lhs && (gimple_call_flags (stmt) & ECF_NORETURN))
++ if (lhs
++ && (gimple_call_flags (stmt) & ECF_NORETURN)
++ && (VOID_TYPE_P (TREE_TYPE (gimple_call_fntype (stmt)))
++ || ((TREE_CODE (TYPE_SIZE_UNIT (TREE_TYPE (lhs)))
++ == INTEGER_CST)
++ && !TREE_ADDRESSABLE (TREE_TYPE (lhs)))))
+ {
+ if (TREE_CODE (lhs) == SSA_NAME)
+ {
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/gimple.c gcc-6-20160721/gcc/gimple.c
+--- gcc-6.1.0/gcc/gimple.c 2016-03-11 12:28:50.000000000 +0000
++++ gcc-6-20160721/gcc/gimple.c 2016-06-10 09:45:51.000000000 +0000
+@@ -1355,7 +1355,8 @@
+ if (gimple_call_internal_p (c1))
+ return (gimple_call_internal_p (c2)
+ && gimple_call_internal_fn (c1) == gimple_call_internal_fn (c2)
+- && !gimple_call_internal_unique_p (as_a <const gcall *> (c1)));
++ && (!gimple_call_internal_unique_p (as_a <const gcall *> (c1))
++ || c1 == c2));
+ else
+ return (gimple_call_fn (c1) == gimple_call_fn (c2)
+ || (gimple_call_fndecl (c1)
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/gimplify.c gcc-6-20160721/gcc/gimplify.c
+--- gcc-6.1.0/gcc/gimplify.c 2016-04-13 12:27:52.000000000 +0000
++++ gcc-6-20160721/gcc/gimplify.c 2016-06-21 07:09:57.000000000 +0000
+@@ -6894,6 +6894,11 @@
+ {
+ while (TREE_CODE (decl) == COMPONENT_REF)
+ decl = TREE_OPERAND (decl, 0);
++ if (TREE_CODE (decl) == INDIRECT_REF
++ && DECL_P (TREE_OPERAND (decl, 0))
++ && (TREE_CODE (TREE_TYPE (TREE_OPERAND (decl, 0)))
++ == REFERENCE_TYPE))
++ decl = TREE_OPERAND (decl, 0);
+ }
+ if (gimplify_expr (pd, pre_p, NULL, is_gimple_lvalue, fb_lvalue)
+ == GS_ERROR)
+@@ -6909,9 +6914,11 @@
+ break;
+ }
+
+- if (TYPE_SIZE_UNIT (TREE_TYPE (decl)) == NULL
+- || (TREE_CODE (TYPE_SIZE_UNIT (TREE_TYPE (decl)))
+- != INTEGER_CST))
++ tree stype = TREE_TYPE (decl);
++ if (TREE_CODE (stype) == REFERENCE_TYPE)
++ stype = TREE_TYPE (stype);
++ if (TYPE_SIZE_UNIT (stype) == NULL
++ || TREE_CODE (TYPE_SIZE_UNIT (stype)) != INTEGER_CST)
+ {
+ error_at (OMP_CLAUSE_LOCATION (c),
+ "mapping field %qE of variable length "
+@@ -6951,6 +6958,14 @@
+ base = get_inner_reference (base, &bitsize, &bitpos, &offset,
+ &mode, &unsignedp, &reversep,
+ &volatilep, false);
++ tree orig_base = base;
++ if ((TREE_CODE (base) == INDIRECT_REF
++ || (TREE_CODE (base) == MEM_REF
++ && integer_zerop (TREE_OPERAND (base, 1))))
++ && DECL_P (TREE_OPERAND (base, 0))
++ && (TREE_CODE (TREE_TYPE (TREE_OPERAND (base, 0)))
++ == REFERENCE_TYPE))
++ base = TREE_OPERAND (base, 0);
+ gcc_assert (base == decl
+ && (offset == NULL_TREE
+ || TREE_CODE (offset) == INTEGER_CST));
+@@ -6964,7 +6979,10 @@
+ tree l = build_omp_clause (OMP_CLAUSE_LOCATION (c),
+ OMP_CLAUSE_MAP);
+ OMP_CLAUSE_SET_MAP_KIND (l, GOMP_MAP_STRUCT);
+- OMP_CLAUSE_DECL (l) = decl;
++ if (orig_base != base)
++ OMP_CLAUSE_DECL (l) = unshare_expr (orig_base);
++ else
++ OMP_CLAUSE_DECL (l) = decl;
+ OMP_CLAUSE_SIZE (l) = size_int (1);
+ if (struct_map_to_clause == NULL)
+ struct_map_to_clause = new hash_map<tree, tree>;
+@@ -7006,6 +7024,18 @@
+ *list_p = l;
+ list_p = &OMP_CLAUSE_CHAIN (l);
+ }
++ if (orig_base != base && code == OMP_TARGET)
++ {
++ tree c2 = build_omp_clause (OMP_CLAUSE_LOCATION (c),
++ OMP_CLAUSE_MAP);
++ enum gomp_map_kind mkind
++ = GOMP_MAP_FIRSTPRIVATE_REFERENCE;
++ OMP_CLAUSE_SET_MAP_KIND (c2, mkind);
++ OMP_CLAUSE_DECL (c2) = decl;
++ OMP_CLAUSE_SIZE (c2) = size_zero_node;
++ OMP_CLAUSE_CHAIN (c2) = OMP_CLAUSE_CHAIN (l);
++ OMP_CLAUSE_CHAIN (l) = c2;
++ }
+ flags = GOVD_MAP | GOVD_EXPLICIT;
+ if (GOMP_MAP_ALWAYS_P (OMP_CLAUSE_MAP_KIND (c)) || ptr)
+ flags |= GOVD_SEEN;
+@@ -7024,8 +7054,12 @@
+ o1 = 0;
+ if (bitpos)
+ o1 = o1 + bitpos / BITS_PER_UNIT;
+- for (sc = &OMP_CLAUSE_CHAIN (*osc);
+- *sc != c; sc = &OMP_CLAUSE_CHAIN (*sc))
++ sc = &OMP_CLAUSE_CHAIN (*osc);
++ if (*sc != c
++ && (OMP_CLAUSE_MAP_KIND (*sc)
++ == GOMP_MAP_FIRSTPRIVATE_REFERENCE))
++ sc = &OMP_CLAUSE_CHAIN (*sc);
++ for (; *sc != c; sc = &OMP_CLAUSE_CHAIN (*sc))
+ if (ptr && sc == prev_list_p)
+ break;
+ else if (TREE_CODE (OMP_CLAUSE_DECL (*sc))
+@@ -7061,6 +7095,15 @@
+ &mode, &unsignedp,
+ &reversep, &volatilep,
+ false);
++ if ((TREE_CODE (base) == INDIRECT_REF
++ || (TREE_CODE (base) == MEM_REF
++ && integer_zerop (TREE_OPERAND (base,
++ 1))))
++ && DECL_P (TREE_OPERAND (base, 0))
++ && (TREE_CODE (TREE_TYPE (TREE_OPERAND (base,
++ 0)))
++ == REFERENCE_TYPE))
++ base = TREE_OPERAND (base, 0);
+ if (base != decl)
+ break;
+ if (scp)
+@@ -8224,7 +8267,13 @@
+ case OMP_CLAUSE_VECTOR:
+ case OMP_CLAUSE_AUTO:
+ case OMP_CLAUSE_SEQ:
++ break;
++
+ case OMP_CLAUSE_TILE:
++ /* We're not yet making use of the information provided by OpenACC
++ tile clauses. Discard these here, to simplify later middle end
++ processing. */
++ remove = true;
+ break;
+
+ default:
+@@ -8785,7 +8834,10 @@
+ decl, false))
+ ;
+ else if (outer->region_type != ORT_COMBINED_PARALLEL)
+- outer = NULL;
++ {
++ omp_notice_variable (outer, decl, true);
++ outer = NULL;
++ }
+ if (outer)
+ {
+ n = splay_tree_lookup (outer->variables,
+@@ -8868,7 +8920,10 @@
+ decl, false))
+ ;
+ else if (outer->region_type != ORT_COMBINED_PARALLEL)
+- outer = NULL;
++ {
++ omp_notice_variable (outer, decl, true);
++ outer = NULL;
++ }
+ if (outer)
+ {
+ n = splay_tree_lookup (outer->variables,
+@@ -8946,7 +9001,12 @@
+ || (ort == ORT_SIMD
+ && TREE_VEC_LENGTH (OMP_FOR_INIT (for_stmt)) > 1))
+ {
++ struct gimplify_omp_ctx *ctx = gimplify_omp_ctxp;
++ /* Make sure omp_add_variable is not called on it prematurely.
++ We call it ourselves a few lines later. */
++ gimplify_omp_ctxp = NULL;
+ var = create_tmp_var (TREE_TYPE (decl), get_name (decl));
++ gimplify_omp_ctxp = ctx;
+ TREE_OPERAND (t, 0) = var;
+
+ gimplify_seq_add_stmt (&for_body, gimple_build_assign (decl, var));
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/graphite-isl-ast-to-gimple.c gcc-6-20160721/gcc/graphite-isl-ast-to-gimple.c
+--- gcc-6.1.0/gcc/graphite-isl-ast-to-gimple.c 2016-04-22 11:09:22.000000000 +0000
++++ gcc-6-20160721/gcc/graphite-isl-ast-to-gimple.c 2016-05-31 07:27:23.000000000 +0000
+@@ -1075,9 +1075,7 @@
+ static bool
+ bb_contains_loop_phi_nodes (basic_block bb)
+ {
+- gcc_assert (EDGE_COUNT (bb->preds) <= 2);
+-
+- if (bb->preds->length () == 1)
++ if (EDGE_COUNT (bb->preds) != 2)
+ return false;
+
+ unsigned depth = loop_depth (bb->loop_father);
+@@ -1792,7 +1790,6 @@
+ b1 = b2;
+ }
+
+- gcc_assert (b1);
+ return b1;
+ }
+
+@@ -2481,13 +2478,14 @@
+
+ gcc_assert (!bb_contains_loop_close_phi_nodes (bb));
+
++ /* TODO: Handle cond phi nodes with more than 2 predecessors. */
++ if (EDGE_COUNT (bb->preds) != 2)
++ return false;
++
+ if (dump_file)
+ fprintf (dump_file, "[codegen] copying cond phi nodes in bb_%d.\n",
+ new_bb->index);
+
+- /* Cond phi nodes should have exactly two arguments. */
+- gcc_assert (2 == EDGE_COUNT (bb->preds));
+-
+ for (gphi_iterator psi = gsi_start_phis (bb); !gsi_end_p (psi);
+ gsi_next (&psi))
+ {
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/graphite-scop-detection.c gcc-6-20160721/gcc/graphite-scop-detection.c
+--- gcc-6.1.0/gcc/graphite-scop-detection.c 2016-03-16 09:19:23.000000000 +0000
++++ gcc-6-20160721/gcc/graphite-scop-detection.c 2016-05-07 07:02:36.000000000 +0000
+@@ -1722,8 +1722,7 @@
+ build_cross_bb_scalars_def (scop_p scop, tree def, basic_block def_bb,
+ vec<tree> *writes)
+ {
+- gcc_assert (def);
+- if (!is_gimple_reg (def))
++ if (!def || !is_gimple_reg (def))
+ return;
+
+ /* Do not gather scalar variables that can be analyzed by SCEV as they can be
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/hsa-gen.c gcc-6-20160721/gcc/hsa-gen.c
+--- gcc-6.1.0/gcc/hsa-gen.c 2016-04-04 08:46:51.000000000 +0000
++++ gcc-6-20160721/gcc/hsa-gen.c 2016-05-23 11:54:52.000000000 +0000
+@@ -203,9 +203,13 @@
+ {
+ m_decl = decl;
+ m_type = hsa_type_for_tree_type (TREE_TYPE (decl), &m_dim, false);
+-
+ if (hsa_seen_error ())
+- m_seen_error = true;
++ {
++ m_seen_error = true;
++ return;
++ }
++
++ m_align = MAX (m_align, hsa_natural_alignment (m_type));
+ }
+
+ /* Constructor of class representing global HSA function/kernel information and
+@@ -929,6 +933,14 @@
+ BRIG_LINKAGE_PROGRAM, true,
+ BRIG_ALLOCATION_PROGRAM, align);
+ hsa_cfun->m_global_symbols.safe_push (sym);
++ sym->fillup_for_decl (decl);
++ if (sym->m_align > align)
++ {
++ sym->m_seen_error = true;
++ HSA_SORRY_ATV (EXPR_LOCATION (decl),
++ "HSA specification requires that %E is at least "
++ "naturally aligned", decl);
++ }
+ }
+ else
+ {
+@@ -944,12 +956,11 @@
+ sym = new hsa_symbol (BRIG_TYPE_NONE, BRIG_SEGMENT_PRIVATE,
+ BRIG_LINKAGE_FUNCTION);
+ sym->m_align = align;
++ sym->fillup_for_decl (decl);
+ hsa_cfun->m_private_variables.safe_push (sym);
+ }
+
+- sym->fillup_for_decl (decl);
+ sym->m_name = hsa_get_declaration_name (decl);
+-
+ *slot = sym;
+ return sym;
+ }
+@@ -3471,6 +3482,12 @@
+ basic_block default_label_bb = label_to_block_fn (func,
+ CASE_LABEL (default_label));
+
++ if (!gimple_seq_empty_p (phi_nodes (default_label_bb)))
++ {
++ default_label_bb = split_edge (find_edge (e->dest, default_label_bb));
++ hsa_init_new_bb (default_label_bb);
++ }
++
+ make_edge (e->src, default_label_bb, EDGE_FALSE_VALUE);
+
+ hsa_cfun->m_modified_cfg = true;
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/ipa-chkp.c gcc-6-20160721/gcc/ipa-chkp.c
+--- gcc-6.1.0/gcc/ipa-chkp.c 2016-03-16 16:50:18.000000000 +0000
++++ gcc-6-20160721/gcc/ipa-chkp.c 2016-06-20 11:35:02.000000000 +0000
+@@ -207,7 +207,13 @@
+ /* For functions with body versioning will make a copy of arguments.
+ For functions with no body we need to do it here. */
+ if (!gimple_has_body_p (fndecl))
+- DECL_ARGUMENTS (new_decl) = copy_list (DECL_ARGUMENTS (fndecl));
++ {
++ tree arg;
++
++ DECL_ARGUMENTS (new_decl) = copy_list (DECL_ARGUMENTS (fndecl));
++ for (arg = DECL_ARGUMENTS (new_decl); arg; arg = DECL_CHAIN (arg))
++ DECL_CONTEXT (arg) = new_decl;
++ }
+
+ /* We are going to modify attributes list and therefore should
+ make own copy. */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/ipa-icf.c gcc-6-20160721/gcc/ipa-icf.c
+--- gcc-6.1.0/gcc/ipa-icf.c 2016-04-22 11:09:22.000000000 +0000
++++ gcc-6-20160721/gcc/ipa-icf.c 2016-05-19 08:09:11.000000000 +0000
+@@ -2258,6 +2258,8 @@
+
+ varpool_node::create_alias (alias_var->decl, decl);
+ alias->resolve_alias (original);
++ if (DECL_PT_UID_SET_P (original->decl))
++ SET_DECL_PT_UID (alias->decl, DECL_PT_UID (original->decl));
+
+ if (dump_file)
+ fprintf (dump_file, "Unified; Variable alias has been created.\n\n");
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/ipa-inline-analysis.c gcc-6-20160721/gcc/ipa-inline-analysis.c
+--- gcc-6.1.0/gcc/ipa-inline-analysis.c 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/gcc/ipa-inline-analysis.c 2016-07-13 12:19:44.000000000 +0000
+@@ -216,13 +216,14 @@
+ bool by_ref;
+ };
+
+-/* Add condition to condition list CONDS. AGGPOS describes whether the used
+- oprand is loaded from an aggregate and where in the aggregate it is. It can
+- be NULL, which means this not a load from an aggregate. */
++/* Add condition to condition list SUMMARY. OPERAND_NUM, SIZE, CODE and VAL
++ correspond to fields of condition structure. AGGPOS describes whether the
++ used operand is loaded from an aggregate and where in the aggregate it is.
++ It can be NULL, which means this not a load from an aggregate. */
+
+ static struct predicate
+ add_condition (struct inline_summary *summary, int operand_num,
+- struct agg_position_info *aggpos,
++ HOST_WIDE_INT size, struct agg_position_info *aggpos,
+ enum tree_code code, tree val)
+ {
+ int i;
+@@ -248,6 +249,7 @@
+ for (i = 0; vec_safe_iterate (summary->conds, i, &c); i++)
+ {
+ if (c->operand_num == operand_num
++ && c->size == size
+ && c->code == code
+ && c->val == val
+ && c->agg_contents == agg_contents
+@@ -264,6 +266,7 @@
+ new_cond.agg_contents = agg_contents;
+ new_cond.by_ref = by_ref;
+ new_cond.offset = offset;
++ new_cond.size = size;
+ vec_safe_push (summary->conds, new_cond);
+ return single_cond_predicate (i + predicate_first_dynamic_condition);
+ }
+@@ -867,21 +870,25 @@
+ clause |= 1 << (i + predicate_first_dynamic_condition);
+ continue;
+ }
+- if (c->code == IS_NOT_CONSTANT || c->code == CHANGED)
++ if (c->code == CHANGED)
+ continue;
+
+- if (operand_equal_p (TYPE_SIZE (TREE_TYPE (c->val)),
+- TYPE_SIZE (TREE_TYPE (val)), 0))
++ if (tree_to_shwi (TYPE_SIZE (TREE_TYPE (val))) != c->size)
+ {
+- val = fold_unary (VIEW_CONVERT_EXPR, TREE_TYPE (c->val), val);
++ clause |= 1 << (i + predicate_first_dynamic_condition);
++ continue;
++ }
++ if (c->code == IS_NOT_CONSTANT)
++ continue;
+
+- res = val
+- ? fold_binary_to_constant (c->code, boolean_type_node, val, c->val)
+- : NULL;
++ val = fold_unary (VIEW_CONVERT_EXPR, TREE_TYPE (c->val), val);
++ res = val
++ ? fold_binary_to_constant (c->code, boolean_type_node, val, c->val)
++ : NULL;
++
++ if (res && integer_zerop (res))
++ continue;
+
+- if (res && integer_zerop (res))
+- continue;
+- }
+ clause |= 1 << (i + predicate_first_dynamic_condition);
+ }
+ return clause;
+@@ -1515,16 +1522,21 @@
+ }
+
+ /* If OP refers to value of function parameter, return the corresponding
+- parameter. */
++ parameter. If non-NULL, the size of the memory load (or the SSA_NAME of the
++ PARM_DECL) will be stored to *SIZE_P in that case too. */
+
+ static tree
+-unmodified_parm_1 (gimple *stmt, tree op)
++unmodified_parm_1 (gimple *stmt, tree op, HOST_WIDE_INT *size_p)
+ {
+ /* SSA_NAME referring to parm default def? */
+ if (TREE_CODE (op) == SSA_NAME
+ && SSA_NAME_IS_DEFAULT_DEF (op)
+ && TREE_CODE (SSA_NAME_VAR (op)) == PARM_DECL)
+- return SSA_NAME_VAR (op);
++ {
++ if (size_p)
++ *size_p = tree_to_shwi (TYPE_SIZE (TREE_TYPE (op)));
++ return SSA_NAME_VAR (op);
++ }
+ /* Non-SSA parm reference? */
+ if (TREE_CODE (op) == PARM_DECL)
+ {
+@@ -1535,18 +1547,24 @@
+ walk_aliased_vdefs (&refd, gimple_vuse (stmt), mark_modified, &modified,
+ NULL);
+ if (!modified)
+- return op;
++ {
++ if (size_p)
++ *size_p = tree_to_shwi (TYPE_SIZE (TREE_TYPE (op)));
++ return op;
++ }
+ }
+ return NULL_TREE;
+ }
+
+ /* If OP refers to value of function parameter, return the corresponding
+- parameter. Also traverse chains of SSA register assignments. */
++ parameter. Also traverse chains of SSA register assignments. If non-NULL,
++ the size of the memory load (or the SSA_NAME of the PARM_DECL) will be
++ stored to *SIZE_P in that case too. */
+
+ static tree
+-unmodified_parm (gimple *stmt, tree op)
++unmodified_parm (gimple *stmt, tree op, HOST_WIDE_INT *size_p)
+ {
+- tree res = unmodified_parm_1 (stmt, op);
++ tree res = unmodified_parm_1 (stmt, op, size_p);
+ if (res)
+ return res;
+
+@@ -1554,23 +1572,25 @@
+ && !SSA_NAME_IS_DEFAULT_DEF (op)
+ && gimple_assign_single_p (SSA_NAME_DEF_STMT (op)))
+ return unmodified_parm (SSA_NAME_DEF_STMT (op),
+- gimple_assign_rhs1 (SSA_NAME_DEF_STMT (op)));
++ gimple_assign_rhs1 (SSA_NAME_DEF_STMT (op)),
++ size_p);
+ return NULL_TREE;
+ }
+
+ /* If OP refers to a value of a function parameter or value loaded from an
+ aggregate passed to a parameter (either by value or reference), return TRUE
+- and store the number of the parameter to *INDEX_P and information whether
+- and how it has been loaded from an aggregate into *AGGPOS. INFO describes
+- the function parameters, STMT is the statement in which OP is used or
+- loaded. */
++ and store the number of the parameter to *INDEX_P, the access size into
++ *SIZE_P, and information whether and how it has been loaded from an
++ aggregate into *AGGPOS. INFO describes the function parameters, STMT is the
++ statement in which OP is used or loaded. */
+
+ static bool
+ unmodified_parm_or_parm_agg_item (struct ipa_func_body_info *fbi,
+ gimple *stmt, tree op, int *index_p,
++ HOST_WIDE_INT *size_p,
+ struct agg_position_info *aggpos)
+ {
+- tree res = unmodified_parm_1 (stmt, op);
++ tree res = unmodified_parm_1 (stmt, op, size_p);
+
+ gcc_checking_assert (aggpos);
+ if (res)
+@@ -1591,14 +1611,14 @@
+ stmt = SSA_NAME_DEF_STMT (op);
+ op = gimple_assign_rhs1 (stmt);
+ if (!REFERENCE_CLASS_P (op))
+- return unmodified_parm_or_parm_agg_item (fbi, stmt, op, index_p,
++ return unmodified_parm_or_parm_agg_item (fbi, stmt, op, index_p, size_p,
+ aggpos);
+ }
+
+ aggpos->agg_contents = true;
+ return ipa_load_from_parm_agg (fbi, fbi->info->descriptors,
+ stmt, op, index_p, &aggpos->offset,
+- NULL, &aggpos->by_ref);
++ size_p, &aggpos->by_ref);
+ }
+
+ /* See if statement might disappear after inlining.
+@@ -1649,7 +1669,7 @@
+ inner_lhs = lhs;
+
+ /* Reads of parameter are expected to be free. */
+- if (unmodified_parm (stmt, inner_rhs))
++ if (unmodified_parm (stmt, inner_rhs, NULL))
+ rhs_free = true;
+ /* Match expressions of form &this->field. Those will most likely
+ combine with something upstream after inlining. */
+@@ -1659,7 +1679,7 @@
+ if (TREE_CODE (op) == PARM_DECL)
+ rhs_free = true;
+ else if (TREE_CODE (op) == MEM_REF
+- && unmodified_parm (stmt, TREE_OPERAND (op, 0)))
++ && unmodified_parm (stmt, TREE_OPERAND (op, 0), NULL))
+ rhs_free = true;
+ }
+
+@@ -1672,7 +1692,7 @@
+ /* Reads of parameters passed by reference
+ expected to be free (i.e. optimized out after inlining). */
+ if (TREE_CODE (inner_rhs) == MEM_REF
+- && unmodified_parm (stmt, TREE_OPERAND (inner_rhs, 0)))
++ && unmodified_parm (stmt, TREE_OPERAND (inner_rhs, 0), NULL))
+ rhs_free = true;
+
+ /* Copying parameter passed by reference into gimple register is
+@@ -1713,7 +1733,7 @@
+ if (TREE_CODE (inner_lhs) == PARM_DECL
+ || TREE_CODE (inner_lhs) == RESULT_DECL
+ || (TREE_CODE (inner_lhs) == MEM_REF
+- && (unmodified_parm (stmt, TREE_OPERAND (inner_lhs, 0))
++ && (unmodified_parm (stmt, TREE_OPERAND (inner_lhs, 0), NULL)
+ || (TREE_CODE (TREE_OPERAND (inner_lhs, 0)) == SSA_NAME
+ && SSA_NAME_VAR (TREE_OPERAND (inner_lhs, 0))
+ && TREE_CODE (SSA_NAME_VAR (TREE_OPERAND
+@@ -1744,6 +1764,7 @@
+ gimple *last;
+ tree op;
+ int index;
++ HOST_WIDE_INT size;
+ struct agg_position_info aggpos;
+ enum tree_code code, inverted_code;
+ edge e;
+@@ -1760,7 +1781,7 @@
+ /* TODO: handle conditionals like
+ var = op0 < 4;
+ if (var != 0). */
+- if (unmodified_parm_or_parm_agg_item (fbi, last, op, &index, &aggpos))
++ if (unmodified_parm_or_parm_agg_item (fbi, last, op, &index, &size, &aggpos))
+ {
+ code = gimple_cond_code (last);
+ inverted_code = invert_tree_comparison (code, HONOR_NANS (op));
+@@ -1774,9 +1795,10 @@
+ unordered one. Be sure it is not confused with NON_CONSTANT. */
+ if (this_code != ERROR_MARK)
+ {
+- struct predicate p = add_condition
+- (summary, index, &aggpos, this_code,
+- unshare_expr_without_location (gimple_cond_rhs (last)));
++ struct predicate p
++ = add_condition (summary, index, size, &aggpos, this_code,
++ unshare_expr_without_location
++ (gimple_cond_rhs (last)));
+ e->aux = edge_predicate_pool.allocate ();
+ *(struct predicate *) e->aux = p;
+ }
+@@ -1803,11 +1825,12 @@
+ || gimple_call_num_args (set_stmt) != 1)
+ return;
+ op2 = gimple_call_arg (set_stmt, 0);
+- if (!unmodified_parm_or_parm_agg_item (fbi, set_stmt, op2, &index, &aggpos))
++ if (!unmodified_parm_or_parm_agg_item (fbi, set_stmt, op2, &index, &size,
++ &aggpos))
+ return;
+ FOR_EACH_EDGE (e, ei, bb->succs) if (e->flags & EDGE_FALSE_VALUE)
+ {
+- struct predicate p = add_condition (summary, index, &aggpos,
++ struct predicate p = add_condition (summary, index, size, &aggpos,
+ IS_NOT_CONSTANT, NULL_TREE);
+ e->aux = edge_predicate_pool.allocate ();
+ *(struct predicate *) e->aux = p;
+@@ -1826,6 +1849,7 @@
+ gimple *lastg;
+ tree op;
+ int index;
++ HOST_WIDE_INT size;
+ struct agg_position_info aggpos;
+ edge e;
+ edge_iterator ei;
+@@ -1837,7 +1861,7 @@
+ return;
+ gswitch *last = as_a <gswitch *> (lastg);
+ op = gimple_switch_index (last);
+- if (!unmodified_parm_or_parm_agg_item (fbi, last, op, &index, &aggpos))
++ if (!unmodified_parm_or_parm_agg_item (fbi, last, op, &index, &size, &aggpos))
+ return;
+
+ FOR_EACH_EDGE (e, ei, bb->succs)
+@@ -1862,14 +1886,14 @@
+ if (!min && !max)
+ p = true_predicate ();
+ else if (!max)
+- p = add_condition (summary, index, &aggpos, EQ_EXPR,
++ p = add_condition (summary, index, size, &aggpos, EQ_EXPR,
+ unshare_expr_without_location (min));
+ else
+ {
+ struct predicate p1, p2;
+- p1 = add_condition (summary, index, &aggpos, GE_EXPR,
++ p1 = add_condition (summary, index, size, &aggpos, GE_EXPR,
+ unshare_expr_without_location (min));
+- p2 = add_condition (summary, index, &aggpos, LE_EXPR,
++ p2 = add_condition (summary, index, size, &aggpos, LE_EXPR,
+ unshare_expr_without_location (max));
+ p = and_predicates (summary->conds, &p1, &p2);
+ }
+@@ -1970,13 +1994,14 @@
+ {
+ tree parm;
+ int index;
++ HOST_WIDE_INT size;
+
+ while (UNARY_CLASS_P (expr))
+ expr = TREE_OPERAND (expr, 0);
+
+- parm = unmodified_parm (NULL, expr);
++ parm = unmodified_parm (NULL, expr, &size);
+ if (parm && (index = ipa_get_param_decl_index (info, parm)) >= 0)
+- return add_condition (summary, index, NULL, CHANGED, NULL_TREE);
++ return add_condition (summary, index, size, NULL, CHANGED, NULL_TREE);
+ if (is_gimple_min_invariant (expr))
+ return false_predicate ();
+ if (TREE_CODE (expr) == SSA_NAME)
+@@ -2037,6 +2062,7 @@
+ struct predicate op_non_const;
+ bool is_load;
+ int base_index;
++ HOST_WIDE_INT size;
+ struct agg_position_info aggpos;
+
+ /* What statments might be optimized away
+@@ -2060,7 +2086,7 @@
+ tree op;
+ gcc_assert (gimple_assign_single_p (stmt));
+ op = gimple_assign_rhs1 (stmt);
+- if (!unmodified_parm_or_parm_agg_item (fbi, stmt, op, &base_index,
++ if (!unmodified_parm_or_parm_agg_item (fbi, stmt, op, &base_index, &size,
+ &aggpos))
+ return p;
+ }
+@@ -2071,7 +2097,7 @@
+ adding conditionals. */
+ FOR_EACH_SSA_TREE_OPERAND (use, stmt, iter, SSA_OP_USE)
+ {
+- tree parm = unmodified_parm (stmt, use);
++ tree parm = unmodified_parm (stmt, use, NULL);
+ /* For arguments we can build a condition. */
+ if (parm && ipa_get_param_decl_index (fbi->info, parm) >= 0)
+ continue;
+@@ -2086,18 +2112,19 @@
+
+ if (is_load)
+ op_non_const =
+- add_condition (summary, base_index, &aggpos, CHANGED, NULL);
++ add_condition (summary, base_index, size, &aggpos, CHANGED, NULL);
+ else
+ op_non_const = false_predicate ();
+ FOR_EACH_SSA_TREE_OPERAND (use, stmt, iter, SSA_OP_USE)
+ {
+- tree parm = unmodified_parm (stmt, use);
++ HOST_WIDE_INT size;
++ tree parm = unmodified_parm (stmt, use, &size);
+ int index;
+
+ if (parm && (index = ipa_get_param_decl_index (fbi->info, parm)) >= 0)
+ {
+ if (index != base_index)
+- p = add_condition (summary, index, NULL, CHANGED, NULL_TREE);
++ p = add_condition (summary, index, size, NULL, CHANGED, NULL_TREE);
+ else
+ continue;
+ }
+@@ -2950,6 +2977,18 @@
+ node->local.can_change_signature = !e;
+ }
+ }
++
++ /* Functions called by instrumentation thunk can't change signature
++ because instrumentation thunk modification is not supported. */
++ if (node->local.can_change_signature)
++ for (e = node->callers; e; e = e->next_caller)
++ if (e->caller->thunk.thunk_p
++ && e->caller->thunk.add_pointer_bounds_args)
++ {
++ node->local.can_change_signature = false;
++ break;
++ }
++
+ estimate_function_body_sizes (node, early);
+
+ for (e = node->callees; e; e = e->next_callee)
+@@ -3377,7 +3416,8 @@
+ ap.by_ref = c->by_ref;
+ cond_predicate = add_condition (info,
+ operand_map[c->operand_num],
+- &ap, c->code, c->val);
++ c->size, &ap, c->code,
++ c->val);
+ }
+ }
+ /* Fixed conditions remains same, construct single
+@@ -4236,6 +4276,7 @@
+ {
+ struct condition c;
+ c.operand_num = streamer_read_uhwi (&ib);
++ c.size = streamer_read_uhwi (&ib);
+ c.code = (enum tree_code) streamer_read_uhwi (&ib);
+ c.val = stream_read_tree (&ib, data_in);
+ bp = streamer_read_bitpack (&ib);
+@@ -4400,6 +4441,7 @@
+ for (i = 0; vec_safe_iterate (info->conds, i, &c); i++)
+ {
+ streamer_write_uhwi (ob, c->operand_num);
++ streamer_write_uhwi (ob, c->size);
+ streamer_write_uhwi (ob, c->code);
+ stream_write_tree (ob, c->val, true);
+ bp = bitpack_create (ob->main_stream);
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/ipa-inline-transform.c gcc-6-20160721/gcc/ipa-inline-transform.c
+--- gcc-6.1.0/gcc/ipa-inline-transform.c 2016-03-26 10:08:47.000000000 +0000
++++ gcc-6-20160721/gcc/ipa-inline-transform.c 2016-06-30 08:46:30.000000000 +0000
+@@ -334,7 +334,6 @@
+ if (dump_file)
+ fprintf (dump_file, "Dropping flag_strict_aliasing on %s:%i\n",
+ to->name (), to->order);
+- build_optimization_node (&opts);
+ DECL_FUNCTION_SPECIFIC_OPTIMIZATION (to->decl)
+ = build_optimization_node (&opts);
+ }
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/ipa-inline.h gcc-6-20160721/gcc/ipa-inline.h
+--- gcc-6.1.0/gcc/ipa-inline.h 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/gcc/ipa-inline.h 2016-05-19 14:56:35.000000000 +0000
+@@ -34,6 +34,8 @@
+ /* If agg_contents is set, this is the offset from which the used data was
+ loaded. */
+ HOST_WIDE_INT offset;
++ /* Size of the access reading the data (or the PARM_DECL SSA_NAME). */
++ HOST_WIDE_INT size;
+ tree val;
+ int operand_num;
+ ENUM_BITFIELD(tree_code) code : 16;
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/ipa-prop.c gcc-6-20160721/gcc/ipa-prop.c
+--- gcc-6.1.0/gcc/ipa-prop.c 2016-03-29 12:36:39.000000000 +0000
++++ gcc-6-20160721/gcc/ipa-prop.c 2016-05-19 15:00:12.000000000 +0000
+@@ -1414,6 +1414,9 @@
+ bool check_ref, by_ref;
+ ao_ref r;
+
++ if (PARAM_VALUE (PARAM_IPA_MAX_AGG_ITEMS) == 0)
++ return;
++
+ /* The function operates in three stages. First, we prepare check_ref, r,
+ arg_base and arg_offset based on what is actually passed as an actual
+ argument. */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/ira-build.c gcc-6-20160721/gcc/ira-build.c
+--- gcc-6.1.0/gcc/ira-build.c 2016-02-11 23:53:54.000000000 +0000
++++ gcc-6-20160721/gcc/ira-build.c 2016-07-18 13:01:12.000000000 +0000
+@@ -2251,7 +2251,7 @@
+ );
+ }
+ qsort (sorted_loops, n, sizeof (ira_loop_tree_node_t), loop_compare_func);
+- for (i = 0; n - i + 1 > IRA_MAX_LOOPS_NUM; i++)
++ for (i = 0; i < n - IRA_MAX_LOOPS_NUM; i++)
+ {
+ sorted_loops[i]->to_remove_p = true;
+ if (internal_flag_ira_verbose > 1 && ira_dump_file != NULL)
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/java/ChangeLog gcc-6-20160721/gcc/java/ChangeLog
+--- gcc-6.1.0/gcc/java/ChangeLog 2016-04-27 08:20:21.000000000 +0000
++++ gcc-6-20160721/gcc/java/ChangeLog 2016-04-28 16:21:41.000000000 +0000
+@@ -1,3 +1,13 @@
++2016-04-28 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
++
++ PR java/70839
++ * decl.c (parse_version): Remove minor handling.
++
++2016-04-28 Matthias Klose <doko@ubuntu.com>
++
++ * decl.c (parse_version): Don't encode the minor version in the abi
++ version.
++
+ 2016-04-27 Release Manager
+
+ * GCC 6.1.0 released.
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/java/decl.c gcc-6-20160721/gcc/java/decl.c
+--- gcc-6.1.0/gcc/java/decl.c 2016-02-08 15:36:16.000000000 +0000
++++ gcc-6-20160721/gcc/java/decl.c 2016-04-28 16:21:41.000000000 +0000
+@@ -507,7 +507,7 @@
+ parse_version (void)
+ {
+ const char *p = version_string;
+- unsigned int major = 0, minor = 0;
++ unsigned int major = 0;
+ unsigned int abi_version;
+
+ /* Skip leading junk. */
+@@ -525,13 +525,6 @@
+ gcc_assert (*p == '.' && ISDIGIT (p[1]));
+ ++p;
+
+- /* Extract minor version. */
+- while (ISDIGIT (*p))
+- {
+- minor = minor * 10 + *p - '0';
+- ++p;
+- }
+-
+ if (flag_indirect_dispatch)
+ {
+ abi_version = GCJ_CURRENT_BC_ABI_VERSION;
+@@ -540,9 +533,9 @@
+ else /* C++ ABI */
+ {
+ /* Implicit in this computation is the idea that we won't break the
+- old-style binary ABI in a sub-minor release (e.g., from 4.0.0 to
+- 4.0.1). */
+- abi_version = 100000 * major + 1000 * minor;
++ old-style binary ABI in a minor release (e.g., from 6.1.0 to
++ 6.2.0). */
++ abi_version = 100000 * major;
+ }
+ if (flag_bootstrap_classes)
+ abi_version |= FLAG_BOOTSTRAP_LOADER;
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/lto-streamer.h gcc-6-20160721/gcc/lto-streamer.h
+--- gcc-6.1.0/gcc/lto-streamer.h 2016-02-15 09:30:31.000000000 +0000
++++ gcc-6-20160721/gcc/lto-streamer.h 2016-05-19 14:56:35.000000000 +0000
+@@ -129,7 +129,7 @@
+ form followed by the data for the string. */
+
+ #define LTO_major_version 5
+-#define LTO_minor_version 0
++#define LTO_minor_version 1
+
+ typedef unsigned char lto_decl_flags_t;
+
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/machmode.h gcc-6-20160721/gcc/machmode.h
+--- gcc-6.1.0/gcc/machmode.h 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/gcc/machmode.h 2016-06-27 18:25:58.000000000 +0000
+@@ -269,6 +269,10 @@
+ extern const unsigned char mode_2xwider[NUM_MACHINE_MODES];
+ #define GET_MODE_2XWIDER_MODE(MODE) ((machine_mode) mode_2xwider[MODE])
+
++/* Get the complex mode from the component mode. */
++extern const unsigned char mode_complex[NUM_MACHINE_MODES];
++#define GET_MODE_COMPLEX_MODE(MODE) ((machine_mode) mode_complex[MODE])
++
+ /* Return the mode for data of a given size SIZE and mode class CLASS.
+ If LIMIT is nonzero, then don't use modes bigger than MAX_FIXED_MODE_SIZE.
+ The value is BLKmode if no other mode is found. */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/match.pd gcc-6-20160721/gcc/match.pd
+--- gcc-6.1.0/gcc/match.pd 2016-04-05 21:33:37.000000000 +0000
++++ gcc-6-20160721/gcc/match.pd 2016-07-07 07:30:04.000000000 +0000
+@@ -844,12 +844,16 @@
+ (ne (bit_and:c (bit_not @0) @1) integer_zerop)
+ (if (INTEGRAL_TYPE_P (TREE_TYPE (@1))
+ && TYPE_PRECISION (TREE_TYPE (@1)) == 1)
+- (lt @0 @1)))
++ (if (TYPE_UNSIGNED (TREE_TYPE (@1)))
++ (lt @0 @1)
++ (gt @0 @1))))
+ (simplify
+ (ne (bit_ior:c (bit_not @0) @1) integer_zerop)
+ (if (INTEGRAL_TYPE_P (TREE_TYPE (@1))
+ && TYPE_PRECISION (TREE_TYPE (@1)) == 1)
+- (le @0 @1)))
++ (if (TYPE_UNSIGNED (TREE_TYPE (@1)))
++ (le @0 @1)
++ (ge @0 @1))))
+
+ /* ~~x -> x */
+ (simplify
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/omp-low.c gcc-6-20160721/gcc/omp-low.c
+--- gcc-6.1.0/gcc/omp-low.c 2016-04-15 11:49:39.000000000 +0000
++++ gcc-6-20160721/gcc/omp-low.c 2016-07-11 20:43:11.000000000 +0000
+@@ -2186,7 +2186,6 @@
+ case OMP_CLAUSE_GANG:
+ case OMP_CLAUSE_WORKER:
+ case OMP_CLAUSE_VECTOR:
+- case OMP_CLAUSE_TILE:
+ case OMP_CLAUSE_INDEPENDENT:
+ case OMP_CLAUSE_AUTO:
+ case OMP_CLAUSE_SEQ:
+@@ -2200,10 +2199,8 @@
+ break;
+
+ case OMP_CLAUSE_DEVICE_RESIDENT:
++ case OMP_CLAUSE_TILE:
+ case OMP_CLAUSE__CACHE_:
+- sorry ("Clause not supported yet");
+- break;
+-
+ default:
+ gcc_unreachable ();
+ }
+@@ -2360,7 +2357,6 @@
+ case OMP_CLAUSE_GANG:
+ case OMP_CLAUSE_WORKER:
+ case OMP_CLAUSE_VECTOR:
+- case OMP_CLAUSE_TILE:
+ case OMP_CLAUSE_INDEPENDENT:
+ case OMP_CLAUSE_AUTO:
+ case OMP_CLAUSE_SEQ:
+@@ -2368,10 +2364,8 @@
+ break;
+
+ case OMP_CLAUSE_DEVICE_RESIDENT:
++ case OMP_CLAUSE_TILE:
+ case OMP_CLAUSE__CACHE_:
+- sorry ("Clause not supported yet");
+- break;
+-
+ default:
+ gcc_unreachable ();
+ }
+@@ -4481,8 +4475,9 @@
+ if (new_var == NULL_TREE)
+ new_var = maybe_lookup_decl_in_outer_ctx (var, ctx);
+ x = builtin_decl_explicit (BUILT_IN_ASSUME_ALIGNED);
+- x = build_call_expr_loc (clause_loc, x, 2, new_var,
+- omp_clause_aligned_alignment (c));
++ tree alarg = omp_clause_aligned_alignment (c);
++ alarg = fold_convert_loc (clause_loc, size_type_node, alarg);
++ x = build_call_expr_loc (clause_loc, x, 2, new_var, alarg);
+ x = fold_convert_loc (clause_loc, TREE_TYPE (new_var), x);
+ x = build2 (MODIFY_EXPR, TREE_TYPE (new_var), new_var, x);
+ gimplify_and_add (x, ilist);
+@@ -4495,8 +4490,9 @@
+ t = maybe_lookup_decl_in_outer_ctx (var, ctx);
+ t = build_fold_addr_expr_loc (clause_loc, t);
+ t2 = builtin_decl_explicit (BUILT_IN_ASSUME_ALIGNED);
+- t = build_call_expr_loc (clause_loc, t2, 2, t,
+- omp_clause_aligned_alignment (c));
++ tree alarg = omp_clause_aligned_alignment (c);
++ alarg = fold_convert_loc (clause_loc, size_type_node, alarg);
++ t = build_call_expr_loc (clause_loc, t2, 2, t, alarg);
+ t = fold_convert_loc (clause_loc, ptype, t);
+ x = create_tmp_var (ptype);
+ t = build2 (MODIFY_EXPR, ptype, x, t);
+@@ -13356,9 +13352,15 @@
+ make_edge (else_bb, new_bb, EDGE_FALLTHRU);
+
+ device = tmp_var;
++ gsi = gsi_last_bb (new_bb);
++ }
++ else
++ {
++ gsi = gsi_last_bb (new_bb);
++ device = force_gimple_operand_gsi (&gsi, device, true, NULL_TREE,
++ true, GSI_SAME_STMT);
+ }
+
+- gsi = gsi_last_bb (new_bb);
+ t = gimple_omp_target_data_arg (entry_stmt);
+ if (t == NULL)
+ {
+@@ -13680,6 +13682,9 @@
+ tree new_parm_decl = copy_node (DECL_ARGUMENTS (kern_fndecl));
+ DECL_CONTEXT (new_parm_decl) = kern_fndecl;
+ DECL_ARGUMENTS (kern_fndecl) = new_parm_decl;
++ gcc_assert (VOID_TYPE_P (TREE_TYPE (DECL_RESULT (kern_fndecl))));
++ DECL_RESULT (kern_fndecl) = copy_node (DECL_RESULT (kern_fndecl));
++ DECL_CONTEXT (DECL_RESULT (kern_fndecl)) = kern_fndecl;
+ struct function *kern_cfun = DECL_STRUCT_FUNCTION (kern_fndecl);
+ kern_cfun->curr_properties = cfun->curr_properties;
+
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/opts-common.c gcc-6-20160721/gcc/opts-common.c
+--- gcc-6.1.0/gcc/opts-common.c 2016-02-12 17:39:27.000000000 +0000
++++ gcc-6-20160721/gcc/opts-common.c 2016-06-30 14:39:10.000000000 +0000
+@@ -373,8 +373,9 @@
+ to specific options. We want to do the reverse: to find all the ways
+ that a user could validly spell an option.
+
+- Given valid OPT_TEXT (with a leading dash), add it and all of its valid
+- variant spellings to CANDIDATES, each without a leading dash.
++ Given valid OPT_TEXT (with a leading dash) for OPTION, add it and all
++ of its valid variant spellings to CANDIDATES, each without a leading
++ dash.
+
+ For example, given "-Wabi-tag", the following are added to CANDIDATES:
+ "Wabi-tag"
+@@ -386,9 +387,11 @@
+
+ void
+ add_misspelling_candidates (auto_vec<char *> *candidates,
++ const struct cl_option *option,
+ const char *opt_text)
+ {
+ gcc_assert (candidates);
++ gcc_assert (option);
+ gcc_assert (opt_text);
+ candidates->safe_push (xstrdup (opt_text + 1));
+ for (unsigned i = 0; i < ARRAY_SIZE (option_map); i++)
+@@ -397,6 +400,9 @@
+ const char *new_prefix = option_map[i].new_prefix;
+ size_t new_prefix_len = strlen (new_prefix);
+
++ if (option->cl_reject_negative && option_map[i].negated)
++ continue;
++
+ if (strncmp (opt_text, new_prefix, new_prefix_len) == 0)
+ {
+ char *alternative = concat (opt0 + 1, opt_text + new_prefix_len,
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/opts.h gcc-6-20160721/gcc/opts.h
+--- gcc-6.1.0/gcc/opts.h 2016-02-16 23:12:19.000000000 +0000
++++ gcc-6-20160721/gcc/opts.h 2016-06-30 14:39:10.000000000 +0000
+@@ -417,6 +417,7 @@
+ } sanitizer_opts[];
+
+ extern void add_misspelling_candidates (auto_vec<char *> *candidates,
++ const struct cl_option *option,
+ const char *base_option);
+
+ #endif
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/sched-deps.c gcc-6-20160721/gcc/sched-deps.c
+--- gcc-6.1.0/gcc/sched-deps.c 2016-03-21 07:52:05.000000000 +0000
++++ gcc-6-20160721/gcc/sched-deps.c 2016-05-20 15:38:24.000000000 +0000
+@@ -2709,9 +2709,12 @@
+ return;
+ }
+
+- /* Force pending stores to memory in case a trap handler needs them. */
++ /* Force pending stores to memory in case a trap handler needs them.
++ Also force pending loads from memory; loads and stores can segfault
++ and the signal handler won't be triggered if the trap insn was moved
++ above load or store insn. */
+ case TRAP_IF:
+- flush_pending_lists (deps, insn, true, false);
++ flush_pending_lists (deps, insn, true, true);
+ break;
+
+ case PREFETCH:
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/stor-layout.c gcc-6-20160721/gcc/stor-layout.c
+--- gcc-6.1.0/gcc/stor-layout.c 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/gcc/stor-layout.c 2016-06-27 18:25:58.000000000 +0000
+@@ -49,11 +49,6 @@
+ The value is measured in bits. */
+ unsigned int maximum_field_alignment = TARGET_DEFAULT_PACK_STRUCT * BITS_PER_UNIT;
+
+-/* Nonzero if all REFERENCE_TYPEs are internal and hence should be allocated
+- in the address spaces' address_mode, not pointer_mode. Set only by
+- internal_reference_types called only by a front end. */
+-static int reference_types_internal = 0;
+-
+ static tree self_referential_size (tree);
+ static void finalize_record_size (record_layout_info);
+ static void finalize_type_size (tree);
+@@ -62,15 +57,6 @@
+ HOST_WIDE_INT, tree);
+ extern void debug_rli (record_layout_info);
+
+-/* Show that REFERENCE_TYPES are internal and should use address_mode.
+- Called only by front end. */
+-
+-void
+-internal_reference_types (void)
+-{
+- reference_types_internal = 1;
+-}
+-
+ /* Given a size SIZE that may not be a constant, return a SAVE_EXPR
+ to serve as the actual size-expression for a type or decl. */
+
+@@ -2161,10 +2147,8 @@
+ case COMPLEX_TYPE:
+ TYPE_UNSIGNED (type) = TYPE_UNSIGNED (TREE_TYPE (type));
+ SET_TYPE_MODE (type,
+- mode_for_size (2 * TYPE_PRECISION (TREE_TYPE (type)),
+- (TREE_CODE (TREE_TYPE (type)) == REAL_TYPE
+- ? MODE_COMPLEX_FLOAT : MODE_COMPLEX_INT),
+- 0));
++ GET_MODE_COMPLEX_MODE (TYPE_MODE (TREE_TYPE (type))));
++
+ TYPE_SIZE (type) = bitsize_int (GET_MODE_BITSIZE (TYPE_MODE (type)));
+ TYPE_SIZE_UNIT (type) = size_int (GET_MODE_SIZE (TYPE_MODE (type)));
+ break;
+@@ -2245,12 +2229,6 @@
+ case REFERENCE_TYPE:
+ {
+ machine_mode mode = TYPE_MODE (type);
+- if (TREE_CODE (type) == REFERENCE_TYPE && reference_types_internal)
+- {
+- addr_space_t as = TYPE_ADDR_SPACE (TREE_TYPE (type));
+- mode = targetm.addr_space.address_mode (as);
+- }
+-
+ TYPE_SIZE (type) = bitsize_int (GET_MODE_BITSIZE (mode));
+ TYPE_SIZE_UNIT (type) = size_int (GET_MODE_SIZE (mode));
+ TYPE_UNSIGNED (type) = 1;
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/stor-layout.h gcc-6-20160721/gcc/stor-layout.h
+--- gcc-6.1.0/gcc/stor-layout.h 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/gcc/stor-layout.h 2016-04-28 10:49:13.000000000 +0000
+@@ -22,7 +22,6 @@
+
+ extern void set_min_and_max_values_for_integral_type (tree, int, signop);
+ extern void fixup_signed_type (tree);
+-extern void internal_reference_types (void);
+ extern unsigned int update_alignment_for_field (record_layout_info, tree,
+ unsigned int);
+ extern record_layout_info start_record_layout (tree);
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/ChangeLog gcc-6-20160721/gcc/testsuite/ChangeLog
+--- gcc-6.1.0/gcc/testsuite/ChangeLog 2016-04-27 08:20:21.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/ChangeLog 2016-07-21 18:24:48.000000000 +0000
+@@ -1,3 +1,1274 @@
++2016-07-21 Jakub Jelinek <jakub@redhat.com>
++
++ PR c++/71728
++ * g++.dg/other/pr71728.C: New test.
++
++ PR c++/71941
++ * g++.dg/gomp/pr71941.C: New test.
++
++2016-07-21 Patrick Palka <ppalka@gcc.gnu.org>
++
++ PR c++/70822
++ PR c++/70106
++ * g++.dg/cpp1y/auto-fn32.C: New test.
++ * g++.dg/cpp1y/paren4.C: New test.
++
++2016-07-20 Jakub Jelinek <jakub@redhat.com>
++
++ PR c++/71909
++ * g++.dg/parse/pr71909.C: New test.
++ * g++.dg/tm/pr71909.C: New test.
++
++2016-07-20 Martin Jambor <mjambor@suse.cz>
++
++ PR fortran/71688
++ gfortran.dg/pr71688.f90: New test.
++
++2016-07-19 Jakub Jelinek <jakub@redhat.com>
++
++ PR rtl-optimization/71916
++ * gcc.c-torture/compile/pr71916.c: New test.
++
++ PR middle-end/71874
++ * g++.dg/torture/pr71874.C: New test.
++
++ Backported from mainline
++ 2016-07-18 Jakub Jelinek <jakub@redhat.com>
++
++ PR c++/71835
++ * g++.dg/conversion/ambig3.C: New test.
++
++ PR c++/71828
++ * g++.dg/cpp0x/constexpr-71828.C: New test.
++
++ PR c++/71822
++ * g++.dg/template/defarg21.C: New test.
++
++ PR c++/71871
++ * g++.dg/ext/vector31.C: New test.
++
++ 2016-07-07 Jakub Jelinek <jakub@redhat.com>
++ Kai Tietz <ktietz70@googlemail.com>
++
++ PR c++/70869
++ PR c++/71054
++ * g++.dg/cpp0x/pr70869.C: New test.
++ * g++.dg/cpp0x/pr71054.C: New test.
++
++2016-07-18 Michael Meissner <meissner@linux.vnet.ibm.com>
++
++ Back port from mainline
++ 2016-07-18 Michael Meissner <meissner@linux.vnet.ibm.com>
++
++ PR target/71493
++ * gcc.target/powerpc/pr71493-1.c: New test.
++ * gcc.target/powerpc/pr71493-2.c: Likewise.
++
++2016-07-18 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
++
++ Backport from mainline
++ 2016-07-18 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
++
++ * gcc.target/s390/nolrl-1.c: New test.
++
++2016-07-15 Jerry DeLisle <jvdelisle@gcc.gnu.org>
++
++ Backport from trunk:
++ PR fortran/71764
++ * gfortran.dg/pr71764.f90: New test.
++
++2016-07-15 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
++
++ Backport from mainline
++ 2016-07-15 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
++
++ * g++.dg/pr70098.C: Remove XFAIL for powerpc64_no_dm.
++ * gcc.target/powerpc/pr71763.c: Likewise.
++
++2016-07-15 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
++
++ Backport from mainline
++ 2016-07-15 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
++
++ * gcc.target/powerpc/divkc3-1.c: Require p8vector support.
++ * gcc.target/powerpc/mulkc3-1.c: Likewise.
++
++2016-07-14 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
++
++ Backport from mainline
++ 2016-07-12 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
++
++ * gcc.target/powerpc/divkc3-1.c: New.
++ * gcc.target/powerpc/mulkc3-1.c: New.
++
++2016-07-14 Alan Modra <amodra@gmail.com>
++
++ PR target/71733
++ * gcc.target/powerpc/p9-novsx.c: New.
++
++2016-07-13 Andre Vehreschild <vehre@gcc.gnu.org>
++
++ Backport from trunk:
++ PR fortran/71623
++ * gfortran.dg/deferred_character_17.f90: New test.
++
++2016-07-13 Ilya Enkovich <ilya.enkovich@intel.com>
++
++ Backport from mainline r238086.
++ 2016-07-07 Ilya Enkovich <ilya.enkovich@intel.com>
++
++ PR ipa/71624
++ * g++.dg/pr71624.C: New test.
++
++2016-07-12 Michael Meissner <meissner@linux.vnet.ibm.com>
++ Bill Schmidt <wschmidt@linux.vnet.ibm.com>
++
++ Backport from mainline
++ 2016-07-05 Michael Meissner <meissner@linux.vnet.ibm.com>
++ Bill Schmidt <wschmidt@linux.vnet.ibm.com>
++
++ * gcc.target/powerpc/signbit-1.c: New test.
++ * gcc.target/powerpc/signbit-2.c: New test.
++ * gcc.target/powerpc/signbit-3.c: New test.
++
++2016-07-12 Michael Meissner <meissner@linux.vnet.ibm.com>
++
++ Backport from mainline
++ 2016-07-12 Michael Meissner <meissner@linux.vnet.ibm.com>
++
++ PR target/71805
++ * gcc.target/powerpc/pr71805.c: New test.
++
++2016-07-12 Segher Boessenkool <segher@kernel.crashing.org>
++
++ Backport from mainline
++ 2016-07-06 Segher Boessenkool <segher@kernel.crashing.org>
++
++ PR target/70098
++ PR target/71763
++ * gcc.target/powerpc/pr71763.c: New file.
++
++2016-07-11 Jakub Jelinek <jakub@redhat.com>
++
++ PR middle-end/71758
++ * c-c++-common/gomp/pr71758.c: New test.
++ * gfortran.dg/gomp/pr71758.f90: New test.
++
++ PR tree-optimization/71823
++ * gcc.dg/vect/pr71823.c: New test.
++
++2016-07-11 Yuri Rumyantsev <ysrumyan@gmail.com>
++
++ Backport from mainline r238055.
++ 2016-07-06 Yuri Rumyantsev <ysrumyan@gmail.com>
++
++ PR tree-optimization/71518
++ * gcc.dg/pr71518.c: New test.
++
++2016-07-09 Thomas Koenig <tkoenig@gcc.gnu.org>
++
++ Backport from trunk:
++ PR fortran/71783
++ * gfortran.dg/dependency_46.f90: New test.
++
++2016-07-08 Cesar Philippidis <cesar@codesourcery.com>
++
++ Backport from trunk:
++ 2016-07-08 Cesar Philippidis <cesar@codesourcery.com>
++
++ * gfortran.dg/goacc/pr71704.f90: New test.
++
++2016-07-08 Martin Liska <mliska@suse.cz>
++
++ Backported from mainline
++ 2016-07-08 Martin Liska <mliska@suse.cz>
++
++ * gcc.dg/torture/pr71606.c: New test.
++
++2016-07-08 Jiong Wang <jiong.wang@arm.com>
++
++ Back port from the trunk
++ 2016-07-08 Jiong Wang <jiong.wang@arm.com>
++
++ * gcc.target/aarch64/simd/vminmaxnm_1.c: New.
++
++2016-07-08 Michael Meissner <meissner@linux.vnet.ibm.com>
++
++ Back port from trunk
++ 2016-07-08 Michael Meissner <meissner@linux.vnet.ibm.com>
++
++ PR target/71806
++ * gcc.target/powerpc/p9-lxvx-stxvx-3.c: Add -mfloat128 option.
++
++2016-07-07 Michael Meissner <meissner@linux.vnet.ibm.com>
++
++ Back port from the trunk
++ 2016-07-01 Michael Meissner <meissner@linux.vnet.ibm.com>
++
++ PR target/71720
++ * gcc.target/powerpc/pr71720.c: New test.
++
++2016-07-07 Kelvin Nilsen <kelvin@gcc.gnu.org>
++
++ Backport from mainline r237885
++ 2016-06-30 Kelvin Nilsen <kelvin@gcc.gnu.org>
++
++ * gcc.target/powerpc/dfp/dfp.exp: New dejagnu test script.
++ * gcc.target/powerpc/dfp/dtstsfi-0.c: New test.
++ * gcc.target/powerpc/dfp/dtstsfi-1.c: New test.
++ * gcc.target/powerpc/dfp/dtstsfi-10.c: New test.
++ * gcc.target/powerpc/dfp/dtstsfi-11.c: New test.
++ * gcc.target/powerpc/dfp/dtstsfi-12.c: New test.
++ * gcc.target/powerpc/dfp/dtstsfi-13.c: New test.
++ * gcc.target/powerpc/dfp/dtstsfi-14.c: New test.
++ * gcc.target/powerpc/dfp/dtstsfi-15.c: New test.
++ * gcc.target/powerpc/dfp/dtstsfi-16.c: New test.
++ * gcc.target/powerpc/dfp/dtstsfi-17.c: New test.
++ * gcc.target/powerpc/dfp/dtstsfi-18.c: New test.
++ * gcc.target/powerpc/dfp/dtstsfi-19.c: New test.
++ * gcc.target/powerpc/dfp/dtstsfi-2.c: New test.
++ * gcc.target/powerpc/dfp/dtstsfi-20.c: New test.
++ * gcc.target/powerpc/dfp/dtstsfi-21.c: New test.
++ * gcc.target/powerpc/dfp/dtstsfi-22.c: New test.
++ * gcc.target/powerpc/dfp/dtstsfi-23.c: New test.
++ * gcc.target/powerpc/dfp/dtstsfi-24.c: New test.
++ * gcc.target/powerpc/dfp/dtstsfi-25.c: New test.
++ * gcc.target/powerpc/dfp/dtstsfi-26.c: New test.
++ * gcc.target/powerpc/dfp/dtstsfi-27.c: New test.
++ * gcc.target/powerpc/dfp/dtstsfi-28.c: New test.
++ * gcc.target/powerpc/dfp/dtstsfi-29.c: New test.
++ * gcc.target/powerpc/dfp/dtstsfi-3.c: New test.
++ * gcc.target/powerpc/dfp/dtstsfi-30.c: New test.
++ * gcc.target/powerpc/dfp/dtstsfi-31.c: New test.
++ * gcc.target/powerpc/dfp/dtstsfi-32.c: New test.
++ * gcc.target/powerpc/dfp/dtstsfi-33.c: New test.
++ * gcc.target/powerpc/dfp/dtstsfi-34.c: New test.
++ * gcc.target/powerpc/dfp/dtstsfi-35.c: New test.
++ * gcc.target/powerpc/dfp/dtstsfi-36.c: New test.
++ * gcc.target/powerpc/dfp/dtstsfi-37.c: New test.
++ * gcc.target/powerpc/dfp/dtstsfi-38.c: New test.
++ * gcc.target/powerpc/dfp/dtstsfi-39.c: New test.
++ * gcc.target/powerpc/dfp/dtstsfi-4.c: New test.
++ * gcc.target/powerpc/dfp/dtstsfi-40.c: New test.
++ * gcc.target/powerpc/dfp/dtstsfi-41.c: New test.
++ * gcc.target/powerpc/dfp/dtstsfi-42.c: New test.
++ * gcc.target/powerpc/dfp/dtstsfi-43.c: New test.
++ * gcc.target/powerpc/dfp/dtstsfi-44.c: New test.
++ * gcc.target/powerpc/dfp/dtstsfi-45.c: New test.
++ * gcc.target/powerpc/dfp/dtstsfi-46.c: New test.
++ * gcc.target/powerpc/dfp/dtstsfi-47.c: New test.
++ * gcc.target/powerpc/dfp/dtstsfi-48.c: New test.
++ * gcc.target/powerpc/dfp/dtstsfi-49.c: New test.
++ * gcc.target/powerpc/dfp/dtstsfi-5.c: New test.
++ * gcc.target/powerpc/dfp/dtstsfi-50.c: New test.
++ * gcc.target/powerpc/dfp/dtstsfi-51.c: New test.
++ * gcc.target/powerpc/dfp/dtstsfi-52.c: New test.
++ * gcc.target/powerpc/dfp/dtstsfi-53.c: New test.
++ * gcc.target/powerpc/dfp/dtstsfi-54.c: New test.
++ * gcc.target/powerpc/dfp/dtstsfi-55.c: New test.
++ * gcc.target/powerpc/dfp/dtstsfi-56.c: New test.
++ * gcc.target/powerpc/dfp/dtstsfi-57.c: New test.
++ * gcc.target/powerpc/dfp/dtstsfi-58.c: New test.
++ * gcc.target/powerpc/dfp/dtstsfi-59.c: New test.
++ * gcc.target/powerpc/dfp/dtstsfi-6.c: New test.
++ * gcc.target/powerpc/dfp/dtstsfi-60.c: New test.
++ * gcc.target/powerpc/dfp/dtstsfi-61.c: New test.
++ * gcc.target/powerpc/dfp/dtstsfi-62.c: New test.
++ * gcc.target/powerpc/dfp/dtstsfi-63.c: New test.
++ * gcc.target/powerpc/dfp/dtstsfi-64.c: New test.
++ * gcc.target/powerpc/dfp/dtstsfi-65.c: New test.
++ * gcc.target/powerpc/dfp/dtstsfi-66.c: New test.
++ * gcc.target/powerpc/dfp/dtstsfi-67.c: New test.
++ * gcc.target/powerpc/dfp/dtstsfi-68.c: New test.
++ * gcc.target/powerpc/dfp/dtstsfi-69.c: New test.
++ * gcc.target/powerpc/dfp/dtstsfi-7.c: New test.
++ * gcc.target/powerpc/dfp/dtstsfi-70.c: New test.
++ * gcc.target/powerpc/dfp/dtstsfi-71.c: New test.
++ * gcc.target/powerpc/dfp/dtstsfi-72.c: New test.
++ * gcc.target/powerpc/dfp/dtstsfi-73.c: New test.
++ * gcc.target/powerpc/dfp/dtstsfi-74.c: New test.
++ * gcc.target/powerpc/dfp/dtstsfi-75.c: New test.
++ * gcc.target/powerpc/dfp/dtstsfi-76.c: New test.
++ * gcc.target/powerpc/dfp/dtstsfi-77.c: New test.
++ * gcc.target/powerpc/dfp/dtstsfi-78.c: New test.
++ * gcc.target/powerpc/dfp/dtstsfi-79.c: New test.
++ * gcc.target/powerpc/dfp/dtstsfi-8.c: New test.
++ * gcc.target/powerpc/dfp/dtstsfi-9.c: New test.
++
++2016-07-07 Richard Biener <rguenther@suse.de>
++
++ Backport from mainline
++ 2016-06-13 Richard Biener <rguenther@suse.de>
++
++ PR middle-end/64516
++ * gcc.dg/align-3.c: New testcase.
++
++2016-07-07 Richard Biener <rguenther@suse.de>
++
++ Backport from mainline
++ 2016-05-25 Richard Biener <rguenther@suse.de>
++
++ PR tree-optimization/71264
++ * gcc.dg/vect/pr71264.c: New testcase.
++
++ 2016-06-07 Richard Biener <rguenther@suse.de>
++
++ PR middle-end/71423
++ * gcc.dg/torture/pr71423.c: New testcase.
++
++ 2016-06-14 Richard Biener <rguenther@suse.de>
++
++ PR tree-optimization/71521
++ * gcc.dg/tree-ssa/vrp101.c: New testcase.
++
++ 2016-06-08 Richard Biener <rguenther@suse.de>
++
++ PR tree-optimization/71452
++ * gcc.dg/torture/pr71452.c: New testcase.
++
++ 2016-06-14 Richard Biener <rguenther@suse.de>
++
++ PR tree-optimization/71522
++ * gcc.dg/torture/pr71522.c: New testcase.
++
++2016-07-06 Senthil Kumar Selvaraj <senthil_kumar.selvaraj@atmel.com>
++
++ Backport from mainline
++ 2016-07-06 Senthil Kumar Selvaraj <senthil_kumar.selvaraj@atmel.com>
++
++ PR target/50739
++ * gcc.target/avr/pr50739.c: New test.
++
++2016-07-05 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
++
++ Backport from mainline
++ 2016-07-01 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
++
++ * gcc.dg/const-float128-ped.c: Require __float128 effective
++ target and options.
++ * gcc.dg/const-float128.c: Likewise.
++ * gcc.dg/torture/float128-cmp-invalid.c: Require
++ __float128 and base_quadfloat_support effective targets, and
++ __float128 options.
++ * gcc.dg/torture/float128-div-underflow.c: Likewise.
++ * gcc.dg/torture/float128-extend-nan.c: Likewise.
++ * gcc.dg/torture/fp-int-convert-float128-timode-2.c: Likewise.
++ * gcc.dg/torture/fp-int-convert-float128-timode-3.c: Likewise.
++ * gcc.dg/torture/fp-int-convert-float128-timode.c: Likewise.
++ * lib/target-supports.exp (check_effective_target___float128):
++ New.
++ (add_options_for___float128): New.
++ (check_effective_target_base_quadword_support): New.
++
++2016-07-04 Jakub Jelinek <jakub@redhat.com>
++
++ PR c++/71739
++ * g++.dg/cpp0x/pr71739.C: New test.
++
++2016-07-04 Segher Boessenkool <segher@kernel.crashing.org>
++
++ Backport from mainline
++ 2016-06-27 Segher Boessenkool <segher@kernel.crashing.org>
++
++ PR target/71670
++ * gcc.target/powerpc/pr71670.c: New testcase.
++
++2016-07-02 Jakub Jelinek <jakub@redhat.com>
++
++ Backported from mainline
++ 2016-07-01 Jakub Jelinek <jakub@redhat.com>
++
++ PR fortran/71687
++ * gfortran.dg/gomp/pr71687.f90: New test.
++
++ 2016-06-30 Jakub Jelinek <jakub@redhat.com>
++
++ PR fortran/71704
++ * gfortran.dg/gomp/pr71704.f90: New test.
++
++ PR fortran/71705
++ * gfortran.dg/gomp/pr71705.f90: New test.
++
++ 2016-06-29 Jakub Jelinek <jakub@redhat.com>
++
++ PR c/71685
++ * gcc.dg/pr71685.c: New test.
++
++ 2016-06-28 Jakub Jelinek <jakub@redhat.com>
++
++ PR middle-end/71626
++ * gcc.c-torture/execute/pr71626-1.c: New test.
++ * gcc.c-torture/execute/pr71626-2.c: New test.
++
++ 2016-06-20 Jakub Jelinek <jakub@redhat.com>
++
++ PR target/71559
++ * gcc.target/i386/sse2-pr71559.c: New test.
++ * gcc.target/i386/avx-pr71559.c: New test.
++ * gcc.target/i386/avx512f-pr71559.c: New test.
++
++2016-07-01 Kelvin Nilsen <kelvin@gcc.gnu.org>
++
++ Backport from trunk r237659
++ 2016-06-21 Kelvin Nilsen <kelvin@gcc.gnu.org>
++
++ * gcc.target/powerpc/darn-0.c: Add dejagnu directives to disable
++ test if effective-target is not powerpc_p9vector_ok, or if a -mcpu
++ override other than -mcpu=power9 command-line option is specified,
++ or if the target operating system is aix.
++ * gcc.target/powerpc/darn-1.c: Likewise.
++ * gcc.target/powerpc/darn-2.c: Likewise.
++ * gcc.target/powerpc/vslv-0.c: Add dejagnu directives to disable
++ test if effective-target is not powerpc_p9vector_ok or if the
++ target operating system is aix.
++ * gcc.target/powerpc/vslv-1.c: Likewise.
++ * gcc.target/powerpc/vsrv-0.c: Likewise.
++ * gcc.target/powerpc/vsrv-1.c: Likewise.
++
++2016-07-01 Peter Bergner <bergner@vnet.ibm.com>
++
++ Backport from trunk
++ 2016-06-27 Peter Bergner <bergner@vnet.ibm.com>
++
++ PR target/71656
++ * gcc.target/powerpc/pr71656-1.c: New test.
++ * gcc.target/powerpc/pr71656-2.c: New test.
++
++2016-07-01 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
++
++ Backport from mainline
++ 2016-06-24 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
++
++ * gcc.target/powerpc/abs128-1.c: New.
++ * gcc.target/powerpc/copysign128-1.c: New.
++ * gcc.target/powerpc/inf128-1.c: New.
++ * gcc.target/powerpc/nan128-1.c: New.
++
++ Backport from mainline
++ 2016-06-28 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
++
++ * gcc.target/powerpc/abs128-1.c: Require VSX.
++ * gcc.target/powerpc/copysign128-1.c: Likewise.
++ * gcc.target/powerpc/inf128-1.c: Likewise.
++ * gcc.target/powerpc/nan128-1.c: Likewise.
++
++2016-07-01 Peter Bergner <bergner@vnet.ibm.com>
++
++ Backport from trunk
++ 2016-07-01 Peter Bergner <bergner@vnet.ibm.com>
++
++ PR target/71698
++ * gcc.target/powerpc/pr71698.c: New test.
++
++2016-07-01 Kelvin Nilsen <kelvin@gcc.gnu.org>
++
++ Backport from trunk r236992
++ 2016-06-01 Kelvin Nilsen <kelvin@gcc.gnu.org>
++
++ * gcc.target/powerpc/vslv-0.c: New test.
++ * gcc.target/powerpc/vslv-1.c: New test.
++ * gcc.target/powerpc/vsrv-0.c: New test.
++ * gcc.target/powerpc/vsrv-1.c: New test.
++
++2016-06-30 Kelvin Nilsen <kelvin@gcc.gnu.org>
++
++ Backport from trunk r237390
++ 2016-06-13 Kelvin Nilsen <kelvin@gcc.gnu.org>
++ Backport from trunk r237646
++ 2016-06-20 Kelvin Nilsen <kelvin@gcc.gnu.org>
++
++ * gcc.target/powerpc/vadsdu-0.c: New test.
++ * gcc.target/powerpc/vadsdu-1.c: New test.
++ * gcc.target/powerpc/vadsdu-2.c: New test.
++ * gcc.target/powerpc/vadsdu-3.c: New test.
++ * gcc.target/powerpc/vadsdu-4.c: New test.
++ * gcc.target/powerpc/vadsdu-5.c: New test.
++ * gcc.target/powerpc/vadsdub-1.c: New test.
++ * gcc.target/powerpc/vadsdub-2.c: New test.
++ * gcc.target/powerpc/vadsduh-1.c: New test.
++ * gcc.target/powerpc/vadsduh-2.c: New test.
++ * gcc.target/powerpc/vadsduw-1.c: New test.
++ * gcc.target/powerpc/vadsduw-2.c: New test.
++
++2016-06-30 David Malcolm <dmalcolm@redhat.com>
++
++ Backport from trunk r237880.
++ 2016-06-30 David Malcolm <dmalcolm@redhat.com>
++
++ PR driver/71651
++ * gcc.dg/spellcheck-options-12.c: New test case.
++
++2016-06-30 Jakub Jelinek <jakub@redhat.com>
++
++ PR middle-end/71693
++ * gcc.c-torture/compile/pr71693.c: New test.
++
++2016-06-29 Cesar Philippidis <cesar@codesourcery.com>
++
++ Back port from trunk
++ 2016-06-29 Cesar Philippidis <cesar@codesourcery.com>
++
++ * gfortran.dg/goacc/asyncwait-2.f95: Updated expected diagnostics.
++ * gfortran.dg/goacc/asyncwait-3.f95: Likewise.
++ * gfortran.dg/goacc/asyncwait-4.f95: Add test coverage.
++
++2016-06-27 Paul Thomas <pault@gcc.gnu.org>
++
++ PR fortran/70673
++ * gfortran.dg/pr70673.f90: New test.
++
++2016-06-27 Michael Meissner <meissner@linux.vnet.ibm.com>
++
++ Back port from trunk
++ 2016-05-02 Michael Meissner <meissner@linux.vnet.ibm.com>
++
++ * gcc.target/powerpc/float128-complex-1.c: New tests for complex
++ __float128.
++ * gcc.target/powerpc/float128-complex-2.c: Likewise.
++
++2016-06-24 Jakub Jelinek <jakub@redhat.com>
++
++ PR tree-optimization/71647
++ * gcc.target/i386/pr71647.c: New test.
++
++2016-06-22 Eric Botcazou <ebotcazou@adacore.com>
++
++ * gcc.dg/guality/param-5.c: New test.
++
++2016-06-21 Jakub Jelinek <jakub@redhat.com>
++
++ PR tree-optimization/71588
++ * gcc.dg/pr71558.c: New test.
++
++ Backported from mainline
++ 2016-06-20 Jakub Jelinek <jakub@redhat.com>
++
++ PR middle-end/71581
++ * gcc.dg/pr71581.c: New test.
++
++ 2016-06-14 Jakub Jelinek <jakub@redhat.com>
++
++ PR c++/71528
++ * g++.dg/opt/pr71528.C: New test.
++
++2016-06-20 Ilya Enkovich <ilya.enkovich@intel.com>
++
++ Backport from mainline r237484.
++ 2016-06-15 Ilya Enkovich <ilya.enkovich@intel.com>
++
++ PR middle-end/71529
++ * gcc.target/i386/pr71529.C: New test.
++
++2016-06-20 Georg-Johann Lay <avr@gjlay.de>
++ Pitchumani Sivanupandi <pitchumani.s@atmel.com>
++
++ Backport from 2016-06-20 trunk r237589, r236558.
++
++ PR target/71103
++ * gcc.target/avr/pr71103.c: New test.
++ * gcc.target/avr/torture/pr71103-2.c: New test.
++
++2016-06-16 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
++
++ Backport from mainline
++ 2016-06-14 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
++ * gcc.target/powerpc/vsx-elemrev-2.c: Change effective target
++ requirements, and disable for AIX for now.
++ * gcc.target/powerpc/vsx-elemrev-4.c: Likewise.
++
++2016-06-16 Jakub Jelinek <jakub@redhat.com>
++
++ PR target/71554
++ * gcc.c-torture/execute/pr71554.c: New test.
++
++2016-06-14 Paolo Carlini <paolo.carlini@oracle.com>
++
++ PR c++/70572
++ * g++.dg/cpp1y/auto-fn31.C: New.
++
++2016-06-14 Jakub Jelinek <jakub@redhat.com>
++
++ PR c++/71516
++ * g++.dg/init/pr71516.C: New test.
++
++ Backported from mainline
++ 2016-06-10 Jakub Jelinek <jakub@redhat.com>
++
++ PR middle-end/71494
++ * gcc.c-torture/execute/pr71494.c: New test.
++
++ PR c/68657
++ * gcc.target/i386/pr68657.c: New test.
++
++ 2016-06-08 Jakub Jelinek <jakub@redhat.com>
++
++ PR c++/71448
++ * g++.dg/torture/pr71448.C: New test.
++
++ 2016-06-04 Jakub Jelinek <jakub@redhat.com>
++
++ PR tree-optimization/71405
++ * g++.dg/torture/pr71405.C: New test.
++
++2016-06-13 Jakub Jelinek <jakub@redhat.com>
++
++ PR sanitizer/71498
++ * c-c++-common/ubsan/bounds-13.c: New test.
++
++2016-06-13 Eric Botcazou <ebotcazou@adacore.com>
++
++ * gnat.dg/renaming10.ad[sb]: New test.
++
++2016-06-12 Dominique d'Humieres <dominiq@lps.ens.fr>
++
++ PR target/60751
++ * gfortran.dg/comma_IO_extension_1.f90: New test.
++ * gfortran.dg/comma_IO_extension_2.f90: Likewise.
++ * gfortran.dg/array_constructor_49.f90: Remove extra comma in WRITE
++ statement.
++ * gfortran.dg/graphite/pr38083.f90: Likewise.
++ * gfortran.dg/guality/pr41558.f90: Likewise.
++ * gfortran.dg/integer_exponentiation_6.F90: Likewise and add
++ missing format.
++
++2016-06-11 Eric Botcazou <ebotcazou@adacore.com>
++
++ * gnat.dg/case_character.adb: New test.
++
++2016-06-10 Thomas Schwinge <thomas@codesourcery.com>
++
++ PR middle-end/71373
++ Backport from trunk r237291:
++ 2016-06-10 Thomas Schwinge <thomas@codesourcery.com>
++ Cesar Philippidis <cesar@codesourcery.com>
++
++ * gcc.dg/goacc/nested-function-1.c: New file.
++ * gcc.dg/goacc/nested-function-2.c: Likewise.
++ * gcc.dg/goacc/pr71373.c: Likewise.
++ * gfortran.dg/goacc/cray-2.f95: Likewise.
++ * gfortran.dg/goacc/loop-1-2.f95: Likewise.
++ * gfortran.dg/goacc/loop-3-2.f95: Likewise.
++ * gfortran.dg/goacc/cray.f95: Update.
++ * gfortran.dg/goacc/loop-1.f95: Likewise.
++ * gfortran.dg/goacc/loop-3.f95: Likewise.
++ * gfortran.dg/goacc/subroutines.f90: Update, and rename to...
++ * gfortran.dg/goacc/nested-function-1.f90: ... this new file.
++
++ Backport from trunk r237291:
++ * c-c++-common/goacc/combined-directives.c: XFAIL tree scanning
++ for OpenACC tile clauses.
++ * gfortran.dg/goacc/combined-directives.f90: Likewise.
++
++ PR c/71381
++ Backport from trunk r237290:
++ * c-c++-common/goacc/cache-1.c: Update. Move invalid usage tests
++ to...
++ * c-c++-common/goacc/cache-2.c: ... this new file.
++ * gfortran.dg/goacc/cache-1.f95: Move invalid usage tests to...
++ * gfortran.dg/goacc/cache-2.f95: ... this new file.
++ * gfortran.dg/goacc/coarray.f95: Update OpenACC cache directive
++ usage.
++ * gfortran.dg/goacc/cray.f95: Likewise.
++ * gfortran.dg/goacc/loop-1.f95: Likewise.
++
++2016-06-09 Michael Meissner <meissner@linux.vnet.ibm.com>
++
++ Back port from trunk
++ 2016-05-31 Michael Meissner <meissner@linux.vnet.ibm.com>
++
++ * gcc.target/powerpc/p9-splat-4.c: New test.
++
++ Back port from trunk
++ 2016-05-31 Michael Meissner <meissner@linux.vnet.ibm.com>
++
++ PR target/71186
++ * gcc.target/powerpc/pr71186.c: New test.
++
++ Back port from trunk
++ 2016-05-18 Michael Meissner <meissner@linux.vnet.ibm.com>
++
++ * gcc.target/powerpc/p9-splat-1.c: New tests for ISA 3.0 word
++ splat operations and the XXSPLTIB instruction.
++ * gcc.target/powerpc/p9-splat-2.c: Likewise.
++ * gcc.target/powerpc/p9-splat-3.c: Likewise.
++ * gcc.target/powerpc/pr47755.c: Allow vspltisw in addition to
++ xxlxor to clear a register.
++
++2016-06-08 Jakub Jelinek <jakub@redhat.com>
++
++ PR c++/71442
++ * g++.dg/cpp0x/Wunused-variable-1.C: New test.
++
++2016-06-08 Eric Botcazou <ebotcazou@adacore.com>
++
++ Backport from mainline
++ 2016-06-06 Jose E. Marchesi <jose.marchesi@oracle.com>
++
++ * gcc.target/sparc/vis4misc.c: New file.
++ * gcc.target/sparc/fpcmp.c: Likewise.
++ * gcc.target/sparc/fpcmpu.c: Likewise.
++
++2016-06-08 Ilya Verbin <ilya.verbin@intel.com>
++
++ Backport from mainline
++ 2016-05-25 Ilya Verbin <ilya.verbin@intel.com>
++
++ * gcc.target/i386/avx512f-ceil-vec-1.c: New test.
++ * gcc.target/i386/avx512f-ceil-vec-2.c: New test.
++ * gcc.target/i386/avx512f-ceilf-sfix-vec-1.c: New test.
++ * gcc.target/i386/avx512f-ceilf-sfix-vec-2.c: New test.
++ * gcc.target/i386/avx512f-ceilf-vec-1.c: New test.
++ * gcc.target/i386/avx512f-ceilf-vec-2.c: New test.
++ * gcc.target/i386/avx512f-floor-vec-1.c: New test.
++ * gcc.target/i386/avx512f-floor-vec-2.c: New test.
++ * gcc.target/i386/avx512f-floorf-sfix-vec-1.c: New test.
++ * gcc.target/i386/avx512f-floorf-sfix-vec-2.c: New test.
++ * gcc.target/i386/avx512f-floorf-vec-1.c: New test.
++ * gcc.target/i386/avx512f-floorf-vec-2.c: New test.
++ * gcc.target/i386/avx512f-rint-sfix-vec-1.c: New test.
++ * gcc.target/i386/avx512f-rint-sfix-vec-2.c: New test.
++ * gcc.target/i386/avx512f-rintf-sfix-vec-1.c: New test.
++ * gcc.target/i386/avx512f-rintf-sfix-vec-2.c: New test.
++ * gcc.target/i386/avx512f-round-sfix-vec-1.c: New test.
++ * gcc.target/i386/avx512f-round-sfix-vec-2.c: New test.
++ * gcc.target/i386/avx512f-roundf-sfix-vec-1.c: New test.
++ * gcc.target/i386/avx512f-roundf-sfix-vec-2.c: New test.
++ * gcc.target/i386/avx512f-trunc-vec-1.c: New test.
++ * gcc.target/i386/avx512f-trunc-vec-2.c: New test.
++ * gcc.target/i386/avx512f-truncf-vec-1.c: New test.
++ * gcc.target/i386/avx512f-truncf-vec-2.c: New test.
++
++2016-06-07 Uros Bizjak <ubizjak@gmail.com>
++
++ PR target/71389
++ * g++.dg/pr71389.C: New test.
++
++2016-06-06 Jakub Jelinek <jakub@redhat.com>
++ Patrick Palka <ppalka@gcc.gnu.org>
++
++ PR c++/70847
++ PR c++/71330
++ PR c++/71393
++ * g++.dg/opt/pr70847.C: New test.
++ * g++.dg/ubsan/pr70847.C: New test.
++ * g++.dg/ubsan/pr71393.C: New test.
++
++2016-06-06 Jakub Jelinek <jakub@redhat.com>
++
++ PR tree-optimization/71259
++ * gcc.dg/vect/pr71259.c: New test.
++
++2016-06-05 Andre Vehreschild <vehre@gcc.gnu.org>
++
++ PR fortran/69659
++ * gfortran.dg/class_array_22.f03: New test.
++
++2016-06-03 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
++
++ PR target/70957
++ * gcc.target/powerpc/vsx-elemrev-2.c: Require p9vector hardware
++ support.
++ * gcc.target/powerpc/vsx-elemrev-4.c: Likewise.
++
++2016-06-03 Jakub Jelinek <jakub@redhat.com>
++
++ PR middle-end/71387
++ * g++.dg/opt/pr71387.C: New test.
++
++2016-06-02 Michael Meissner <meissner@linux.vnet.ibm.com>
++
++ Back port from trunk
++ 2016-05-26 Michael Meissner <meissner@linux.vnet.ibm.com>
++
++ * gcc.target/powerpc/p9-minmax-1.c: New tests for ISA 3.0
++ floating point min/max/comparison instructions.
++ * gcc.target/powerpc/p9-minmax-2.c: Likewise.
++
++2016-06-02 Jakub Jelinek <jakub@redhat.com>
++
++ PR c++/71372
++ * c-c++-common/pr71372.c: New test.
++
++2016-06-02 Kelvin Nilsen <kelvin@gcc.gnu.org>
++
++ Back port from trunk
++ 2016-05-19 Kelvin Nilsen <kelvin@gcc.gnu.org>
++
++ * gcc.target/powerpc/darn-0.c: New test.
++ * gcc.target/powerpc/darn-1.c: New test.
++ * gcc.target/powerpc/darn-2.c: New test.
++
++2016-06-02 Paolo Carlini <paolo.carlini@oracle.com>
++
++ PR c++/70972
++ * g++.dg/cpp0x/inh-ctor20.C: New.
++ * g++.dg/cpp0x/inh-ctor21.C: Likewise.
++
++2016-06-02 Paolo Carlini <paolo.carlini@oracle.com>
++
++ * g++.dg/cpp1y/lambda-generic-static1.C: Use target c++14.
++ * g++.dg/cpp1y/lambda-generic-static2.C: Likewise.
++
++2016-06-01 Michael Meissner <meissner@linux.vnet.ibm.com>
++
++ Back port from trunk
++ 2016-05-23 Michael Meissner <meissner@linux.vnet.ibm.com>
++ Kelvin Nilsen <kelvin@gcc.gnu.org>
++
++ * gcc.target/powerpc/p9-permute.c: Run test on big endian as well
++ as little endian.
++
++ Back port from trunk
++ 2016-05-23 Michael Meissner <meissner@linux.vnet.ibm.com>
++ Kelvin Nilsen <kelvin@gcc.gnu.org>
++
++ * gcc.target/powerpc/p9-vpermr.c: New test for ISA 3.0 vpermr
++ support.
++
++ Back port from trunk
++ 2016-05-24 Michael Meissner <meissner@linux.vnet.ibm.com>
++
++ * gcc.target/powerpc/p9-vparity.c: New file to check ISA 3.0
++ vector parity built-in functions.
++ * gcc.target/powerpc/ctz-3.c: New file to check ISA 3.0 vector
++ count trailing zeros automatic vectorization.
++ * gcc.target/powerpc/ctz-4.c: New file to check ISA 3.0 vector
++ count trailing zeros built-in functions.
++
++ Back port from trunk
++ 2016-05-24 Michael Meissner <meissner@linux.vnet.ibm.com>
++
++ * gcc.target/powerpc/p9-vneg.c: New test for ISA 3.0 VNEGW/VNEGD
++ instructions.
++
++ Back port from trunk
++ 2016-05-11 Michael Meissner <meissner@linux.vnet.ibm.com>
++
++ * gcc.target/powerpc/dform-3.c: New test for ISA 3.0 vector d-form
++ support.
++ * gcc.target/powerpc/dform-1.c: Add -mlra option to silence
++ warning when using -mvsx-timode.
++ * gcc.target/powerpc/p8vector-int128-1.c: Likewise.
++ * gcc.target/powerpc/dform-2.c: Likewise.
++ * gcc.target/powerpc/pr68805.c: Likewise.
++
++2016-06-01 Paul Thomas <pault@gcc.gnu.org>
++
++ PR fortran/71156
++ * gfortran.dg/submodule_14.f08: Add missing recursive prefix
++ to the module procedure declaration.
++ * gfortran.dg/submodule_16.f08: New test.
++
++2016-06-01 Jakub Jelinek <jakub@redhat.com>
++
++ PR middle-end/71371
++ * c-c++-common/gomp/pr71371.c: New test.
++
++ * gfortran.dg/gomp/order-1.f90: New test.
++ * gfortran.dg/gomp/order-2.f90: New test.
++
++2016-06-01 Eric Botcazou <ebotcazou@adacore.com>
++
++ * gnat.dg/opt56.ad[sb]: New test.
++
++2016-05-31 Martin Sebor <msebor@redhat.com>
++
++ PR c++/71306
++ * g++.dg/warn/Wplacement-new-size-3.C: New test.
++
++2016-05-31 Richard Biener <rguenther@suse.de>
++
++ Backport from mainline
++ 2016-05-11 Richard Biener <rguenther@suse.de>
++
++ PR debug/71057
++ * g++.dg/debug/pr71057.C: New testcase.
++
++2016-05-31 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
++
++ PR target/71056
++ * gcc.target/arm/pr71056.c: New test.
++
++2016-05-31 Tom de Vries <tom@codesourcery.com>
++
++ backport:
++ 2016-05-31 Tom de Vries <tom@codesourcery.com>
++
++ PR tree-optimization/69068
++ * gcc.dg/graphite/pr69068.c: New test.
++
++2016-05-30 Jakub Jelinek <jakub@redhat.com>
++
++ PR c++/71349
++ * c-c++-common/gomp/clauses-1.c (bar): Add dd argument. Add
++ nowait depend(inout: dd[0]) clauses where permitted.
++
++2016-05-30 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
++
++ Backport from mainline
++ 2016-04-29 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
++
++ * gcc.target/powerpc/vsx-elemrev-1.c: New.
++ * gcc.target/powerpc/vsx-elemrev-2.c: New.
++ * gcc.target/powerpc/vsx-elemrev-3.c: New.
++ * gcc.target/powerpc/vsx-elemrev-4.c: New.
++
++2016-05-30 Tom de Vries <tom@codesourcery.com>
++
++ backport:
++ 2016-05-30 Tom de Vries <tom@codesourcery.com>
++
++ * gcc.dg/graphite/pr69067.c (main): Remove superfluous argument in call
++ to ce.
++
++2016-05-30 Uros Bizjak <ubizjak@gmail.com>
++
++ * gcc.target/i386/iamcu/args.h (clear_non_sret_int_hardware_registers):
++ Use correct register when clearing %edx.
++
++2016-05-30 Richard Biener <rguenther@suse.de>
++
++ Backport from mainline
++ 2016-05-11 Richard Biener <rguenther@suse.de>
++
++ PR middle-end/71002
++ * g++.dg/torture/pr71002.C: New testcase.
++
++ 2016-05-13 Jakub Jelinek <jakub@redhat.com>
++
++ PR bootstrap/71071
++ * gcc.dg/pr71071.c: New test.
++
++2016-05-30 Tom de Vries <tom@codesourcery.com>
++
++ backport:
++ 2016-05-30 Tom de Vries <tom@codesourcery.com>
++
++ PR tree-optimization/69067
++ * gcc.dg/graphite/pr69067.c: New test.
++
++2016-05-29 Paolo Carlini <paolo.carlini@oracle.com>
++
++ PR c++/71105
++ * g++.dg/cpp0x/lambda/lambda-conv11.C: New.
++ * g++.dg/cpp1y/lambda-conv1.C: Likewise.
++ * g++.dg/cpp1y/lambda-conv2.C: Likewise.
++
++2016-05-27 Ilya Enkovich <ilya.enkovich@intel.com>
++
++ Backport from mainline r236810.
++ 2016-05-27 Ilya Enkovich <ilya.enkovich@intel.com>
++
++ PR middle-end/71279
++ * gcc.dg/pr71279.c: New test.
++
++2016-05-26 Jerry DeLisle <jvdelisle@gcc.gnu.org>
++
++ Backport from trunk.
++ PR fortran/66461
++ * gfortran.dg/unexpected_eof.f: New test
++
++2016-05-25 Eric Botcazou <ebotcazou@adacore.com>
++
++ * gnat.dg/opt55.ad[sb]: New test.
++
++2016-05-24 Martin Sebor <msebor@redhat.com>
++
++ PR c++/71147
++ * g++.dg/ext/flexary16.C: New test.
++
++2016-05-24 Paolo Carlini <paolo.carlini@oracle.com>
++
++ PR c++/69872
++ * g++.dg/warn/Wno-narrowing1.C: New.
++
++2016-05-24 Jakub Jelinek <jakub@redhat.com>
++
++ PR c++/71257
++ * g++.dg/vect/simd-clone-6.cc: New test.
++ * g++.dg/gomp/declare-simd-6.C: New test.
++
++2016-05-23 Martin Jambor <mjambor@suse.cz>
++
++ PR tree-optimization/70884
++ * gcc.dg/tree-ssa/pr70919.c: New test.
++
++2016-05-20 Jakub Jelinek <jakub@redhat.com>
++
++ PR c++/71210
++ * g++.dg/opt/pr71210-1.C: New test.
++ * g++.dg/opt/pr71210-2.C: New test.
++
++ PR fortran/71204
++ * gfortran.dg/pr71204.f90: New test.
++
++2016-05-19 David Malcolm <dmalcolm@redhat.com>
++
++ Backport from trunk r236483.
++ PR c++/71184
++ * g++.dg/pr71184.C: New test case.
++
++2016-05-19 Marek Polacek <polacek@redhat.com>
++
++ Backport from mainline
++ 2016-05-19 Marek Polacek <polacek@redhat.com>
++
++ PR tree-optimization/71031
++ * gcc.dg/tree-ssa/vrp100.c: New test.
++
++2016-05-19 Bernd Edlinger <bernd.edlinger@hotmail.de>
++
++ Backport from mainline
++ 2016-05-19 Bernd Edlinger <bernd.edlinger@hotmail.de>
++
++ * c-c++-common/pr69669.c: Check the used mode.
++
++2016-05-19 Martin Jambor <mjambor@suse.cz>
++
++ PR ipa/70646
++ * gcc.dg/ipa/pr70646.c: New test.
++
++2016-05-18 Jakub Jelinek <jakub@redhat.com>
++
++ PR c++/71100
++ * g++.dg/opt/pr71100.C: New test.
++
++2016-05-18 Paolo Carlini <paolo.carlini@oracle.com>
++
++ PR c++/70466
++ * g++.dg/template/pr70466-1.C: New.
++ * g++.dg/template/pr70466-2.C: Likewise.
++
++2016-05-18 Christophe Lyon <christophe.lyon@linaro.org>
++
++ Backport from mainline r236377.
++ 2016-05-19 Christophe Lyon <christophe.lyon@linaro.org>
++
++ * gcc.target/aarch64/noplt_3.c: Scan for "br\t".
++ * gcc.target/aarch64/tail_indirect_call_1.c: Scan for "br\t",
++ "blr\t" and switch to scan-assembler-times.
++
++2016-05-17 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
++
++ Backport from mainline
++ 2016-05-17 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
++
++ PR target/70809
++ * gcc.target/aarch64/pr70809_1.c: New test.
++
++2016-05-15 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
++
++ Backport from mainline
++ 2016-05-11 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
++
++ * gcc.target/powerpc/pr70963.c: Require at least power8 at both
++ compile and run time.
++
++2016-05-15 Harald Anlauf <anlauf@gmx.de>
++
++ PR fortran/69603
++ * gfortran.dg/pr69603.f90: New testcase.
++
++2016-05-14 Fritz Reese <fritzoreese@gmail.com>
++
++ Backport from trunk: r235999, r236241, r236242
++ * gfortran.dg/dec_union_4.f90: Fix endian issue.
++
++ PR fortran/71047
++ * gfortran.dg/pr71047.f08: New test.
++
++ PR fortran/56226
++ * gfortran.dg/dec_structure_1.f90: New testcase.
++ * gfortran.dg/dec_structure_2.f90: Ditto.
++ * gfortran.dg/dec_structure_3.f90: Ditto.
++ * gfortran.dg/dec_structure_4.f90: Ditto.
++ * gfortran.dg/dec_structure_5.f90: Ditto.
++ * gfortran.dg/dec_structure_6.f90: Ditto.
++ * gfortran.dg/dec_structure_7.f90: Ditto.
++ * gfortran.dg/dec_structure_8.f90: Ditto.
++ * gfortran.dg/dec_structure_9.f90: Ditto.
++ * gfortran.dg/dec_structure_10.f90: Ditto.
++ * gfortran.dg/dec_structure_11.f90: Ditto.
++ * gfortran.dg/dec_union_1.f90: Ditto.
++ * gfortran.dg/dec_union_2.f90: Ditto.
++ * gfortran.dg/dec_union_3.f90: Ditto.
++ * gfortran.dg/dec_union_4.f90: Ditto.
++ * gfortran.dg/dec_union_5.f90: Ditto.
++ * gfortran.dg/dec_union_6.f90: Ditto.
++ * gfortran.dg/dec_union_7.f90: Ditto.
++
++2016-05-13 Uros Bizjak <ubizjak@gmail.com>
++
++ * gcc.dg/vect/tree-vect.h (check_vect): Handle AVX2,
++ remove XOP handling.
++ * gcc.dg/vect/pr66636.c (foo): Add __attribute__((noinline,noclone)).
++
++2016-05-13 Richard Biener <rguenther@suse.de>
++
++ Backport from mainline
++ 2016-04-27 Richard Biener <rguenther@suse.de>
++
++ PR ipa/70760
++ * g++.dg/ipa/ipa-pta-2.C: New testcase.
++
++ 2016-05-06 Richard Biener <rguenther@suse.de>
++
++ PR middle-end/70931
++ * gfortran.dg/pr70931.f90: New testcase.
++
++ 2016-05-06 Richard Biener <rguenther@suse.de>
++
++ PR middle-end/70941
++ * gcc.dg/torture/pr70941.c: New testcase.
++
++ 2016-05-06 Jakub Jelinek <jakub@redhat.com>
++
++ PR middle-end/70941
++ * gcc.dg/torture/pr70941.c (abort): Remove prototype.
++ (a, b, c, d): Change type from char to signed char.
++ (main): Compare against (signed char) -1634678893 instead of
++ hardcoded -109. Use __builtin_abort instead of abort.
++
++2016-05-12 Ilya Enkovich <ilya.enkovich@intel.com>
++
++ Backport from mainline r236171.
++ 2016-05-12 Ilya Enkovich <ilya.enkovich@intel.com>
++
++ PR tree-optimization/71006
++ * gcc.dg/pr71006.c: New test.
++
++2016-05-12 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
++
++ Backport from mainline
++ 2016-05-12 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
++
++ PR target/70830
++ * gcc.target/arm/interrupt-1.c: Change dg-compile to dg-assemble.
++ Add -save-temps to dg-options.
++ Scan for ldmfd rather than pop instruction.
++ * gcc.target/arm/interrupt-2.c: Likewise.
++ * gcc.target/arm/pr70830.c: New test.
++
++2016-05-11 Jakub Jelinek <jakub@redhat.com>
++
++ PR fortran/70855
++ * gfortran.dg/gomp/pr70855.f90: New test.
++
++2016-05-11 Ilya Enkovich <ilya.enkovich@intel.com>
++
++ Backport from mainline r236088.
++ 2016-05-10 Ilya Enkovich <ilya.enkovich@intel.com>
++
++ PR middle-end/70877
++ * gcc.target/i386/pr70877.c: New test.
++
++2016-05-11 Ilya Enkovich <ilya.enkovich@intel.com>
++
++ Backport from mainline r236086.
++ 2016-05-10 Ilya Enkovich <ilya.enkovich@intel.com>
++
++ PR tree-optimization/70876
++ * gcc.target/i386/pr70876.c: New test.
++
++2016-05-10 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
++
++ Backport from mainline
++ 2016-05-10 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
++
++ PR target/70963
++ * gcc.target/powerpc/pr70963.c: New.
++
++2016-05-10 Jakub Jelinek <jakub@redhat.com>
++
++ Backported from mainline
++ 2016-05-03 Jakub Jelinek <jakub@redhat.com>
++
++ PR tree-optimization/70916
++ * gcc.c-torture/compile/pr70916.c: New test.
++
++2016-05-10 Yuri Rumyantsev <ysrumyan@gmail.com>
++
++ Backport from mainline r235962.
++ 2016-05-06 Yuri Rumyantsev <ysrumyan@gmail.com>
++
++ PR debug/70935
++ * gcc.dg/torture/pr70935.c: New test.
++
++2016-05-09 Uros Bizjak <ubizjak@gmail.com>
++
++ * gcc.target/i386/fabsneg-1.c New test.
++
++2016-05-07 Tom de Vries <tom@codesourcery.com>
++
++ backport:
++ 2016-05-07 Tom de Vries <tom@codesourcery.com>
++
++ PR tree-optimization/70956
++ * gcc.dg/graphite/pr70956.c: New test.
++
++2016-05-06 Marek Polacek <polacek@redhat.com>
++
++ Backported from mainline
++ 2016-05-06 Marek Polacek <polacek@redhat.com>
++
++ PR sanitizer/70875
++ * gcc.dg/ubsan/bounds-3.c: New test.
++
++2016-05-06 Marek Polacek <polacek@redhat.com>
++
++ Backported from mainline
++ 2016-04-29 Marek Polacek <polacek@redhat.com>
++
++ PR sanitizer/70342
++ * g++.dg/ubsan/null-7.C: New test.
++
++2016-05-03 Pierre-Marie de Rodat <derodat@adacore.com>
++
++ * gnat.dg/debug5.adb: New testcase.
++
++2016-04-29 Cesar Philippidis <cesar@codesourcery.com>
++
++ PR middle-end/70626
++ * c-c++-common/goacc/combined-reduction.c: New test.
++ * gfortran.dg/goacc/reduction-2.f95: Add check for kernels reductions.
++
++2016-04-28 Jakub Jelinek <jakub@redhat.com>
++
++ PR target/70858
++ * gcc.target/i386/pr70858.c: New test.
++
++2016-04-28 Paolo Carlini <paolo.carlini@oracle.com>
++
++ PR c++/70540
++ * g++.dg/cpp0x/auto48.C: New.
++
++2016-04-27 Dominique d'Humieres <dominiq@lps.ens.fr>
++
++ * gfortran.dg/submodule_14.f08: Add cleanup-submodules.
++ * gfortran.dg/submodule_15.f08: Likewise.
++
++2016-04-27 H.J. Lu <hongjiu.lu@intel.com>
++
++ Backported from mainline
++ 2016-04-21 H.J. Lu <hongjiu.lu@intel.com>
++
++ PR target/70750
++ * gcc.target/i386/pr70750-1.c: New test.
++ * gcc.target/i386/pr70750-2.c: Likewise.
++
++2016-04-27 Jakub Jelinek <jakub@redhat.com>
++
++ Backported from mainline
++ 2016-04-23 Jakub Jelinek <jakub@redhat.com>
++
++ PR sanitizer/70712
++ * c-c++-common/asan/pr70712.c: New test.
++
++2016-04-21 Kirill Yukhin <kirill.yukhin@intel.com>
++
++ PR target/70728
++ * gcc.target/i386/pr70728.c: New test.
++
+ 2016-04-27 Release Manager
+
+ * GCC 6.1.0 released.
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/c-c++-common/asan/pr70712.c gcc-6-20160721/gcc/testsuite/c-c++-common/asan/pr70712.c
+--- gcc-6.1.0/gcc/testsuite/c-c++-common/asan/pr70712.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/c-c++-common/asan/pr70712.c 2016-04-27 12:23:50.000000000 +0000
+@@ -0,0 +1,32 @@
++/* PR sanitizer/70712 */
++/* { dg-do run } */
++
++struct __attribute__((aligned (64))) S
++{
++ char s[4];
++};
++
++struct T
++{
++ char t[8];
++ char u[480];
++
++};
++
++__attribute__((noinline, noclone)) void
++foo (struct T *p, struct S *q)
++{
++ __builtin_memset (p->t, '\0', sizeof (p->t));
++ __builtin_memset (p->u, '\0', sizeof (p->u));
++ __builtin_memset (q->s, '\0', sizeof (q->s));
++}
++
++int
++main ()
++{
++ struct S s;
++ struct T t;
++ foo (&t, &s);
++ asm volatile ("" : : "r" (&t), "r" (&s) : "memory");
++ return 0;
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/c-c++-common/goacc/cache-1.c gcc-6-20160721/gcc/testsuite/c-c++-common/goacc/cache-1.c
+--- gcc-6.1.0/gcc/testsuite/c-c++-common/goacc/cache-1.c 2015-01-15 20:11:12.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/c-c++-common/goacc/cache-1.c 2016-06-10 09:46:04.000000000 +0000
+@@ -1,3 +1,7 @@
++/* OpenACC cache directive: valid usage. */
++/* For execution testing, this file is "#include"d from
++ libgomp/testsuite/libgomp.oacc-c-c++-common/cache-1.c. */
++
+ int
+ main (int argc, char **argv)
+ {
+@@ -21,57 +25,31 @@
+ int n = 1;
+ const int len = n;
+
+-#pragma acc cache /* { dg-error "expected '\\\(' before end of line" } */
+-
+-#pragma acc cache a[0:N] /* { dg-error "expected '\\\(' before 'a'" } */
+- /* { dg-bogus "expected end of line before 'a'" "" { xfail c++ } 26 } */
+-
+-#pragma acc cache (a) /* { dg-error "expected '\\\['" } */
+-
+-#pragma acc cache ( /* { dg-error "expected (identifier|unqualified-id) before end of line" } */
+-
+-#pragma acc cache () /* { dg-error "expected (identifier|unqualified-id) before '\\\)' token" } */
+-
+-#pragma acc cache (,) /* { dg-error "expected (identifier|unqualified-id) before '(,|\\\))' token" } */
+-
+-#pragma acc cache (a[0:N] /* { dg-error "expected '\\\)' before end of line" } */
+-
+-#pragma acc cache (a[0:N],) /* { dg-error "expected (identifier|unqualified-id) before '(,|\\\))' token" "" { xfail c } } */
+-
+-#pragma acc cache (a[0:N]) copyin (a[0:N]) /* { dg-error "expected end of line before 'copyin'" } */
+-
+-#pragma acc cache () /* { dg-error "expected (identifier|unqualified-id) before '\\\)' token" } */
+-
+-#pragma acc cache (a[0:N] b[0:N]) /* { dg-error "expected '\\\)' before 'b'" } */
+-
+-#pragma acc cache (a[0:N] b[0:N}) /* { dg-error "expected '\\\)' before 'b'" } */
+- /* { dg-bogus "expected end of line before '\\\}' token" "" { xfail c++ } 47 } */
+-
+-#pragma acc cache (a[0:N] /* { dg-error "expected '\\\)' before end of line" } */
+-
+-#pragma acc cache (a[ii]) /* { dg-error "'ii' is not a constant" } */
+-
+-#pragma acc cache (a[idx:n]) /* { dg-error "'n' is not a constant" } */
+-
+-#pragma acc cache (a[0:N]) ( /* { dg-error "expected end of line before '\\(' token" } */
+-
+-#pragma acc cache (a[0:N]) ii /* { dg-error "expected end of line before 'ii'" } */
+-
+-#pragma acc cache (a[0:N] ii) /* { dg-error "expected '\\)' before 'ii'" } */
+-
++ /* Have at it, GCC! */
+ #pragma acc cache (a[0:N])
+-
+ #pragma acc cache (a[0:N], a[0:N])
+-
+ #pragma acc cache (a[0:N], b[0:N])
+-
+ #pragma acc cache (a[0])
+-
+ #pragma acc cache (a[0], a[1], b[0:N])
+-
++#pragma acc cache (a[i - 5])
++#pragma acc cache (a[i + 5:len])
++#pragma acc cache (a[i + 5:len - 1])
++#pragma acc cache (b[i])
++#pragma acc cache (b[i:len])
++#pragma acc cache (a[ii])
++#pragma acc cache (a[ii:len])
++#pragma acc cache (b[ii - 1])
++#pragma acc cache (b[ii - 1:len])
++#pragma acc cache (b[i - ii + 1])
++#pragma acc cache (b[i + ii - 1:len])
++#pragma acc cache (b[i * ii - 1:len + 1])
++#pragma acc cache (a[idx + 2])
++#pragma acc cache (a[idx:len + 2])
+ #pragma acc cache (a[idx])
+-
+ #pragma acc cache (a[idx:len])
++#pragma acc cache (a[idx + 2:len])
++#pragma acc cache (a[idx + 2 + i:len])
++#pragma acc cache (a[idx + 2 + i + ii:len])
+
+ b[ii] = a[ii];
+ }
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/c-c++-common/goacc/cache-2.c gcc-6-20160721/gcc/testsuite/c-c++-common/goacc/cache-2.c
+--- gcc-6.1.0/gcc/testsuite/c-c++-common/goacc/cache-2.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/c-c++-common/goacc/cache-2.c 2016-06-10 09:46:04.000000000 +0000
+@@ -0,0 +1,57 @@
++/* OpenACC cache directive: invalid usage. */
++
++int
++main (int argc, char **argv)
++{
++#define N 2
++ int a[N], b[N];
++ int i;
++
++ for (i = 0; i < N; i++)
++ {
++ a[i] = 3;
++ b[i] = 0;
++ }
++
++#pragma acc parallel copyin (a[0:N]) copyout (b[0:N])
++{
++ int ii;
++
++ for (ii = 0; ii < N; ii++)
++ {
++ const int idx = ii;
++ int n = 1;
++ const int len = n;
++
++#pragma acc cache /* { dg-error "expected '\\\(' before end of line" } */
++#pragma acc cache a[0:N] /* { dg-error "expected '\\\(' before 'a'" } */
++ /* { dg-bogus "expected end of line before 'a'" "" { xfail c++ } 27 } */
++#pragma acc cache (a) /* { dg-error "expected '\\\['" } */
++#pragma acc cache ( /* { dg-error "expected (identifier|unqualified-id) before end of line" } */
++#pragma acc cache () /* { dg-error "expected (identifier|unqualified-id) before '\\\)' token" } */
++#pragma acc cache (,) /* { dg-error "expected (identifier|unqualified-id) before '(,|\\\))' token" } */
++#pragma acc cache (a[0:N] /* { dg-error "expected '\\\)' before end of line" } */
++#pragma acc cache (a[0:N],) /* { dg-error "expected (identifier|unqualified-id) before '(,|\\\))' token" "" { xfail c } } */
++#pragma acc cache (a[0:N]) copyin (a[0:N]) /* { dg-error "expected end of line before 'copyin'" } */
++#pragma acc cache () /* { dg-error "expected (identifier|unqualified-id) before '\\\)' token" } */
++#pragma acc cache (a[0:N] b[0:N]) /* { dg-error "expected '\\\)' before 'b'" } */
++#pragma acc cache (a[0:N] b[0:N}) /* { dg-error "expected '\\\)' before 'b'" } */
++ /* { dg-bogus "expected end of line before '\\\}' token" "" { xfail c++ } 38 } */
++#pragma acc cache (a[0:N] /* { dg-error "expected '\\\)' before end of line" } */
++#pragma acc cache (a[0:N]) ( /* { dg-error "expected end of line before '\\(' token" } */
++#pragma acc cache (a[0:N]) ii /* { dg-error "expected end of line before 'ii'" } */
++#pragma acc cache (a[0:N] ii) /* { dg-error "expected '\\)' before 'ii'" } */
++
++ b[ii] = a[ii];
++ }
++}
++
++
++ for (i = 0; i < N; i++)
++ {
++ if (a[i] != b[i])
++ __builtin_abort ();
++ }
++
++ return 0;
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/c-c++-common/goacc/combined-directives.c gcc-6-20160721/gcc/testsuite/c-c++-common/goacc/combined-directives.c
+--- gcc-6.1.0/gcc/testsuite/c-c++-common/goacc/combined-directives.c 2016-03-30 15:08:47.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/c-c++-common/goacc/combined-directives.c 2016-06-10 09:46:18.000000000 +0000
+@@ -111,6 +111,7 @@
+ // { dg-final { scan-tree-dump-times "acc loop vector" 2 "gimple" } }
+ // { dg-final { scan-tree-dump-times "acc loop seq" 2 "gimple" } }
+ // { dg-final { scan-tree-dump-times "acc loop auto" 2 "gimple" } }
+-// { dg-final { scan-tree-dump-times "acc loop tile.2, 3" 2 "gimple" } }
++// XFAILed: OpenACC tile clauses are discarded during gimplification.
++// { dg-final { scan-tree-dump-times "acc loop tile.2, 3" 2 "gimple" { xfail *-*-* } } }
+ // { dg-final { scan-tree-dump-times "acc loop independent private.i" 2 "gimple" } }
+ // { dg-final { scan-tree-dump-times "private.z" 2 "gimple" } }
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/c-c++-common/goacc/combined-reduction.c gcc-6-20160721/gcc/testsuite/c-c++-common/goacc/combined-reduction.c
+--- gcc-6.1.0/gcc/testsuite/c-c++-common/goacc/combined-reduction.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/c-c++-common/goacc/combined-reduction.c 2016-04-29 17:37:55.000000000 +0000
+@@ -0,0 +1,29 @@
++/* { dg-do compile } */
++/* { dg-options "-fopenacc -fdump-tree-gimple" } */
++
++#include <assert.h>
++
++int
++main ()
++{
++ int i, v1 = 0, n = 100;
++
++#pragma acc parallel loop reduction(+:v1)
++ for (i = 0; i < n; i++)
++ v1++;
++
++ assert (v1 == n);
++
++#pragma acc kernels loop reduction(+:v1)
++ for (i = 0; i < n; i++)
++ v1++;
++
++ assert (v1 == n);
++
++ return 0;
++}
++
++/* { dg-final { scan-tree-dump-times "omp target oacc_parallel reduction.+:v1. map.tofrom:v1" 1 "gimple" } } */
++/* { dg-final { scan-tree-dump-times "acc loop reduction.+:v1. private.i." 1 "gimple" } } */
++/* { dg-final { scan-tree-dump-times "omp target oacc_kernels map.force_tofrom:n .len: 4.. map.force_tofrom:v1 .len: 4.." 1 "gimple" } } */
++/* { dg-final { scan-tree-dump-times "acc loop reduction.+:v1. private.i." 1 "gimple" } } */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/c-c++-common/gomp/clauses-1.c gcc-6-20160721/gcc/testsuite/c-c++-common/gomp/clauses-1.c
+--- gcc-6.1.0/gcc/testsuite/c-c++-common/gomp/clauses-1.c 2016-03-07 18:39:51.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/c-c++-common/gomp/clauses-1.c 2016-05-30 21:40:04.000000000 +0000
+@@ -34,7 +34,7 @@
+
+ void
+ bar (int d, int m, int i1, int i2, int p, int *idp, int s,
+- int nte, int tl, int nth, int g, int nta, int fi, int pp, int *q)
++ int nte, int tl, int nth, int g, int nta, int fi, int pp, int *q, int *dd)
+ {
+ #pragma omp for simd \
+ private (p) firstprivate (f) lastprivate (l) linear (ll:1) reduction(+:r) schedule(static, 4) collapse(1) nowait \
+@@ -63,29 +63,30 @@
+ }
+ #pragma omp target parallel \
+ device(d) map (tofrom: m) if (target: i1) private (p) firstprivate (f) defaultmap(tofrom: scalar) is_device_ptr (idp) \
+- if (parallel: i2) default(shared) shared(s) reduction(+:r) num_threads (nth) proc_bind(spread)
++ if (parallel: i2) default(shared) shared(s) reduction(+:r) num_threads (nth) proc_bind(spread) \
++ nowait depend(inout: dd[0])
+ ;
+ #pragma omp target parallel for \
+ device(d) map (tofrom: m) if (target: i1) private (p) firstprivate (f) defaultmap(tofrom: scalar) is_device_ptr (idp) \
+ if (parallel: i2) default(shared) shared(s) reduction(+:r) num_threads (nth) proc_bind(spread) \
+- lastprivate (l) linear (ll:1) ordered schedule(static, 4) collapse(1)
++ lastprivate (l) linear (ll:1) ordered schedule(static, 4) collapse(1) nowait depend(inout: dd[0])
+ for (int i = 0; i < 64; i++)
+ ll++;
+ #pragma omp target parallel for simd \
+ device(d) map (tofrom: m) if (target: i1) private (p) firstprivate (f) defaultmap(tofrom: scalar) is_device_ptr (idp) \
+ if (parallel: i2) default(shared) shared(s) reduction(+:r) num_threads (nth) proc_bind(spread) \
+ lastprivate (l) linear (ll:1) schedule(static, 4) collapse(1) \
+- safelen(8) simdlen(4) aligned(q: 32)
++ safelen(8) simdlen(4) aligned(q: 32) nowait depend(inout: dd[0])
+ for (int i = 0; i < 64; i++)
+ ll++;
+ #pragma omp target teams \
+ device(d) map (tofrom: m) if (target: i1) private (p) firstprivate (f) defaultmap(tofrom: scalar) is_device_ptr (idp) \
+- shared(s) default(shared) reduction(+:r) num_teams(nte) thread_limit(tl)
++ shared(s) default(shared) reduction(+:r) num_teams(nte) thread_limit(tl) nowait depend(inout: dd[0])
+ ;
+ #pragma omp target teams distribute \
+ device(d) map (tofrom: m) if (target: i1) private (p) firstprivate (f) defaultmap(tofrom: scalar) is_device_ptr (idp) \
+ shared(s) default(shared) reduction(+:r) num_teams(nte) thread_limit(tl) \
+- collapse(1) dist_schedule(static, 16)
++ collapse(1) dist_schedule(static, 16) nowait depend(inout: dd[0])
+ for (int i = 0; i < 64; i++)
+ ;
+ #pragma omp target teams distribute parallel for \
+@@ -93,7 +94,7 @@
+ shared(s) default(shared) reduction(+:r) num_teams(nte) thread_limit(tl) \
+ collapse(1) dist_schedule(static, 16) \
+ if (parallel: i2) num_threads (nth) proc_bind(spread) \
+- lastprivate (l) schedule(static, 4)
++ lastprivate (l) schedule(static, 4) nowait depend(inout: dd[0])
+ for (int i = 0; i < 64; i++)
+ ll++;
+ #pragma omp target teams distribute parallel for simd \
+@@ -102,19 +103,20 @@
+ collapse(1) dist_schedule(static, 16) \
+ if (parallel: i2) num_threads (nth) proc_bind(spread) \
+ lastprivate (l) schedule(static, 4) \
+- safelen(8) simdlen(4) aligned(q: 32)
++ safelen(8) simdlen(4) aligned(q: 32) nowait depend(inout: dd[0])
+ for (int i = 0; i < 64; i++)
+ ll++;
+ #pragma omp target teams distribute simd \
+ device(d) map (tofrom: m) if (target: i1) private (p) firstprivate (f) defaultmap(tofrom: scalar) is_device_ptr (idp) \
+ shared(s) default(shared) reduction(+:r) num_teams(nte) thread_limit(tl) \
+ collapse(1) dist_schedule(static, 16) \
+- safelen(8) simdlen(4) aligned(q: 32)
++ safelen(8) simdlen(4) aligned(q: 32) nowait depend(inout: dd[0])
+ for (int i = 0; i < 64; i++)
+ ll++;
+ #pragma omp target simd \
+ device(d) map (tofrom: m) if (target: i1) private (p) firstprivate (f) defaultmap(tofrom: scalar) is_device_ptr (idp) \
+- safelen(8) simdlen(4) lastprivate (l) linear(ll: 1) aligned(q: 32) reduction(+:r)
++ safelen(8) simdlen(4) lastprivate (l) linear(ll: 1) aligned(q: 32) reduction(+:r) \
++ nowait depend(inout: dd[0])
+ for (int i = 0; i < 64; i++)
+ ll++;
+ #pragma omp taskloop simd \
+@@ -128,7 +130,7 @@
+ safelen(8) simdlen(4) linear(ll: 1) aligned(q: 32) reduction(+:r)
+ for (int i = 0; i < 64; i++)
+ ll++;
+- #pragma omp target
++ #pragma omp target nowait depend(inout: dd[0])
+ #pragma omp teams distribute \
+ private(p) firstprivate (f) shared(s) default(shared) reduction(+:r) num_teams(nte) thread_limit(tl) \
+ collapse(1) dist_schedule(static, 16)
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/c-c++-common/gomp/pr71371.c gcc-6-20160721/gcc/testsuite/c-c++-common/gomp/pr71371.c
+--- gcc-6.1.0/gcc/testsuite/c-c++-common/gomp/pr71371.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/c-c++-common/gomp/pr71371.c 2016-06-01 14:29:04.000000000 +0000
+@@ -0,0 +1,25 @@
++/* PR middle-end/71371 */
++/* { dg-do compile } */
++
++void baz (int *);
++
++void
++foo (void)
++{
++ int i;
++ #pragma omp taskloop
++ for (i = 0; i < 100; i++)
++ baz (&i);
++}
++
++void
++bar (void)
++{
++ int i;
++ #pragma omp parallel
++ {
++ #pragma omp for
++ for (i = 0; i < 100; i++)
++ baz (&i);
++ }
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/c-c++-common/gomp/pr71758.c gcc-6-20160721/gcc/testsuite/c-c++-common/gomp/pr71758.c
+--- gcc-6.1.0/gcc/testsuite/c-c++-common/gomp/pr71758.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/c-c++-common/gomp/pr71758.c 2016-07-11 20:43:11.000000000 +0000
+@@ -0,0 +1,10 @@
++/* PR middle-end/71758 */
++
++void
++foo (int *p)
++{
++ long long i = 0;
++ #pragma omp target device (i)
++ ;
++ #pragma omp target update device (i) to (p[0])
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/c-c++-common/pr69669.c gcc-6-20160721/gcc/testsuite/c-c++-common/pr69669.c
+--- gcc-6.1.0/gcc/testsuite/c-c++-common/pr69669.c 2016-02-04 22:17:05.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/c-c++-common/pr69669.c 2016-05-19 17:38:51.000000000 +0000
+@@ -1,5 +1,6 @@
+ /* PR c/69669 */
+ /* { dg-do compile } */
++/* { dg-options "-fdump-rtl-final" } */
+
+ enum __attribute__((mode(QI))) E { F = 1 };
+
+@@ -8,3 +9,5 @@
+ {
+ *x = (enum E) y;
+ }
++
++/* { dg-final { scan-rtl-dump-times "mem:QI" 1 "final" } } */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/c-c++-common/pr71372.c gcc-6-20160721/gcc/testsuite/c-c++-common/pr71372.c
+--- gcc-6.1.0/gcc/testsuite/c-c++-common/pr71372.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/c-c++-common/pr71372.c 2016-06-02 16:43:04.000000000 +0000
+@@ -0,0 +1,14 @@
++/* PR c++/71372 */
++/* { dg-do compile } */
++/* { dg-options "-O2 -fdump-tree-optimized" } */
++
++void
++foo (volatile int *p, int q)
++{
++ *(volatile int *)p = 0;
++ *(p + (q - q) + 1) = 0;
++ *(p + (q - q) + 2) = 0;
++ *(p + (q - q) + 3) = 0;
++}
++
++/* { dg-final { scan-tree-dump-times " ={v} " 4 "optimized" } } */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/c-c++-common/ubsan/bounds-13.c gcc-6-20160721/gcc/testsuite/c-c++-common/ubsan/bounds-13.c
+--- gcc-6.1.0/gcc/testsuite/c-c++-common/ubsan/bounds-13.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/c-c++-common/ubsan/bounds-13.c 2016-06-13 21:08:36.000000000 +0000
+@@ -0,0 +1,31 @@
++/* PR sanitizer/71498 */
++/* { dg-do run } */
++/* { dg-options "-fsanitize=bounds -Wno-array-bounds" } */
++
++struct S { int a[100]; int b, c; } s;
++
++__attribute__((noinline, noclone)) int
++foo (int x)
++{
++ return s.a[x];
++}
++
++__attribute__((noinline, noclone)) int
++bar (int x)
++{
++ static int *d = &s.a[99];
++ asm volatile ("" : : "r" (&d));
++ return s.a[x];
++}
++
++int
++main ()
++{
++ volatile int a = 0;
++ a += foo (100);
++ a += bar (100);
++ return 0;
++}
++
++/* { dg-output "index 100 out of bounds for type 'int \\\[100\\\]'\[^\n\r]*(\n|\r\n|\r)" } */
++/* { dg-output "\[^\n\r]*index 100 out of bounds for type 'int \\\[100\\\]'\[^\n\r]*(\n|\r\n|\r)" } */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/concepts/diagnostic1.C gcc-6-20160721/gcc/testsuite/g++.dg/concepts/diagnostic1.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/concepts/diagnostic1.C 2016-03-08 22:30:44.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/concepts/diagnostic1.C 2016-07-21 06:18:06.000000000 +0000
+@@ -1,16 +1,30 @@
+ // PR c++/67159
+ // { dg-options "-std=c++1z -fconcepts" }
+
++template <class T, class U>
++concept bool SameAs = __is_same_as(T, U);
++
+ template <class T>
+-concept bool R = requires (T& t) {
++concept bool R1 = requires (T& t) {
+ { t.begin() } -> T
++ { t.end() } -> SameAs<T*>;
++};
++
++template <class T>
++concept bool R2 = requires (T& t) {
++ { t.end() } -> SameAs<T*>;
+ };
+
+ struct foo {
+ int* begin();
++ int* end();
+ };
+
+-R{T}
++R1{T}
+ constexpr bool f() { return true; }
+
++R2{T}
++constexpr bool g() { return true; }
++
+ static_assert(f<foo>()); // { dg-error "" }
++static_assert(g<foo>()); // { dg-error "" }
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/concepts/dr1430.C gcc-6-20160721/gcc/testsuite/g++.dg/concepts/dr1430.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/concepts/dr1430.C 2016-03-08 22:30:44.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/concepts/dr1430.C 2016-07-21 06:18:06.000000000 +0000
+@@ -24,11 +24,19 @@
+ return decltype(check<T, U, Args...>())::value;
+ }
+
++template <typename T, typename U, typename... Args>
++ concept bool Similar = true;
++
+ template <typename... Args>
+-requires Same<Args...>() // { dg-error "concept" }
++requires Same<Args...>() // { dg-error "invalid reference" }
+ void foo( Args... args ) {}
+
++template <typename... Args>
++requires Similar<Args...> // { dg-error "invalid reference" }
++ void bar( Args... args ) {}
++
+ int main()
+ {
+- foo(1, 2, 3); // { dg-error "" }
++ foo(1, 2, 3); // { dg-error "cannot call" }
++ bar(1, 2, 3); // { dg-error "cannot call" }
+ }
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/concepts/expression2.C gcc-6-20160721/gcc/testsuite/g++.dg/concepts/expression2.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/concepts/expression2.C 2016-03-08 22:30:44.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/concepts/expression2.C 2016-07-21 06:18:06.000000000 +0000
+@@ -31,12 +31,12 @@
+ int main()
+ {
+ f1(s); // { dg-error "cannot call" }
+- f2(s); // { dg-error "cannot call" }
++ f2(s); // { dg-error "" }
+
+ // When used in non-SFINAE contexts, make sure that we fail
+ // the constraint check before emitting the access check
+ // failures. The context is being presented constistently
+ // in both cases.
+ static_assert(C1<S>(), ""); // { dg-error "failed" }
+- static_assert(C2<S>(), ""); // { dg-error "failed" }
++ static_assert(C2<S>(), ""); // { dg-error "" }
+ }
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/concepts/req19.C gcc-6-20160721/gcc/testsuite/g++.dg/concepts/req19.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/concepts/req19.C 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/concepts/req19.C 2016-07-21 06:18:06.000000000 +0000
+@@ -0,0 +1,13 @@
++// { dg-options "-std=c++1z -fconcepts" }
++
++struct B
++{
++ template <class T> void f(T t)
++ requires requires (T tt) { tt; }
++ { }
++};
++
++int main()
++{
++ B().f(42);
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/concepts/req20.C gcc-6-20160721/gcc/testsuite/g++.dg/concepts/req20.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/concepts/req20.C 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/concepts/req20.C 2016-07-21 06:18:06.000000000 +0000
+@@ -0,0 +1,19 @@
++// { dg-options "-std=c++1z -fconcepts" }
++
++template <class T> concept bool C = true;
++
++template <class T>
++requires C<typename T::foo>
++void f(T t) { }
++
++void f(...);
++
++template <class T>
++requires C<T>
++void g(T t) { }
++
++int main()
++{
++ f(42);
++ g(42);
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/concepts/req4.C gcc-6-20160721/gcc/testsuite/g++.dg/concepts/req4.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/concepts/req4.C 2016-03-08 22:30:44.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/concepts/req4.C 2016-07-21 06:18:06.000000000 +0000
+@@ -9,10 +9,10 @@
+ template<typename T> constexpr fool p2() { return {}; }
+
+ template<typename T>
+- concept bool C() { return p1<T>() && p2<T>(); } // { dg-error "does not have type" }
++ concept bool C() { return p1<T>() && p2<T>(); }
+
+ template<C T> void f(T x) { }
+
+ int main() {
+- f(0); // { dg-error "cannot call" }
++ f(0); // { dg-error "cannot call|uses overloaded operator" }
+ }
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/concepts/req5.C gcc-6-20160721/gcc/testsuite/g++.dg/concepts/req5.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/concepts/req5.C 2016-03-08 22:30:44.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/concepts/req5.C 2016-07-21 06:18:06.000000000 +0000
+@@ -9,10 +9,10 @@
+ template<typename T> constexpr fool p2() { return {}; }
+
+ template<typename T>
+- concept bool C() { return p1<T>() && p2<T>(); } // { dg-error "does not have type" }
++ concept bool C() { return p1<T>() && p2<T>(); }
+
+ template<C T> void f(T x) { }
+
+ int main() {
+- f(0); // { dg-error "cannot call" }
++ f(0); // { dg-error "cannot call|uses overloaded operator" }
+ }
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/concepts/req6.C gcc-6-20160721/gcc/testsuite/g++.dg/concepts/req6.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/concepts/req6.C 2016-03-08 22:30:44.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/concepts/req6.C 2016-07-21 06:18:06.000000000 +0000
+@@ -7,7 +7,12 @@
+ concept bool C1() { return X(); }
+
+ template<C1 T>
+- void h(T) { } // { dg-error "not|bool" }
++ void h(T) { } // OK until used.
++
++void f()
++{
++ h(0); // { dg-error "does not have|cannot call" }
++}
+
+ template<typename T>
+ concept bool C2() { return X() == X(); } // OK
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/concepts/var-templ1.C gcc-6-20160721/gcc/testsuite/g++.dg/concepts/var-templ1.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/concepts/var-templ1.C 2016-03-08 22:30:44.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/concepts/var-templ1.C 2016-07-21 06:18:06.000000000 +0000
+@@ -13,4 +13,4 @@
+ constexpr bool f() { return false; }
+
+ static_assert(f<void>());
+-static_assert(v<void>); // { dg-error "constraints" }
++static_assert(v<void>); // { dg-error "invalid" }
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/concepts/variadic2.C gcc-6-20160721/gcc/testsuite/g++.dg/concepts/variadic2.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/concepts/variadic2.C 2016-03-08 22:30:44.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/concepts/variadic2.C 2016-07-21 06:18:06.000000000 +0000
+@@ -4,10 +4,13 @@
+ template <class T> concept bool Constructable = requires { T(); };
+ template <class T> concept bool Both = Copyable<T> && Constructable<T>;
+
+-template <Copyable... Ts> void f(Ts...) { }
+-template <Both... Ts> void f(Ts...) { }
++template <Copyable... Ts>
++constexpr int f(Ts...) { return 0; } // #1
++
++template <Both... Ts>
++constexpr int f(Ts...) { return 1; } // #2
+
+ int main()
+ {
+- f(42);
++ static_assert(f(42) == 1);
+ }
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/conversion/ambig3.C gcc-6-20160721/gcc/testsuite/g++.dg/conversion/ambig3.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/conversion/ambig3.C 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/conversion/ambig3.C 2016-07-19 08:46:26.000000000 +0000
+@@ -0,0 +1,13 @@
++// PR c++/71835
++// { dg-do compile }
++
++typedef void T (int);
++struct A { operator T * (); }; // { dg-message "candidate" }
++struct B { operator T * (); }; // { dg-message "candidate" }
++struct C : A, B {} c;
++
++void
++foo ()
++{
++ c (0); // { dg-error "is ambiguous" }
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/cpp0x/Wunused-variable-1.C gcc-6-20160721/gcc/testsuite/g++.dg/cpp0x/Wunused-variable-1.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/cpp0x/Wunused-variable-1.C 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/cpp0x/Wunused-variable-1.C 2016-06-08 18:00:30.000000000 +0000
+@@ -0,0 +1,37 @@
++// PR c++/71442
++// { dg-do compile { target c++11 } }
++// { dg-options "-Wunused-variable" }
++
++struct C
++{
++ template<typename... Ts>
++ int operator()(Ts &&...)
++ {
++ return sizeof...(Ts);
++ }
++};
++
++int
++foo ()
++{
++ C {} (1, 1L, 1LL, 1.0);
++}
++
++template<int N>
++void
++bar ()
++{
++ char a; // { dg-warning "unused variable" }
++ short b; // { dg-warning "unused variable" }
++ int c; // { dg-warning "unused variable" }
++ long d; // { dg-warning "unused variable" }
++ long long e; // { dg-warning "unused variable" }
++ float f; // { dg-warning "unused variable" }
++ double g; // { dg-warning "unused variable" }
++}
++
++void
++baz ()
++{
++ bar <0> ();
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/cpp0x/alias-decl-55.C gcc-6-20160721/gcc/testsuite/g++.dg/cpp0x/alias-decl-55.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/cpp0x/alias-decl-55.C 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/cpp0x/alias-decl-55.C 2016-07-21 06:14:57.000000000 +0000
+@@ -0,0 +1,23 @@
++// PR c++/71718
++// { dg-do compile { target c++11 } }
++
++template <typename T>
++class A : T{};
++
++template <typename T>
++using sp = A<T>;
++
++struct Base {};
++
++template <typename T, int num = 1>
++const sp<T>
++rec() // { dg-error "depth" }
++{
++ return rec<T, num - 1>();
++}
++
++static void f(void) {
++ rec<Base>();
++}
++
++// { dg-prune-output "compilation terminated" }
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/cpp0x/alignas7.C gcc-6-20160721/gcc/testsuite/g++.dg/cpp0x/alignas7.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/cpp0x/alignas7.C 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/cpp0x/alignas7.C 2016-07-21 06:15:51.000000000 +0000
+@@ -0,0 +1,13 @@
++// PR c++/71513
++// { dg-do compile { target c++11 } }
++
++template < int N, typename T >
++struct A
++{
++ enum alignas (N) E : T;
++};
++
++#define SA(X) static_assert((X), #X)
++
++constexpr int al = alignof(double);
++SA(alignof(A<al,char>::E) == al);
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/cpp0x/auto48.C gcc-6-20160721/gcc/testsuite/g++.dg/cpp0x/auto48.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/cpp0x/auto48.C 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/cpp0x/auto48.C 2016-04-28 09:58:45.000000000 +0000
+@@ -0,0 +1,8 @@
++// PR c++/70540
++// { dg-do compile { target c++11 } }
++
++void
++foo ()
++{
++ auto f = [&] { return f; }; // { dg-error "before deduction" }
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/cpp0x/constexpr-71828.C gcc-6-20160721/gcc/testsuite/g++.dg/cpp0x/constexpr-71828.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/cpp0x/constexpr-71828.C 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/cpp0x/constexpr-71828.C 2016-07-19 08:44:04.000000000 +0000
+@@ -0,0 +1,5 @@
++// PR c++/71828
++// { dg-do compile { target c++11 } }
++
++constexpr _Complex int a { 1, 2 };
++static_assert (& __imag a != &__real a, "");
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/cpp0x/constexpr-array16.C gcc-6-20160721/gcc/testsuite/g++.dg/cpp0x/constexpr-array16.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/cpp0x/constexpr-array16.C 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/cpp0x/constexpr-array16.C 2016-05-31 21:36:46.000000000 +0000
+@@ -0,0 +1,23 @@
++// PR c++/71166
++// { dg-do compile { target c++11 } }
++
++struct Foo { int value; };
++
++constexpr Foo MakeFoo() { return Foo{0}; }
++
++struct Bar {
++ Foo color = MakeFoo();
++};
++
++struct BarContainer {
++ Bar array[1];
++};
++
++Foo X ()
++{
++ return MakeFoo ();
++}
++
++void Foo() {
++ new BarContainer();
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/cpp0x/constexpr-array17.C gcc-6-20160721/gcc/testsuite/g++.dg/cpp0x/constexpr-array17.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/cpp0x/constexpr-array17.C 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/cpp0x/constexpr-array17.C 2016-07-21 06:16:17.000000000 +0000
+@@ -0,0 +1,61 @@
++// PR c++/71092
++// { dg-do compile { target c++11 } }
++
++template <typename _Default> struct A { using type = _Default; };
++template <typename _Default, template <typename> class>
++using __detected_or = A<_Default>;
++template <typename _Default, template <typename> class _Op>
++using __detected_or_t = typename __detected_or<_Default, _Op>::type;
++template <typename _Tp> struct B { typedef _Tp value_type; };
++struct C {
++ template <typename _Tp> using __pointer = typename _Tp::pointer;
++};
++template <typename _Alloc> struct J : C {
++ using pointer = __detected_or_t<typename _Alloc::value_type *, __pointer>;
++};
++template <typename _T1> void _Construct(_T1 *) { new _T1; }
++struct D {
++ template <typename _ForwardIterator, typename _Size>
++ static _ForwardIterator __uninit_default_n(_ForwardIterator p1, _Size) {
++ _Construct(p1);
++ }
++};
++template <typename _ForwardIterator, typename _Size>
++void __uninitialized_default_n(_ForwardIterator p1, _Size) {
++ D::__uninit_default_n(p1, 0);
++}
++template <typename _ForwardIterator, typename _Size, typename _Tp>
++void __uninitialized_default_n_a(_ForwardIterator p1, _Size, _Tp) {
++ __uninitialized_default_n(p1, 0);
++}
++template <typename> struct __shared_ptr {
++ constexpr __shared_ptr() : _M_ptr(), _M_refcount() {}
++ int _M_ptr;
++ int _M_refcount;
++};
++template <typename _Alloc> struct F {
++ typedef _Alloc _Tp_alloc_type;
++ struct G {
++ typename J<_Tp_alloc_type>::pointer _M_start;
++ G(_Tp_alloc_type);
++ };
++ F(int, _Alloc p2) : _M_impl(p2) {}
++ G _M_impl;
++};
++template <typename _Tp, typename _Alloc = B<_Tp>> struct K : F<_Alloc> {
++ typedef _Alloc allocator_type;
++ K(int, allocator_type p2 = allocator_type()) : F<_Alloc>(0, p2) {
++ __uninitialized_default_n_a(this->_M_impl._M_start, 0, 0);
++ }
++};
++struct H {
++ H();
++ struct I {
++ __shared_ptr<int> trigger[1];
++ };
++ __shared_ptr<int> resetTrigger_;
++ K<I> states_;
++ __shared_ptr<int> triggerManager_;
++};
++__shared_ptr<int> a;
++H::H() : states_(0), triggerManager_(a) {}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/cpp0x/constexpr-ptrmem6.C gcc-6-20160721/gcc/testsuite/g++.dg/cpp0x/constexpr-ptrmem6.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/cpp0x/constexpr-ptrmem6.C 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/cpp0x/constexpr-ptrmem6.C 2016-07-21 06:16:24.000000000 +0000
+@@ -0,0 +1,13 @@
++// PR c++/71896
++// { dg-do compile { target c++11 } }
++
++struct Foo {
++ int x;
++};
++
++constexpr bool compare(int Foo::*t) { return t == &Foo::x; }
++
++constexpr bool b = compare(&Foo::x);
++
++#define SA(X) static_assert ((X),#X)
++SA(b);
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/cpp0x/constexpr-recursion2.C gcc-6-20160721/gcc/testsuite/g++.dg/cpp0x/constexpr-recursion2.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/cpp0x/constexpr-recursion2.C 2016-03-23 18:23:04.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/cpp0x/constexpr-recursion2.C 2016-05-24 03:37:10.000000000 +0000
+@@ -1,5 +1,6 @@
+ // PR c++/70344
+ // { dg-do compile { target c++11 } }
++// { dg-options -O }
+
+ struct Z
+ {
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/cpp0x/conv-tmpl1.C gcc-6-20160721/gcc/testsuite/g++.dg/cpp0x/conv-tmpl1.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/cpp0x/conv-tmpl1.C 2015-10-23 00:51:14.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/cpp0x/conv-tmpl1.C 2016-07-21 06:16:11.000000000 +0000
+@@ -1,3 +1,4 @@
++// Test for Core 2189.
+ // { dg-do compile { target c++11 } }
+
+ template <class T>
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/cpp0x/decltype65.C gcc-6-20160721/gcc/testsuite/g++.dg/cpp0x/decltype65.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/cpp0x/decltype65.C 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/cpp0x/decltype65.C 2016-07-21 06:15:58.000000000 +0000
+@@ -0,0 +1,11 @@
++// PR c++/71511
++// { dg-do compile { target c++11 } }
++
++template < typename T >
++class A
++{
++ static int i;
++};
++
++//okay: template < typename T > int A <T>::i = 100;
++template < typename T > int decltype (A < T > ())::i = 100; // { dg-error "decltype" }
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/cpp0x/inh-ctor20.C gcc-6-20160721/gcc/testsuite/g++.dg/cpp0x/inh-ctor20.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/cpp0x/inh-ctor20.C 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/cpp0x/inh-ctor20.C 2016-06-02 11:30:44.000000000 +0000
+@@ -0,0 +1,16 @@
++// PR c++/70972
++// { dg-do compile { target c++11 } }
++
++struct moveonly {
++ moveonly(moveonly&&) = default;
++ moveonly() = default;
++};
++
++struct A {
++ A(moveonly) {}
++};
++struct B : A {
++ using A::A;
++};
++
++B b(moveonly{});
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/cpp0x/inh-ctor21.C gcc-6-20160721/gcc/testsuite/g++.dg/cpp0x/inh-ctor21.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/cpp0x/inh-ctor21.C 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/cpp0x/inh-ctor21.C 2016-06-02 11:30:44.000000000 +0000
+@@ -0,0 +1,19 @@
++// PR c++/70972
++// { dg-do run { target c++11 } }
++
++struct abort_on_copy{
++ abort_on_copy(abort_on_copy&&) = default;
++ abort_on_copy(const abort_on_copy&) { __builtin_abort(); }
++ abort_on_copy() = default;
++};
++
++struct A {
++ A(abort_on_copy) {}
++};
++struct B : A {
++ using A::A;
++};
++
++int main() {
++ B b(abort_on_copy{});
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/cpp0x/initlist-template1.C gcc-6-20160721/gcc/testsuite/g++.dg/cpp0x/initlist-template1.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/cpp0x/initlist-template1.C 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/cpp0x/initlist-template1.C 2016-07-21 06:14:51.000000000 +0000
+@@ -0,0 +1,15 @@
++// PR c++/70824
++// { dg-do compile { target c++11 } }
++
++#include <initializer_list>
++
++constexpr
++int
++max(std::initializer_list<int> __l)
++{ return *__l.begin(); }
++
++template <class Src>
++void
++a() {
++ const int v = max({1});
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv11.C gcc-6-20160721/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv11.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv11.C 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv11.C 2016-05-29 08:27:07.000000000 +0000
+@@ -0,0 +1,10 @@
++// PR c++/71105
++// { dg-do compile { target c++11 } }
++
++void foo()
++{
++ int i;
++ static_cast<void(*)()>([i]{}); // { dg-error "invalid static_cast" }
++ static_cast<void(*)()>([=]{}); // { dg-error "invalid static_cast" }
++ static_cast<void(*)()>([&]{}); // { dg-error "invalid static_cast" }
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice16.C gcc-6-20160721/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice16.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice16.C 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice16.C 2016-07-21 06:16:30.000000000 +0000
+@@ -0,0 +1,8 @@
++// PR c++/70781
++// { dg-do compile { target c++11 } }
++
++template < typename T >
++void foo ()
++{
++ T ([=] (S) { [=] {}; }); // { dg-error "" }
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/cpp0x/pr70869.C gcc-6-20160721/gcc/testsuite/g++.dg/cpp0x/pr70869.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/cpp0x/pr70869.C 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/cpp0x/pr70869.C 2016-07-19 08:39:12.000000000 +0000
+@@ -0,0 +1,25 @@
++// PR c++/70869
++// { dg-do run { target c++11 } }
++
++#include <initializer_list>
++
++struct A
++{
++ int f () { return 1; }
++ int g () { return 2; }
++ int h () { return 3; }
++};
++
++int
++main ()
++{
++ int cnt = 0;
++ for (const auto &m : { &A::f, &A::g, &A::h })
++ {
++ A a;
++ if ((a.*m) () != ++cnt)
++ __builtin_abort ();
++ }
++ if (cnt != 3)
++ __builtin_abort ();
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/cpp0x/pr71054.C gcc-6-20160721/gcc/testsuite/g++.dg/cpp0x/pr71054.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/cpp0x/pr71054.C 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/cpp0x/pr71054.C 2016-07-19 08:39:12.000000000 +0000
+@@ -0,0 +1,21 @@
++// PR c++/71054
++// { dg-do compile { target c++11 } }
++
++#include <initializer_list>
++
++template <typename D, typename T = decltype (&D::U)>
++struct S
++{
++ struct A
++ {
++ int a;
++ int b;
++ T p;
++ };
++ S () { std::initializer_list<A> a{ {0, 0, &D::V} }; }
++};
++struct R {
++ void V (int);
++ void U (int);
++};
++S<R> b;
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/cpp0x/pr71739.C gcc-6-20160721/gcc/testsuite/g++.dg/cpp0x/pr71739.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/cpp0x/pr71739.C 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/cpp0x/pr71739.C 2016-07-04 17:33:50.000000000 +0000
+@@ -0,0 +1,5 @@
++// PR c++/71739
++// { dg-do compile { target c++11 } }
++
++template <int N> struct alignas(N) A;
++template <int N> struct alignas(N) A {};
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/cpp0x/range-for31.C gcc-6-20160721/gcc/testsuite/g++.dg/cpp0x/range-for31.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/cpp0x/range-for31.C 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/cpp0x/range-for31.C 2016-07-21 06:15:43.000000000 +0000
+@@ -0,0 +1,9 @@
++// PR c++/71604
++// { dg-do compile { target c++11 } }
++
++void foo ()
++{
++ int a[2] = { 1, 2 };
++ for (struct S { S (int) {} } S : a) // { dg-error "types may not be defined" }
++ ;
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/cpp0x/range-for8.C gcc-6-20160721/gcc/testsuite/g++.dg/cpp0x/range-for8.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/cpp0x/range-for8.C 2014-03-07 20:01:12.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/cpp0x/range-for8.C 2016-07-21 06:15:43.000000000 +0000
+@@ -7,9 +7,9 @@
+
+ void test()
+ {
+- for (struct S { } *x : { (S*)0, (S*)0 } )
++ for (struct S { } *x : { (S*)0, (S*)0 } ) // { dg-error "types may not be defined" }
+ ;
+
+- for (struct S { } x : { S(), S() } )
++ for (struct S { } x : { S(), S() } ) // { dg-error "types may not be defined" }
+ ;
+ }
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/cpp0x/sfinae57.C gcc-6-20160721/gcc/testsuite/g++.dg/cpp0x/sfinae57.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/cpp0x/sfinae57.C 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/cpp0x/sfinae57.C 2016-07-21 06:16:04.000000000 +0000
+@@ -0,0 +1,16 @@
++// PR c++/71495
++// { dg-do compile { target c++11 } }
++
++struct A;
++template <class T> void f(T); // { dg-bogus "initializing" }
++template <class T> T&& declval();
++struct B
++{
++ template <class T, class U> static decltype(f<T>(declval<U>())) g(int);
++ template <class T, class U> void g(...);
++} b;
++
++int main()
++{
++ b.g<A,A>(42);
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/cpp0x/variadic-mangle1a.C gcc-6-20160721/gcc/testsuite/g++.dg/cpp0x/variadic-mangle1a.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/cpp0x/variadic-mangle1a.C 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/cpp0x/variadic-mangle1a.C 2016-07-21 06:15:04.000000000 +0000
+@@ -0,0 +1,12 @@
++// Test for sZ mangling.
++// { dg-do compile { target c++11 } }
++// { dg-final { scan-assembler "_Z1fIJidEEv1AIXstDpT_EE" } }
++// { dg-options -fabi-version=9 }
++
++template <int I> struct A { };
++template <typename... Ts> void f(A<sizeof...(Ts)>);
++
++int main()
++{
++ f<int,double>(A<2>());
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/cpp0x/variadic-mangle2a.C gcc-6-20160721/gcc/testsuite/g++.dg/cpp0x/variadic-mangle2a.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/cpp0x/variadic-mangle2a.C 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/cpp0x/variadic-mangle2a.C 2016-07-21 06:15:04.000000000 +0000
+@@ -0,0 +1,19 @@
++// Testcase from cxx-abi-dev.
++// { dg-do compile { target c++11 } }
++// { dg-options "-fabi-version=9" }
++
++struct A {
++ template<int...T> using N = int[sizeof...(T)];
++ template<int...A> void f(N<A...> &);
++
++ template<typename...T> using M = int[sizeof...(T)];
++ template<typename...A> void g(M<A...> &);
++};
++void g(A a)
++{
++ int arr[3];
++ // { dg-final { scan-assembler "_ZN1A1fIJLi1ELi2ELi3EEEEvRAszspT__i" } }
++ a.f<1,2,3>(arr);
++ // { dg-final { scan-assembler "_ZN1A1gIJiiiEEEvRAstDpT__i" } }
++ a.g<int,int,int>(arr);
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/cpp0x/variadic-mangle3.C gcc-6-20160721/gcc/testsuite/g++.dg/cpp0x/variadic-mangle3.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/cpp0x/variadic-mangle3.C 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/cpp0x/variadic-mangle3.C 2016-07-21 06:15:04.000000000 +0000
+@@ -0,0 +1,10 @@
++// Testcase from cxx-abi-dev.
++// { dg-do compile { target c++11 } }
++// { dg-final { scan-assembler "_ZN1A1fIJiiEiJiiiEEEvRAsPDpT_T0_DpT1_E_iS3_S5_" } }
++
++struct A {
++ template<typename...T> using N = int[sizeof...(T)];
++ template<typename...A, typename B, typename...C>
++ void f(N<A..., B, C...> &, B, C...);
++};
++void g(A a) { int arr[6]; a.f<int, int>(arr, 1, 2, 3, 4); }
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/cpp0x/variadic-mangle3a.C gcc-6-20160721/gcc/testsuite/g++.dg/cpp0x/variadic-mangle3a.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/cpp0x/variadic-mangle3a.C 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/cpp0x/variadic-mangle3a.C 2016-07-21 06:15:04.000000000 +0000
+@@ -0,0 +1,11 @@
++// Testcase from cxx-abi-dev.
++// { dg-do compile { target c++11 } }
++// { dg-options -fabi-version=9 }
++// { dg-final { scan-assembler "_ZN1A1fIJiiEiJiiiEEEvRAstDpT1__iT0_S2_" } }
++
++struct A {
++ template<typename...T> using N = int[sizeof...(T)];
++ template<typename...A, typename B, typename...C>
++ void f(N<A..., B, C...> &, B, C...);
++};
++void g(A a) { int arr[6]; a.f<int, int>(arr, 1, 2, 3, 4); }
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/cpp1y/auto-fn31.C gcc-6-20160721/gcc/testsuite/g++.dg/cpp1y/auto-fn31.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/cpp1y/auto-fn31.C 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/cpp1y/auto-fn31.C 2016-06-14 20:55:08.000000000 +0000
+@@ -0,0 +1,7 @@
++// PR c++/70572
++// { dg-do compile { target c++14 } }
++
++void foo ()
++{
++ decltype (auto) a = foo; // { dg-error "initializer" }
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/cpp1y/auto-fn32.C gcc-6-20160721/gcc/testsuite/g++.dg/cpp1y/auto-fn32.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/cpp1y/auto-fn32.C 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/cpp1y/auto-fn32.C 2016-07-21 06:29:32.000000000 +0000
+@@ -0,0 +1,33 @@
++// { dg-do compile { target c++14 } }
++
++template<class,class> struct same_type;
++template<class T> struct same_type<T,T> {};
++
++struct A
++{
++ static int b;
++ int c;
++
++ template <int>
++ decltype(auto) f() { return A::c; }
++
++ template <int>
++ decltype(auto) g() { return (A::c); }
++};
++
++A a;
++
++template <int>
++decltype(auto) f() { return A::b; }
++
++template <int>
++decltype(auto) g() { return (A::b); }
++
++int main()
++{
++ same_type<decltype(f<0>()), int>();
++ same_type<decltype(g<0>()), int&>();
++
++ same_type<decltype(a.f<0>()), int>();
++ same_type<decltype(a.g<0>()), int&>();
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/cpp1y/feat-cxx11.C gcc-6-20160721/gcc/testsuite/g++.dg/cpp1y/feat-cxx11.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/cpp1y/feat-cxx11.C 2016-03-28 17:22:49.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/cpp1y/feat-cxx11.C 2016-07-05 17:55:36.000000000 +0000
+@@ -77,10 +77,10 @@
+ # error "__cpp_attributes != 200809"
+ #endif
+
+-#ifndef __cpp_rvalue_reference
+-# error "__cpp_rvalue_reference"
+-#elif __cpp_rvalue_reference != 200610
+-# error "__cpp_rvalue_reference != 200610"
++#ifndef __cpp_rvalue_references
++# error "__cpp_rvalue_references"
++#elif __cpp_rvalue_references != 200610
++# error "__cpp_rvalue_references != 200610"
+ #endif
+
+ #ifndef __cpp_variadic_templates
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/cpp1y/feat-cxx14.C gcc-6-20160721/gcc/testsuite/g++.dg/cpp1y/feat-cxx14.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/cpp1y/feat-cxx14.C 2016-03-28 17:22:49.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/cpp1y/feat-cxx14.C 2016-07-05 17:55:36.000000000 +0000
+@@ -70,10 +70,10 @@
+ # error "__cpp_attributes != 200809"
+ #endif
+
+-#ifndef __cpp_rvalue_reference
+-# error "__cpp_rvalue_reference"
+-#elif __cpp_rvalue_reference != 200610
+-# error "__cpp_rvalue_reference != 200610"
++#ifndef __cpp_rvalue_references
++# error "__cpp_rvalue_references"
++#elif __cpp_rvalue_references != 200610
++# error "__cpp_rvalue_references != 200610"
+ #endif
+
+ #ifndef __cpp_variadic_templates
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/cpp1y/feat-cxx98-neg.C gcc-6-20160721/gcc/testsuite/g++.dg/cpp1y/feat-cxx98-neg.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/cpp1y/feat-cxx98-neg.C 2015-09-21 15:50:30.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/cpp1y/feat-cxx98-neg.C 2016-07-05 17:55:36.000000000 +0000
+@@ -42,8 +42,8 @@
+ # error "__cpp_attributes" // { dg-error "error" }
+ #endif
+
+-#ifndef __cpp_rvalue_reference
+-# error "__cpp_rvalue_reference" // { dg-error "error" }
++#ifndef __cpp_rvalue_references
++# error "__cpp_rvalue_references" // { dg-error "error" }
+ #endif
+
+ #ifndef __cpp_variadic_templates
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/cpp1y/lambda-conv1.C gcc-6-20160721/gcc/testsuite/g++.dg/cpp1y/lambda-conv1.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/cpp1y/lambda-conv1.C 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/cpp1y/lambda-conv1.C 2016-05-29 08:27:07.000000000 +0000
+@@ -0,0 +1,13 @@
++// PR c++/71105
++// { dg-do compile { target c++14 } }
++
++void foo()
++{
++ int i;
++ static_cast<void(*)(int)>([i](auto){}); // { dg-error "invalid static_cast" }
++ static_cast<void(*)(int)>([=](auto){}); // { dg-error "invalid static_cast" }
++ static_cast<void(*)(int)>([&](auto){}); // { dg-error "invalid static_cast" }
++ static_cast<float(*)(float)>([i](auto x){ return x; }); // { dg-error "invalid static_cast" }
++ static_cast<float(*)(float)>([=](auto x){ return x; }); // { dg-error "invalid static_cast" }
++ static_cast<float(*)(float)>([&](auto x){ return x; }); // { dg-error "invalid static_cast" }
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/cpp1y/lambda-conv2.C gcc-6-20160721/gcc/testsuite/g++.dg/cpp1y/lambda-conv2.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/cpp1y/lambda-conv2.C 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/cpp1y/lambda-conv2.C 2016-05-29 08:27:07.000000000 +0000
+@@ -0,0 +1,23 @@
++// PR c++/71105
++// { dg-do compile { target c++14 } }
++
++template <typename T> T declval();
++template <typename, typename> struct is_same
++{ static constexpr bool value = false; };
++template <typename T> struct is_same<T, T>
++{ static constexpr bool value = true; };
++
++template <class F>
++struct indirected : F {
++ indirected(F f) : F(f) {}
++ template <class I>
++ auto operator()(I i) -> decltype(declval<F&>()(*i)) {
++ return static_cast<F&>(*this)(*i);
++ }
++};
++
++int main() {
++ auto f = [=](auto i) { return i + i; };
++ auto i = indirected<decltype(f)>{f};
++ static_assert(is_same<decltype(i(declval<int*>())), int>::value, "");
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/cpp1y/lambda-generic-conv2.C gcc-6-20160721/gcc/testsuite/g++.dg/cpp1y/lambda-generic-conv2.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/cpp1y/lambda-generic-conv2.C 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/cpp1y/lambda-generic-conv2.C 2016-07-21 06:16:11.000000000 +0000
+@@ -0,0 +1,26 @@
++// PR c++/71117
++// { dg-do compile { target c++14 } }
++
++template <class T> T&& declval() noexcept;
++template <class, class>
++constexpr bool is_same = false;
++template <class T>
++constexpr bool is_same<T, T> = true;
++
++template <class F>
++struct indirected : F {
++ indirected(F f) : F(f) {}
++ template <class I>
++ auto operator()(I i) -> decltype(declval<F&>()(*i)) {
++ return static_cast<F&>(*this)(*i);
++ }
++};
++
++int main() {
++ auto f = [](auto rng) {
++ static_assert(is_same<decltype(rng), int>, "");
++ return 42;
++ };
++ indirected<decltype(f)> i(f);
++ static_assert(is_same<decltype(i(declval<int*>())), int>, "");
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/cpp1y/lambda-generic-conv3.C gcc-6-20160721/gcc/testsuite/g++.dg/cpp1y/lambda-generic-conv3.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/cpp1y/lambda-generic-conv3.C 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/cpp1y/lambda-generic-conv3.C 2016-07-21 06:16:11.000000000 +0000
+@@ -0,0 +1,10 @@
++// PR c++/70942
++// { dg-do compile { target c++14 } }
++
++int main()
++{
++ int x = 0;
++ [](auto&& xv){
++ static_cast<decltype(xv)>(xv) = 1;
++ }(x);
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/cpp1y/lambda-generic-static1.C gcc-6-20160721/gcc/testsuite/g++.dg/cpp1y/lambda-generic-static1.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/cpp1y/lambda-generic-static1.C 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/cpp1y/lambda-generic-static1.C 2016-06-02 09:49:43.000000000 +0000
+@@ -0,0 +1,13 @@
++// PR c++/70735
++// { dg-do run { target c++14 } }
++
++int main()
++{
++ static int a;
++ auto f = [](auto) { return a; };
++ if (f(0) != 0)
++ __builtin_abort();
++ a = 1;
++ if (f(0) != 1)
++ __builtin_abort();
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/cpp1y/lambda-generic-static2.C gcc-6-20160721/gcc/testsuite/g++.dg/cpp1y/lambda-generic-static2.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/cpp1y/lambda-generic-static2.C 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/cpp1y/lambda-generic-static2.C 2016-06-02 09:49:43.000000000 +0000
+@@ -0,0 +1,19 @@
++// PR c++/70735
++// { dg-do run { target c++14 } }
++
++template <class T>
++static void g()
++{
++ static int a;
++ auto f = [](auto) { return a; };
++ if (f(0) != 0)
++ __builtin_abort();
++ a = 1;
++ if (f(0) != 1)
++ __builtin_abort();
++}
++
++int main()
++{
++ g<int>();
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/cpp1y/paren4.C gcc-6-20160721/gcc/testsuite/g++.dg/cpp1y/paren4.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/cpp1y/paren4.C 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/cpp1y/paren4.C 2016-07-21 06:29:32.000000000 +0000
+@@ -0,0 +1,14 @@
++// PR c++/70822
++// { dg-do compile { target c++14 } }
++
++struct a
++{
++ static int b;
++};
++
++template <typename>
++void
++foo ()
++{
++ &(a::b);
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/cpp1y/var-templ39.C gcc-6-20160721/gcc/testsuite/g++.dg/cpp1y/var-templ39.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/cpp1y/var-templ39.C 2015-08-05 17:56:14.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/cpp1y/var-templ39.C 2016-05-31 21:36:34.000000000 +0000
+@@ -1,5 +1,5 @@
+ // PR c++/66260
+-// { dg-do compile { target c++14 } }
++// { dg-do assemble { target c++14 } }
+
+ template <class>
+ constexpr bool foo = false;
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/cpp1y/var-templ39a.C gcc-6-20160721/gcc/testsuite/g++.dg/cpp1y/var-templ39a.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/cpp1y/var-templ39a.C 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/cpp1y/var-templ39a.C 2016-05-31 21:36:34.000000000 +0000
+@@ -0,0 +1,27 @@
++// PR c++/66260
++// { dg-do compile { target c++14 } }
++
++template <class>
++bool foo = false;
++template <>
++bool foo<int> = true;
++template <class T, int N>
++bool foo<T[N]> = foo<T>;
++
++#define assert(X) if (!(X)) __builtin_abort();
++
++int main()
++{
++ // { dg-final { scan-assembler "_Z3fooIiE" } }
++ assert(foo<int>);
++ // { dg-final { scan-assembler "_Z3fooIdE" } }
++ assert(!foo<double>);
++ // { dg-final { scan-assembler "_Z3fooIA3_iE" } }
++ assert(foo<int[3]>);
++ // { dg-final { scan-assembler "_Z3fooIA3_dE" } }
++ assert(!foo<double[3]>);
++ // { dg-final { scan-assembler "_Z3fooIA2_A5_A3_iE" } }
++ assert(foo<int[2][5][3]>);
++ // { dg-final { scan-assembler "_Z3fooIA2_A5_A3_dE" } }
++ assert(!foo<double[2][5][3]>);
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/cpp1y/var-templ51.C gcc-6-20160721/gcc/testsuite/g++.dg/cpp1y/var-templ51.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/cpp1y/var-templ51.C 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/cpp1y/var-templ51.C 2016-05-31 21:36:34.000000000 +0000
+@@ -0,0 +1,11 @@
++// PR c++/60095
++// { dg-do link { target c++14 } }
++
++template <class>
++constexpr bool b = false;
++template<typename T>
++constexpr bool b<T*> = true;
++int main() {
++ b<int*>;
++ b<double*>;
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/cpp1y/var-templ52.C gcc-6-20160721/gcc/testsuite/g++.dg/cpp1y/var-templ52.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/cpp1y/var-templ52.C 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/cpp1y/var-templ52.C 2016-05-31 21:36:34.000000000 +0000
+@@ -0,0 +1,14 @@
++// PR c++/69515
++// { dg-do link { target c++14 } }
++
++struct A { A(int = 0) {} };
++
++template<class...> class meow;
++
++template<typename T> A foo;
++template<typename... Ts> A foo<meow<Ts...>> = 1;
++
++auto&& a = foo<meow<int>>;
++auto&& b = foo<meow<int, int>>;
++
++int main() {}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/cpp1z/feat-cxx1z.C gcc-6-20160721/gcc/testsuite/g++.dg/cpp1z/feat-cxx1z.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/cpp1z/feat-cxx1z.C 2016-03-28 17:22:49.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/cpp1z/feat-cxx1z.C 2016-07-05 17:55:36.000000000 +0000
+@@ -58,10 +58,10 @@
+ # error "__cpp_attributes != 200809"
+ #endif
+
+-#ifndef __cpp_rvalue_reference
+-# error "__cpp_rvalue_reference"
+-#elif __cpp_rvalue_reference != 200610
+-# error "__cpp_rvalue_reference != 200610"
++#ifndef __cpp_rvalue_references
++# error "__cpp_rvalue_references"
++#elif __cpp_rvalue_references != 200610
++# error "__cpp_rvalue_references != 200610"
+ #endif
+
+ #ifndef __cpp_variadic_templates
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/cpp1z/fold-mangle.C gcc-6-20160721/gcc/testsuite/g++.dg/cpp1z/fold-mangle.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/cpp1z/fold-mangle.C 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/cpp1z/fold-mangle.C 2016-07-21 06:15:23.000000000 +0000
+@@ -0,0 +1,20 @@
++// PR c++/71711
++// { dg-options -std=c++1z }
++
++template < int > struct A {};
++template < int ... N > void unary_left (A < (... + N) >);
++template < int ... N > void unary_right (A < (N + ...) >);
++template < int ... N > void binary_left (A < (42 + ... + N) >);
++template < int ... N > void binary_right (A < (N + ... + 42) >);
++
++void bar ()
++{
++ // { dg-final { scan-assembler "_Z10unary_leftIJLi1ELi2ELi3EEEv1AIXflplT_EE" } }
++ unary_left < 1, 2, 3 > ({});
++ // { dg-final { scan-assembler "_Z11unary_rightIJLi1ELi2ELi3EEEv1AIXfrplT_EE" } }
++ unary_right < 1, 2, 3 > ({});
++ // { dg-final { scan-assembler "_Z11binary_leftIJLi1ELi2ELi3EEEv1AIXfLplLi42ET_EE" } }
++ binary_left < 1, 2, 3 > ({});
++ // { dg-final { scan-assembler "_Z12binary_rightIJLi1ELi2ELi3EEEv1AIXfRplT_Li42EEE" } }
++ binary_right < 1, 2, 3 > ({});
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/debug/pr71057.C gcc-6-20160721/gcc/testsuite/g++.dg/debug/pr71057.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/debug/pr71057.C 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/debug/pr71057.C 2016-05-31 09:58:50.000000000 +0000
+@@ -0,0 +1,12 @@
++// { dg-do compile }
++// { dg-options "-g" }
++template <typename _Tp> using decay_t = _Tp;
++template <typename> struct A;
++template <typename> struct B { B(A<int>); };
++template <typename> struct C {
++ template <typename U> using constructor = B<decay_t<U>>;
++ typedef constructor<int> dummy;
++};
++template <typename> struct D {};
++C<int> a;
++D<B<int>> fn1() { fn1, a; }
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/ext/flexary16.C gcc-6-20160721/gcc/testsuite/g++.dg/ext/flexary16.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/ext/flexary16.C 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/ext/flexary16.C 2016-05-25 16:01:24.000000000 +0000
+@@ -0,0 +1,37 @@
++// PR c++/71147 - [6 Regression] Flexible array member wrongly rejected
++// in template
++// { dg-do compile }
++
++template <typename>
++struct container
++{
++ struct elem {
++ unsigned u;
++ };
++
++ struct incomplete {
++ int x;
++ elem array[];
++ };
++};
++
++unsigned f (container<void>::incomplete* i)
++{
++ return i->array [0].u;
++}
++
++
++template <typename T>
++struct D: container<T>
++{
++ struct S {
++ int x;
++ typename container<T>::elem array[];
++ };
++};
++
++
++unsigned g (D<void>::S *s)
++{
++ return s->array [0].u;
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/ext/vector31.C gcc-6-20160721/gcc/testsuite/g++.dg/ext/vector31.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/ext/vector31.C 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/ext/vector31.C 2016-07-19 08:40:37.000000000 +0000
+@@ -0,0 +1,29 @@
++// PR c++/71871
++// { dg-do compile }
++
++typedef unsigned int V __attribute__ ((__vector_size__ (32)));
++
++template <int N>
++void
++foo (V *x)
++{
++ V a = *x;
++ a = a ? a : -1;
++ *x = a;
++}
++
++template <typename T>
++void
++bar (T *x)
++{
++ T a = *x;
++ a = a ? a : -1;
++ *x = a;
++}
++
++void
++test (V *x, V *y)
++{
++ foo<0> (x);
++ bar<V> (y);
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/gomp/declare-simd-6.C gcc-6-20160721/gcc/testsuite/g++.dg/gomp/declare-simd-6.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/gomp/declare-simd-6.C 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/gomp/declare-simd-6.C 2016-05-24 16:27:12.000000000 +0000
+@@ -0,0 +1,37 @@
++// PR c++/71257
++// { dg-do compile }
++// { dg-options "-fopenmp-simd" }
++
++struct S { int a; };
++#pragma omp declare simd linear(val(a):2)
++int f1 (int &a);
++#pragma omp declare simd linear(uval(a):2)
++unsigned short f2 (unsigned short &a);
++#pragma omp declare simd linear(ref(a):1)
++int f3 (long long int &a);
++#pragma omp declare simd linear(a:1)
++int f4 (int &a);
++#pragma omp declare simd linear(val(a))
++int f5 (int a);
++#pragma omp declare simd linear(uval(a):2) // { dg-error "modifier applied to non-reference variable" }
++int f6 (unsigned short a);
++#pragma omp declare simd linear(ref(a):1) // { dg-error "modifier applied to non-reference variable" }
++int f7 (unsigned long int a);
++#pragma omp declare simd linear(a:1)
++int f8 (int a);
++#pragma omp declare simd linear(val(a):2) // { dg-error "applied to non-integral non-pointer variable" }
++int f9 (S &a);
++#pragma omp declare simd linear(uval(a):2) // { dg-error "applied to non-integral non-pointer variable" }
++int f10 (S &a);
++#pragma omp declare simd linear(ref(a):1) // { dg-bogus "applied to non-integral non-pointer variable" }
++int f11 (S &a);
++#pragma omp declare simd linear(a:1) // { dg-error "applied to non-integral non-pointer variable" }
++int f12 (S &a);
++#pragma omp declare simd linear(val(a)) // { dg-error "applied to non-integral non-pointer variable" }
++int f13 (S a);
++#pragma omp declare simd linear(uval(a):2) // { dg-error "modifier applied to non-reference variable" }
++int f14 (S a);
++#pragma omp declare simd linear(ref(a):1) // { dg-error "modifier applied to non-reference variable" }
++int f15 (S a);
++#pragma omp declare simd linear(a:1) // { dg-error "applied to non-integral non-pointer variable" }
++int f16 (S a);
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/gomp/pr71941.C gcc-6-20160721/gcc/testsuite/g++.dg/gomp/pr71941.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/gomp/pr71941.C 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/gomp/pr71941.C 2016-07-21 07:13:42.000000000 +0000
+@@ -0,0 +1,22 @@
++// PR c++/71941
++// { dg-do compile }
++// { dg-options "-fopenmp" }
++
++struct A { A (); A (A &); ~A (); };
++
++template <int N>
++struct B
++{
++ struct C { A a; C () : a () {} };
++ C c;
++ void foo ();
++};
++
++void
++bar ()
++{
++ B<0> b;
++#pragma omp task
++ for (int i = 0; i < 2; i++)
++ b.foo ();
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/init/pr71516.C gcc-6-20160721/gcc/testsuite/g++.dg/init/pr71516.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/init/pr71516.C 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/init/pr71516.C 2016-06-14 14:47:17.000000000 +0000
+@@ -0,0 +1,10 @@
++// PR c++/71516
++// { dg-do compile }
++
++struct A; // { dg-message "forward declaration of" }
++struct B
++{
++ static A a;
++};
++A B::a = A(); // { dg-error "has initializer but incomplete type|invalid use of incomplete type" }
++struct A {};
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/ipa/ipa-pta-2.C gcc-6-20160721/gcc/testsuite/g++.dg/ipa/ipa-pta-2.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/ipa/ipa-pta-2.C 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/ipa/ipa-pta-2.C 2016-05-13 13:22:42.000000000 +0000
+@@ -0,0 +1,37 @@
++// { dg-do run }
++// { dg-options "-O2 -fipa-pta" }
++
++extern "C" void abort (void);
++
++struct Y { ~Y(); int i; };
++
++Y::~Y () {}
++
++static Y __attribute__((noinline)) foo ()
++{
++ Y res;
++ res.i = 3;
++ return res;
++}
++
++static Y __attribute__((noinline)) bar ()
++{
++ Y res;
++ res.i = 42;
++ return res;
++}
++
++static Y (*fn) ();
++
++int a;
++int main()
++{
++ if (a)
++ fn = foo;
++ else
++ fn = bar;
++ Y res = fn ();
++ if (res.i != 42)
++ abort ();
++ return 0;
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/lookup/scoped10.C gcc-6-20160721/gcc/testsuite/g++.dg/lookup/scoped10.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/lookup/scoped10.C 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/lookup/scoped10.C 2016-05-31 21:36:28.000000000 +0000
+@@ -0,0 +1,5 @@
++namespace A { }
++namespace N { struct A; }
++using namespace N;
++
++struct ::A *p;
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/lookup/scoped9.C gcc-6-20160721/gcc/testsuite/g++.dg/lookup/scoped9.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/lookup/scoped9.C 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/lookup/scoped9.C 2016-05-31 21:36:28.000000000 +0000
+@@ -0,0 +1,10 @@
++// PR c++/71173
++
++namespace foo {
++ namespace bar {
++ class foo {};
++ }
++ class baz {};
++}
++using namespace foo::bar;
++::foo::baz mybaz;
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/opt/pr70847.C gcc-6-20160721/gcc/testsuite/g++.dg/opt/pr70847.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/opt/pr70847.C 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/opt/pr70847.C 2016-06-06 20:11:54.000000000 +0000
+@@ -0,0 +1,11 @@
++// PR c++/70847
++// { dg-do compile }
++
++struct D { virtual D& f(); };
++
++void
++g()
++{
++ D d;
++ d.f().f().f().f().f().f().f().f().f().f().f().f().f().f().f().f().f().f().f().f().f().f().f().f().f().f();
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/opt/pr71100.C gcc-6-20160721/gcc/testsuite/g++.dg/opt/pr71100.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/opt/pr71100.C 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/opt/pr71100.C 2016-05-18 21:24:16.000000000 +0000
+@@ -0,0 +1,18 @@
++// PR c++/71100
++// { dg-do compile }
++// { dg-options "-O2" }
++
++struct D { ~D (); };
++struct E { D foo () { throw 1; } };
++
++inline void
++bar (D (E::*f) (), E *o)
++{
++ (o->*f) ();
++}
++
++void
++baz (E *o)
++{
++ bar (&E::foo, o);
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/opt/pr71210-1.C gcc-6-20160721/gcc/testsuite/g++.dg/opt/pr71210-1.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/opt/pr71210-1.C 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/opt/pr71210-1.C 2016-05-20 19:06:09.000000000 +0000
+@@ -0,0 +1,14 @@
++// PR c++/71210
++// { dg-do compile }
++// { dg-options "-O2" }
++
++#include <typeinfo>
++
++void f1 (const std::type_info&) __attribute__((noreturn));
++struct S1 { ~S1 (); };
++struct S2
++{
++ virtual S1 f2 () const { f1 (typeid (*this)); }
++ S1 f3 () const { return f2 (); }
++};
++void f4 () { S2 a; a.f3 (); }
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/opt/pr71210-2.C gcc-6-20160721/gcc/testsuite/g++.dg/opt/pr71210-2.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/opt/pr71210-2.C 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/opt/pr71210-2.C 2016-05-20 19:06:09.000000000 +0000
+@@ -0,0 +1,23 @@
++// PR c++/71210
++// { dg-do compile }
++// { dg-options "-O2" }
++
++struct C { int a; int b; C (); ~C (); };
++
++namespace
++{
++ struct A
++ {
++ A () {}
++ virtual C bar (int) = 0;
++ C baz (int x) { return bar (x); }
++ };
++}
++
++A *a;
++
++void
++foo ()
++{
++ C c = a->baz (0);
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/opt/pr71387.C gcc-6-20160721/gcc/testsuite/g++.dg/opt/pr71387.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/opt/pr71387.C 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/opt/pr71387.C 2016-06-03 11:01:39.000000000 +0000
+@@ -0,0 +1,52 @@
++// PR middle-end/71387
++// { dg-do compile }
++// { dg-options "-Og" }
++
++struct A
++{
++ A ();
++ inline A (const A &);
++};
++
++struct B
++{
++ explicit B (unsigned long) : b(0), c(1) {}
++ A a;
++ unsigned long b;
++ int c;
++};
++
++struct C {};
++
++struct D
++{
++ explicit D (const C *) {}
++};
++
++struct E : public D
++{
++ E (const C *x) : D(x) {}
++ virtual A foo () const = 0;
++ virtual A bar () const = 0;
++};
++
++struct F : public B
++{
++ inline void baz ();
++ F (const E *);
++ const E *f;
++};
++
++inline void
++F::baz ()
++{
++ if (b == 0)
++ a = f->bar ();
++ else
++ a = f->foo ();
++}
++
++F::F (const E *) : B(4)
++{
++ baz ();
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/opt/pr71528.C gcc-6-20160721/gcc/testsuite/g++.dg/opt/pr71528.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/opt/pr71528.C 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/opt/pr71528.C 2016-06-21 07:02:59.000000000 +0000
+@@ -0,0 +1,23 @@
++// PR c++/71528
++// { dg-do run }
++// { dg-options "-O2" }
++
++extern int &x;
++int y;
++
++int &
++foo ()
++{
++ return y;
++}
++
++int &x = foo ();
++
++int
++main ()
++{
++ if (&x != &y)
++ __builtin_abort ();
++}
++
++extern int &x;
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/other/i386-10.C gcc-6-20160721/gcc/testsuite/g++.dg/other/i386-10.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/other/i386-10.C 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/other/i386-10.C 2016-05-31 21:36:22.000000000 +0000
+@@ -0,0 +1,12 @@
++// { dg-do compile { target i?86-*-* x86_64-*-* } }
++// { dg-options -maes }
++
++typedef long long __m128i __attribute__ ((__vector_size__ (16), __may_alias__));
++
++int main()
++{
++ const char index = 1;
++ __m128i r = { };
++
++ r = __builtin_ia32_aeskeygenassist128 (r, (int)(index));
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/other/pr71728.C gcc-6-20160721/gcc/testsuite/g++.dg/other/pr71728.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/other/pr71728.C 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/other/pr71728.C 2016-07-21 18:24:48.000000000 +0000
+@@ -0,0 +1,11 @@
++// PR c++/71728
++// { dg-do compile }
++// { dg-options "-std=gnu++14 -Wall" }
++
++int
++foo ()
++{
++ if (({ goto test; test: 1; }) != 1)
++ return 1;
++ return 2;
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/parse/pr71909.C gcc-6-20160721/gcc/testsuite/g++.dg/parse/pr71909.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/parse/pr71909.C 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/parse/pr71909.C 2016-07-20 14:05:00.000000000 +0000
+@@ -0,0 +1,22 @@
++// PR c++/71909
++// { dg-do compile }
++
++struct S
++{
++ S () try : m (0) {}
++ catch (...) {}
++ void foo () try {}
++ catch (int) {}
++ catch (...) {}
++ int m;
++};
++
++struct T
++{
++ T () : m (0) {}
++ catch (...) {} // { dg-error "expected unqualified-id before" }
++ void foo () {}
++ catch (int) {} // { dg-error "expected unqualified-id before" }
++ catch (...) {} // { dg-error "expected unqualified-id before" }
++ int m;
++};
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/pr70098.C gcc-6-20160721/gcc/testsuite/g++.dg/pr70098.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/pr70098.C 2016-03-14 14:18:44.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/pr70098.C 2016-07-15 20:58:23.000000000 +0000
+@@ -2,8 +2,6 @@
+ // { dg-do compile }
+ // { dg-options -O2 }
+ // { dg-require-effective-target c++11 }
+-// { dg-xfail-if "PR70098" { lp64 && powerpc64_no_dm } }
+-// { dg-prune-output ".*internal compiler error.*" }
+
+ template < typename > struct traits;
+ template < typename, int _Rows, int _Cols, int = 0, int = _Rows,
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/pr71184.C gcc-6-20160721/gcc/testsuite/g++.dg/pr71184.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/pr71184.C 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/pr71184.C 2016-05-19 18:56:47.000000000 +0000
+@@ -0,0 +1 @@
++operator new[ // { dg-error "expected type-specifier before 'new'" }
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/pr71389.C gcc-6-20160721/gcc/testsuite/g++.dg/pr71389.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/pr71389.C 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/pr71389.C 2016-06-07 15:16:44.000000000 +0000
+@@ -0,0 +1,23 @@
++// { dg-do compile { target i?86-*-* x86_64-*-* } }
++// { dg-options "-std=c++11 -O3 -march=ivybridge" }
++
++#include <functional>
++
++extern int le_s6, le_s9, le_s11;
++long foo_v14[16][16];
++
++void fn1() {
++ std::array<std::array<int, 16>, 16> v13;
++ for (; le_s6;)
++ for (int k1 = 2; k1 < 4; k1 = k1 + 1) {
++ for (int n1 = 0; n1 < le_s9; n1 = 8) {
++ *foo_v14[6] = 20923310;
++ for (int i2 = n1; i2 < n1 + 8; i2 = i2 + 1)
++ v13.at(5).at(i2 + 6 - n1) = 306146921;
++ }
++
++ for (int l2 = 0; l2 < le_s11; l2 = l2 + 1)
++ *(l2 + v13.at(5).begin()) = 306146921;
++ }
++ v13.at(le_s6 - 4);
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/pr71624.C gcc-6-20160721/gcc/testsuite/g++.dg/pr71624.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/pr71624.C 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/pr71624.C 2016-07-13 12:19:44.000000000 +0000
+@@ -0,0 +1,35 @@
++/* PR71624 */
++// { dg-do compile { target i?86-*-* x86_64-*-* } }
++/* { dg-options "-fcheck-pointer-bounds -mmpx -O2" } */
++
++class c1
++{
++public:
++ virtual int fn1 () const;
++ int fn2 (const int *) const;
++};
++
++class c2
++{
++ int fn1 ();
++ c1 obj;
++};
++
++int
++c1::fn1 () const
++{
++ return 0;
++}
++
++int
++c1::fn2 (const int *) const
++{
++ return this->fn1 ();
++}
++
++int
++c2::fn1 ()
++{
++ return obj.fn2 (0);
++}
++
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/template/defarg21.C gcc-6-20160721/gcc/testsuite/g++.dg/template/defarg21.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/template/defarg21.C 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/template/defarg21.C 2016-07-19 08:42:12.000000000 +0000
+@@ -0,0 +1,21 @@
++// PR c++/71822
++// { dg-do compile }
++
++int bar (int);
++
++template <typename T>
++struct A
++{
++ explicit A (int x = bar (sizeof (T)));
++};
++
++struct B
++{
++ A <int> b[2];
++};
++
++void
++baz ()
++{
++ B b;
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/template/friend62.C gcc-6-20160721/gcc/testsuite/g++.dg/template/friend62.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/template/friend62.C 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/template/friend62.C 2016-05-31 21:36:40.000000000 +0000
+@@ -0,0 +1,16 @@
++// PR c++/71227
++// { dg-options "" }
++
++class A {
++ public:
++ template<typename T>
++ friend int f(int x, T v) { // { dg-message "declaration" }
++ return x + v;
++ }
++};
++
++
++template<>
++int f(int x, int v) { // { dg-warning "friend" }
++ return x + v;
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/template/pr70466-1.C gcc-6-20160721/gcc/testsuite/g++.dg/template/pr70466-1.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/template/pr70466-1.C 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/template/pr70466-1.C 2016-05-18 17:17:03.000000000 +0000
+@@ -0,0 +1,27 @@
++// PR c++/70466
++
++template < class T, class T > // { dg-error "conflicting" }
++class A
++{
++public:
++ explicit A (T (S::*f) ()) {} // { dg-error "expected" }
++};
++
++template < class T, class S >
++A < T, S > foo (T (S::*f) ())
++{
++ return A < T, S > (f);
++}
++
++class B
++{
++public:
++ void bar () {}
++};
++
++int
++main ()
++{
++ foo (&B::bar);
++ return 0;
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/template/pr70466-2.C gcc-6-20160721/gcc/testsuite/g++.dg/template/pr70466-2.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/template/pr70466-2.C 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/template/pr70466-2.C 2016-05-18 17:17:03.000000000 +0000
+@@ -0,0 +1,25 @@
++// PR c++/70466
++
++template < class T, class S >
++struct A
++{
++ explicit A (...) {}
++};
++
++template < class T, class S >
++A < T, S > foo (T (S::*f) ())
++{
++ return A < T, S > (f);
++}
++
++struct B
++{
++ void bar () {}
++};
++
++int
++main ()
++{
++ foo (&B::bar);
++ return 0;
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/tm/pr71909.C gcc-6-20160721/gcc/testsuite/g++.dg/tm/pr71909.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/tm/pr71909.C 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/tm/pr71909.C 2016-07-20 14:05:00.000000000 +0000
+@@ -0,0 +1,18 @@
++// PR c++/71909
++// { dg-do compile { target c++11 } }
++// { dg-options "-fgnu-tm" }
++
++struct S
++{
++ S () __transaction_atomic [[outer]] try : m {0} {} catch (int) {} catch (...) {}
++ int m;
++};
++
++struct T
++{
++ T () __transaction_atomic __attribute__((outer)) try : m {0} {} catch (int) {} catch (...) {}
++ int m;
++};
++
++void foo () __transaction_atomic [[outer]] try {} catch (int) {} catch (...) {}
++void bar () __transaction_atomic __attribute__((outer)) try {} catch (int) {} catch (...) {}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/torture/pr71002.C gcc-6-20160721/gcc/testsuite/g++.dg/torture/pr71002.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/torture/pr71002.C 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/torture/pr71002.C 2016-05-30 14:00:18.000000000 +0000
+@@ -0,0 +1,160 @@
++// { dg-do run }
++
++using size_t = __SIZE_TYPE__;
++
++inline void* operator new(size_t, void* p) noexcept
++{ return p; }
++
++inline void operator delete(void*, void*)
++{ }
++
++struct long_t
++{
++ size_t is_short : 1;
++ size_t length : (__SIZEOF_SIZE_T__ * __CHAR_BIT__ - 1);
++ size_t capacity;
++ char* pointer;
++};
++
++union long_raw_t {
++ unsigned char data[sizeof(long_t)];
++ struct __attribute__((aligned(alignof(long_t)))) { } align;
++};
++
++struct short_header
++{
++ unsigned char is_short : 1;
++ unsigned char length : (__CHAR_BIT__ - 1);
++};
++
++struct short_t
++{
++ short_header h;
++ char data[23];
++};
++
++union repr_t
++{
++ long_raw_t r;
++ short_t s;
++
++ const short_t& short_repr() const
++ { return s; }
++
++ const long_t& long_repr() const
++ { return *static_cast<const long_t*>(static_cast<const void*>(&r)); }
++
++ short_t& short_repr()
++ { return s; }
++
++ long_t& long_repr()
++ { return *static_cast<long_t*>(static_cast<void*>(&r)); }
++};
++
++class string
++{
++public:
++ string()
++ {
++ short_t& s = m_repr.short_repr();
++ s.h.is_short = 1;
++ s.h.length = 0;
++ s.data[0] = '\0';
++ }
++
++ string(const char* str)
++ {
++ size_t length = __builtin_strlen(str);
++ if (length + 1 > 23) {
++ long_t& l = m_repr.long_repr();
++ l.is_short = 0;
++ l.length = length;
++ l.capacity = length + 1;
++ l.pointer = new char[l.capacity];
++ __builtin_memcpy(l.pointer, str, length + 1);
++ } else {
++ short_t& s = m_repr.short_repr();
++ s.h.is_short = 1;
++ s.h.length = length;
++ __builtin_memcpy(s.data, str, length + 1);
++ }
++ }
++
++ string(string&& other)
++ : string{}
++ {
++ swap_data(other);
++ }
++
++ ~string()
++ {
++ if (!is_short()) {
++ delete[] m_repr.long_repr().pointer;
++ }
++ }
++
++ size_t length() const
++ { return is_short() ? short_length() : long_length(); }
++
++private:
++ bool is_short() const
++ { return m_repr.s.h.is_short != 0; }
++
++ size_t short_length() const
++ { return m_repr.short_repr().h.length; }
++
++ size_t long_length() const
++ { return m_repr.long_repr().length; }
++
++ void swap_data(string& other)
++ {
++ if (is_short()) {
++ if (other.is_short()) {
++ repr_t tmp(m_repr);
++ m_repr = other.m_repr;
++ other.m_repr = tmp;
++ } else {
++ short_t short_backup(m_repr.short_repr());
++ m_repr.short_repr().~short_t();
++ ::new(&m_repr.long_repr()) long_t(other.m_repr.long_repr());
++ other.m_repr.long_repr().~long_t();
++ ::new(&other.m_repr.short_repr()) short_t(short_backup);
++ }
++ } else {
++ if (other.is_short()) {
++ short_t short_backup(other.m_repr.short_repr());
++ other.m_repr.short_repr().~short_t();
++ ::new(&other.m_repr.long_repr()) long_t(m_repr.long_repr());
++ m_repr.long_repr().~long_t();
++ ::new(&m_repr.short_repr()) short_t(short_backup);
++ } else {
++ long_t tmp(m_repr.long_repr());
++ m_repr.long_repr() = other.m_repr.long_repr();
++ other.m_repr.long_repr() = tmp;
++ }
++ }
++ }
++
++ repr_t m_repr;
++};
++
++struct foo
++{
++ __attribute__((noinline))
++ foo(string str)
++ : m_str{static_cast<string&&>(str)},
++ m_len{m_str.length()}
++ { }
++
++ string m_str;
++ size_t m_len;
++};
++
++int main()
++{
++ foo f{"the quick brown fox jumps over the lazy dog"};
++ if (f.m_len == 0) {
++ __builtin_abort();
++ }
++ return 0;
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/torture/pr71405.C gcc-6-20160721/gcc/testsuite/g++.dg/torture/pr71405.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/torture/pr71405.C 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/torture/pr71405.C 2016-06-14 14:42:46.000000000 +0000
+@@ -0,0 +1,22 @@
++// PR tree-optimization/71405
++// { dg-do compile }
++
++struct C
++{
++ C () {}
++ int i;
++};
++
++void *
++operator new (__SIZE_TYPE__ x, void *y)
++{
++ return y;
++}
++
++int
++main ()
++{
++ int a;
++ new (&a) C;
++ return a;
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/torture/pr71448.C gcc-6-20160721/gcc/testsuite/g++.dg/torture/pr71448.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/torture/pr71448.C 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/torture/pr71448.C 2016-06-14 14:43:42.000000000 +0000
+@@ -0,0 +1,27 @@
++// PR c++/71448
++// { dg-do compile }
++// { dg-additional-options "-std=c++11" }
++
++static constexpr const char foo[] = "foo";
++static constexpr const char *bar = "bar";
++
++static_assert ((foo + 3 - foo) == 3, "check");
++static_assert (foo + 2 != foo, "check");
++static_assert (foo + 2 >= foo, "check");
++static_assert (3 + foo >= foo, "check");
++static_assert (foo <= foo + 2, "check");
++static_assert (foo <= 3 + foo, "check");
++static_assert (foo + 2 > foo, "check");
++static_assert (3 + foo > foo, "check");
++static_assert (foo < 2 + foo, "check");
++static_assert (foo < foo + 3, "check");
++static_assert ((bar + 3 - bar) == 3, "check");
++static_assert (bar + 2 != bar, "check");
++static_assert (2 + bar >= bar, "check");
++static_assert (bar + 3 >= bar, "check");
++static_assert (bar <= bar + 2, "check");
++static_assert (bar <= 3 + bar, "check");
++static_assert (bar + 2 > bar, "check");
++static_assert (3 + bar > bar, "check");
++static_assert (bar < 2 + bar, "check");
++static_assert (bar < bar + 3, "check");
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/torture/pr71452.C gcc-6-20160721/gcc/testsuite/g++.dg/torture/pr71452.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/torture/pr71452.C 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/torture/pr71452.C 2016-07-07 07:30:04.000000000 +0000
+@@ -0,0 +1,10 @@
++// { dg-do run }
++
++int main()
++{
++ bool b;
++ *(char *)&b = 123;
++ if (*(char *)&b != 123)
++ __builtin_abort ();
++ return 0;
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/torture/pr71874.C gcc-6-20160721/gcc/testsuite/g++.dg/torture/pr71874.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/torture/pr71874.C 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/torture/pr71874.C 2016-07-19 17:33:58.000000000 +0000
+@@ -0,0 +1,12 @@
++// PR middle-end/71874
++// { dg-do run }
++
++int
++main ()
++{
++ char str[] = "abcdefghijklmnopqrstuvwxyzABCDEF";
++ __builtin_memmove (str + 20, str + 15, 11);
++ if (__builtin_strcmp (str, "abcdefghijklmnopqrstpqrstuvwxyzF") != 0)
++ __builtin_abort ();
++ return 0;
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/ubsan/null-7.C gcc-6-20160721/gcc/testsuite/g++.dg/ubsan/null-7.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/ubsan/null-7.C 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/ubsan/null-7.C 2016-05-06 10:50:03.000000000 +0000
+@@ -0,0 +1,24 @@
++// PR sanitizer/70342
++// { dg-do compile }
++// { dg-options "-fsanitize=null" }
++
++class A {};
++class B {
++public:
++ B(A);
++};
++class C {
++public:
++ C operator<<(B);
++};
++class D {
++ D(const int &);
++ C m_blackList;
++};
++D::D(const int &) {
++ m_blackList << A() << A() << A() << A() << A() << A() << A() << A() << A()
++ << A() << A() << A() << A() << A() << A() << A() << A() << A()
++ << A() << A() << A() << A() << A() << A() << A() << A() << A()
++ << A() << A() << A() << A() << A() << A() << A() << A() << A()
++ << A() << A() << A() << A() << A() << A() << A() << A() << A();
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/ubsan/pr70847.C gcc-6-20160721/gcc/testsuite/g++.dg/ubsan/pr70847.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/ubsan/pr70847.C 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/ubsan/pr70847.C 2016-06-06 20:11:54.000000000 +0000
+@@ -0,0 +1,11 @@
++// PR c++/70847
++// { dg-do compile }
++
++struct D { virtual D& f(); };
++
++void
++g()
++{
++ D d;
++ d.f().f().f().f().f().f().f().f().f().f().f().f().f().f().f().f().f().f().f().f().f().f().f().f().f().f();
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/ubsan/pr71393.C gcc-6-20160721/gcc/testsuite/g++.dg/ubsan/pr71393.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/ubsan/pr71393.C 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/ubsan/pr71393.C 2016-06-06 20:11:54.000000000 +0000
+@@ -0,0 +1,14 @@
++// PR c++/71393
++// { dg-do compile }
++// { dg-options "-fsanitize=undefined" }
++
++struct B { B &operator << (long); };
++struct A { A (); long a, b, c, d, e, f; };
++
++A::A ()
++{
++ B q;
++ q << 0 << a << 0 << b << 0 << (b / a) << 0 << c << 0 << (c / a) << 0
++ << d << 0 << (d / a) << 0 << e << 0 << (e / a) << 0 << f << 0
++ << (f / a) << 0;
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/vect/simd-clone-6.cc gcc-6-20160721/gcc/testsuite/g++.dg/vect/simd-clone-6.cc
+--- gcc-6.1.0/gcc/testsuite/g++.dg/vect/simd-clone-6.cc 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/vect/simd-clone-6.cc 2016-05-24 16:27:12.000000000 +0000
+@@ -0,0 +1,43 @@
++// PR c++/71257
++// { dg-require-effective-target vect_simd_clones }
++// { dg-additional-options "-fopenmp-simd -fno-inline" }
++// { dg-additional-options "-mavx" { target avx_runtime } }
++
++#include "../../gcc.dg/vect/tree-vect.h"
++
++#define N 1024
++struct S { int a; };
++int c[N], e[N], f[N];
++S d[N];
++
++#pragma omp declare simd linear(ref(b, c) : 1)
++int
++foo (int a, S &b, int &c)
++{
++ return a + b.a + c;
++}
++
++void
++do_main ()
++{
++ int i;
++ for (i = 0; i < N; i++)
++ {
++ c[i] = i;
++ d[i].a = 2 * i;
++ f[i] = 3 * i;
++ }
++ #pragma omp simd
++ for (i = 0; i < N; i++)
++ e[i] = foo (c[i], d[i], f[i]);
++ for (i = 0; i < N; i++)
++ if (e[i] != 6 * i)
++ __builtin_abort ();
++}
++
++int
++main ()
++{
++ check_vect ();
++ return 0;
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/warn/Wno-narrowing1.C gcc-6-20160721/gcc/testsuite/g++.dg/warn/Wno-narrowing1.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/warn/Wno-narrowing1.C 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/warn/Wno-narrowing1.C 2016-05-24 16:44:09.000000000 +0000
+@@ -0,0 +1,7 @@
++// PR c++/69872
++// { dg-options "-Wall -Wextra -pedantic -Wno-narrowing" }
++
++struct s { int x, y; };
++short offsets[1] = {
++ ((char*) &(((struct s*)16)->y) - (char *)16), // { dg-bogus "note" }
++};
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/g++.dg/warn/Wplacement-new-size-3.C gcc-6-20160721/gcc/testsuite/g++.dg/warn/Wplacement-new-size-3.C
+--- gcc-6.1.0/gcc/testsuite/g++.dg/warn/Wplacement-new-size-3.C 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/g++.dg/warn/Wplacement-new-size-3.C 2016-05-31 17:24:22.000000000 +0000
+@@ -0,0 +1,40 @@
++// PR c++/71306 - bogus -Wplacement-new with an array element
++// { dg-do compile }
++// { dg-options "-Wplacement-new" }
++
++void* operator new (__SIZE_TYPE__, void *p) { return p; }
++
++struct S64 { char c [64]; };
++
++S64 s2 [2];
++S64* ps2 [2];
++S64* ps2_2 [2][2];
++
++void* pv2 [2];
++
++void f ()
++{
++ char a [2][sizeof (S64)];
++
++ new (a) S64;
++ new (a [0]) S64;
++ new (a [1]) S64;
++
++ // Verify there is no warning with buffers of sufficient size.
++ new (&s2 [0]) S64;
++ new (&s2 [1]) S64;
++
++ // ..and no warning with pointers to buffers of unknown size.
++ new (ps2 [0]) S64;
++ new (ps2 [1]) S64;
++
++ // But a warning when using the ps2_2 array itself as opposed
++ // to the pointers it's elements might point to.
++ new (ps2_2 [0]) S64; // { dg-warning "placement new" }
++ new (ps2_2 [1]) S64; // { dg-warning "placement new" }
++
++ // ..and no warning again with pointers to buffers of unknown
++ // size.
++ new (pv2 [0]) S64;
++ new (pv2 [1]) S64;
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.c-torture/compile/pr70916.c gcc-6-20160721/gcc/testsuite/gcc.c-torture/compile/pr70916.c
+--- gcc-6.1.0/gcc/testsuite/gcc.c-torture/compile/pr70916.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.c-torture/compile/pr70916.c 2016-05-10 16:59:04.000000000 +0000
+@@ -0,0 +1,28 @@
++/* PR tree-optimization/70916 */
++
++int a, b, c, d, i, k;
++int static *e = &b, *j;
++int **f;
++int static ***g = &f;
++int *h;
++void
++fn1 ()
++{
++ for (;;)
++ {
++ int l[1] = { };
++ int m = (__UINTPTR_TYPE__) l;
++ for (; d; d--)
++ {
++ int ****n;
++ int *****o = &n;
++ i = a & 7 ? : a;
++ *e = (((*o = &g) != (int ****) g) < h[c], 0) || k;
++ if (*e)
++ {
++ **n = &j;
++ *e = (__UINTPTR_TYPE__) h;
++ }
++ }
++ }
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.c-torture/compile/pr71693.c gcc-6-20160721/gcc/testsuite/gcc.c-torture/compile/pr71693.c
+--- gcc-6.1.0/gcc/testsuite/gcc.c-torture/compile/pr71693.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.c-torture/compile/pr71693.c 2016-06-30 09:02:53.000000000 +0000
+@@ -0,0 +1,10 @@
++/* PR middle-end/71693 */
++
++unsigned short v;
++
++void
++foo (int x)
++{
++ v = ((((unsigned short) (0x0001 | (x & 0x0070) | 0x0100) & 0x00ffU) << 8)
++ | (((unsigned short) (0x0001 | (x & 0x0070) | 0x0100) >> 8) & 0x00ffU));
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.c-torture/compile/pr71916.c gcc-6-20160721/gcc/testsuite/gcc.c-torture/compile/pr71916.c
+--- gcc-6.1.0/gcc/testsuite/gcc.c-torture/compile/pr71916.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.c-torture/compile/pr71916.c 2016-07-19 19:55:54.000000000 +0000
+@@ -0,0 +1,36 @@
++/* PR rtl-optimization/71916 */
++
++int a, b, c, d, f, g;
++short h;
++
++short
++foo (short p1)
++{
++ return a >= 2 || p1 > 7 >> a ? p1 : p1 << a;
++}
++
++void
++bar (void)
++{
++ for (;;)
++ {
++ int i, j[3];
++ h = b >= 2 ? d : d >> b;
++ if (foo (f > h ^ c))
++ {
++ d = 0;
++ while (f <= 2)
++ {
++ char k[2];
++ for (;;)
++ k[i++] = 7;
++ }
++ }
++ else
++ for (;;)
++ g = j[2];
++ if (g)
++ for (;;)
++ ;
++ }
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.c-torture/execute/pr71494.c gcc-6-20160721/gcc/testsuite/gcc.c-torture/execute/pr71494.c
+--- gcc-6.1.0/gcc/testsuite/gcc.c-torture/execute/pr71494.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.c-torture/execute/pr71494.c 2016-06-14 14:45:23.000000000 +0000
+@@ -0,0 +1,22 @@
++/* PR middle-end/71494 */
++
++int
++main ()
++{
++ void *label = &&out;
++ int i = 0;
++ void test (void)
++ {
++ label = &&out2;
++ goto *label;
++ out2:;
++ i++;
++ }
++ goto *label;
++ out:
++ i += 2;
++ test ();
++ if (i != 3)
++ __builtin_abort ();
++ return 0;
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.c-torture/execute/pr71554.c gcc-6-20160721/gcc/testsuite/gcc.c-torture/execute/pr71554.c
+--- gcc-6.1.0/gcc/testsuite/gcc.c-torture/execute/pr71554.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.c-torture/execute/pr71554.c 2016-06-16 10:21:43.000000000 +0000
+@@ -0,0 +1,28 @@
++/* PR target/71554 */
++
++int v;
++
++__attribute__ ((noinline, noclone)) void
++bar (void)
++{
++ v++;
++}
++
++__attribute__ ((noinline, noclone))
++void
++foo (unsigned int x)
++{
++ signed int y = ((-__INT_MAX__ - 1) / 2);
++ signed int r;
++ if (__builtin_mul_overflow (x, y, &r))
++ bar ();
++}
++
++int
++main ()
++{
++ foo (2);
++ if (v)
++ __builtin_abort ();
++ return 0;
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.c-torture/execute/pr71626-1.c gcc-6-20160721/gcc/testsuite/gcc.c-torture/execute/pr71626-1.c
+--- gcc-6.1.0/gcc/testsuite/gcc.c-torture/execute/pr71626-1.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.c-torture/execute/pr71626-1.c 2016-07-02 10:21:24.000000000 +0000
+@@ -0,0 +1,19 @@
++/* PR middle-end/71626 */
++
++typedef __INTPTR_TYPE__ V __attribute__((__vector_size__(sizeof (__INTPTR_TYPE__))));
++
++__attribute__((noinline, noclone)) V
++foo ()
++{
++ V v = { (__INTPTR_TYPE__) foo };
++ return v;
++}
++
++int
++main ()
++{
++ V v = foo ();
++ if (v[0] != (__INTPTR_TYPE__) foo)
++ __builtin_abort ();
++ return 0;
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.c-torture/execute/pr71626-2.c gcc-6-20160721/gcc/testsuite/gcc.c-torture/execute/pr71626-2.c
+--- gcc-6.1.0/gcc/testsuite/gcc.c-torture/execute/pr71626-2.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.c-torture/execute/pr71626-2.c 2016-07-02 10:21:24.000000000 +0000
+@@ -0,0 +1,4 @@
++/* PR middle-end/71626 */
++/* { dg-additional-options "-fpic" { target fpic } } */
++
++#include "pr71626-1.c"
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.dg/align-3.c gcc-6-20160721/gcc/testsuite/gcc.dg/align-3.c
+--- gcc-6.1.0/gcc/testsuite/gcc.dg/align-3.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.dg/align-3.c 2016-07-07 11:37:24.000000000 +0000
+@@ -0,0 +1,11 @@
++/* { dg-do compile } */
++/* { dg-options "-O2 -fdump-rtl-expand" } */
++
++typedef struct { char a[2]; } __attribute__((__packed__)) TU2;
++unsigned short get16_unaligned(const void *p) {
++ unsigned short v;
++ *(TU2 *)(void *)(&v) = *(const TU2 *)p;
++ return v;
++}
++
++/* { dg-final { scan-rtl-dump "MEM\[^\n\r\]*A8\\\]" "expand" } } */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.dg/const-float128-ped.c gcc-6-20160721/gcc/testsuite/gcc.dg/const-float128-ped.c
+--- gcc-6.1.0/gcc/testsuite/gcc.dg/const-float128-ped.c 2008-07-02 18:54:04.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.dg/const-float128-ped.c 2016-07-05 17:54:02.000000000 +0000
+@@ -1,5 +1,7 @@
+ /* Test 'q' suffix with -pedantic on __float128 type constants. */
+-/* { dg-do compile { target ia64-*-* i?86-*-* x86_64-*-* } } */
++/* { dg-do compile } */
++/* { dg-require-effective-target __float128 } */
+ /* { dg-options "-pedantic" } */
++/* { dg-add-options __float128 } */
+
+ __float128 a = 123.456789q; /* { dg-warning "non-standard suffix on floating constant" } */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.dg/const-float128.c gcc-6-20160721/gcc/testsuite/gcc.dg/const-float128.c
+--- gcc-6.1.0/gcc/testsuite/gcc.dg/const-float128.c 2008-07-02 18:54:04.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.dg/const-float128.c 2016-07-05 17:54:02.000000000 +0000
+@@ -1,6 +1,8 @@
+ /* Test 'q' and 'Q' suffixes on __float128 type constants. */
+-/* { dg-do compile { target ia64-*-* i?86-*-* x86_64-*-* } } */
++/* { dg-do compile } */
++/* { dg-require-effective-target __float128 } */
+ /* { dg-options "" } */
++/* { dg-add-options __float128 } */
+
+ __float128 a = 123.456789q;
+ __float128 b = 123.456789Q;
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.dg/debug/dwarf2/pr71855.c gcc-6-20160721/gcc/testsuite/gcc.dg/debug/dwarf2/pr71855.c
+--- gcc-6.1.0/gcc/testsuite/gcc.dg/debug/dwarf2/pr71855.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.dg/debug/dwarf2/pr71855.c 2016-07-19 19:31:24.000000000 +0000
+@@ -0,0 +1,11 @@
++/* { dg-do compile } */
++/* { dg-options "-O0 -g -dA" } */
++
++// Test that there is only one DW_TAG_unspecified_parameters DIE.
++
++void
++foo (const char *format, ...)
++{
++}
++
++// { dg-final { scan-assembler-times "DIE.*DW_TAG_unspecified_parameters" 1 } }
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.dg/goacc/nested-function-1.c gcc-6-20160721/gcc/testsuite/gcc.dg/goacc/nested-function-1.c
+--- gcc-6.1.0/gcc/testsuite/gcc.dg/goacc/nested-function-1.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.dg/goacc/nested-function-1.c 2016-06-10 09:46:18.000000000 +0000
+@@ -0,0 +1,100 @@
++/* Exercise nested function decomposition, gcc/tree-nested.c. */
++/* See gcc/testsuite/gfortran.dg/goacc/nested-function-1.f90 for the Fortran
++ version. */
++
++int main ()
++{
++#define N 100
++ int nonlocal_arg;
++ int nonlocal_a[N];
++ int nonlocal_i;
++ int nonlocal_j;
++
++ for (int i = 0; i < N; ++i)
++ nonlocal_a[i] = 5;
++ nonlocal_arg = 5;
++
++ void local ()
++ {
++ int local_i;
++ int local_arg;
++ int local_a[N];
++ int local_j;
++
++ for (int i = 0; i < N; ++i)
++ local_a[i] = 5;
++ local_arg = 5;
++
++#pragma acc kernels loop \
++ gang(num:local_arg) worker(local_arg) vector(local_arg) \
++ wait async(local_arg)
++ for (local_i = 0; local_i < N; ++local_i)
++ {
++#pragma acc cache (local_a[local_i:5])
++ local_a[local_i] = 100;
++#pragma acc loop seq tile(*)
++ for (local_j = 0; local_j < N; ++local_j)
++ ;
++#pragma acc loop auto independent tile(1)
++ for (local_j = 0; local_j < N; ++local_j)
++ ;
++ }
++
++#pragma acc kernels loop \
++ gang(static:local_arg) worker(local_arg) vector(local_arg) \
++ wait(local_arg, local_arg + 1, local_arg + 2) async
++ for (local_i = 0; local_i < N; ++local_i)
++ {
++#pragma acc cache (local_a[local_i:4])
++ local_a[local_i] = 100;
++#pragma acc loop seq tile(1)
++ for (local_j = 0; local_j < N; ++local_j)
++ ;
++#pragma acc loop auto independent tile(*)
++ for (local_j = 0; local_j < N; ++local_j)
++ ;
++ }
++ }
++
++ void nonlocal ()
++ {
++ for (int i = 0; i < N; ++i)
++ nonlocal_a[i] = 5;
++ nonlocal_arg = 5;
++
++#pragma acc kernels loop \
++ gang(num:nonlocal_arg) worker(nonlocal_arg) vector(nonlocal_arg) \
++ wait async(nonlocal_arg)
++ for (nonlocal_i = 0; nonlocal_i < N; ++nonlocal_i)
++ {
++#pragma acc cache (nonlocal_a[nonlocal_i:3])
++ nonlocal_a[nonlocal_i] = 100;
++#pragma acc loop seq tile(2)
++ for (nonlocal_j = 0; nonlocal_j < N; ++nonlocal_j)
++ ;
++#pragma acc loop auto independent tile(3)
++ for (nonlocal_j = 0; nonlocal_j < N; ++nonlocal_j)
++ ;
++ }
++
++#pragma acc kernels loop \
++ gang(static:nonlocal_arg) worker(nonlocal_arg) vector(nonlocal_arg) \
++ wait(nonlocal_arg, nonlocal_arg + 1, nonlocal_arg + 2) async
++ for (nonlocal_i = 0; nonlocal_i < N; ++nonlocal_i)
++ {
++#pragma acc cache (nonlocal_a[nonlocal_i:2])
++ nonlocal_a[nonlocal_i] = 100;
++#pragma acc loop seq tile(*)
++ for (nonlocal_j = 0; nonlocal_j < N; ++nonlocal_j)
++ ;
++#pragma acc loop auto independent tile(*)
++ for (nonlocal_j = 0; nonlocal_j < N; ++nonlocal_j)
++ ;
++ }
++ }
++
++ local ();
++ nonlocal ();
++
++ return 0;
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.dg/goacc/nested-function-2.c gcc-6-20160721/gcc/testsuite/gcc.dg/goacc/nested-function-2.c
+--- gcc-6.1.0/gcc/testsuite/gcc.dg/goacc/nested-function-2.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.dg/goacc/nested-function-2.c 2016-06-10 09:46:18.000000000 +0000
+@@ -0,0 +1,45 @@
++/* Exercise nested function decomposition, gcc/tree-nested.c. */
++
++int
++main (void)
++{
++ int j = 0, k = 6, l = 7, m = 8;
++ void simple (void)
++ {
++ int i;
++#pragma acc parallel
++ {
++#pragma acc loop
++ for (i = 0; i < m; i+= k)
++ j = (m + i - j) * l;
++ }
++ }
++ void collapse (void)
++ {
++ int x, y, z;
++#pragma acc parallel
++ {
++#pragma acc loop collapse (3)
++ for (x = 0; x < k; x++)
++ for (y = -5; y < l; y++)
++ for (z = 0; z < m; z++)
++ j += x + y + z;
++ }
++ }
++ void reduction (void)
++ {
++ int x, y, z;
++#pragma acc parallel reduction (+:j)
++ {
++#pragma acc loop reduction (+:j) collapse (3)
++ for (x = 0; x < k; x++)
++ for (y = -5; y < l; y++)
++ for (z = 0; z < m; z++)
++ j += x + y + z;
++ }
++ }
++ simple();
++ collapse();
++ reduction();
++ return 0;
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.dg/goacc/pr71373.c gcc-6-20160721/gcc/testsuite/gcc.dg/goacc/pr71373.c
+--- gcc-6.1.0/gcc/testsuite/gcc.dg/goacc/pr71373.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.dg/goacc/pr71373.c 2016-06-10 09:46:18.000000000 +0000
+@@ -0,0 +1,41 @@
++/* Unintentional nested function usage. */
++/* Due to missing right braces '}', the following functions are parsed as
++ nested functions. This ran into an ICE. */
++
++void foo (void)
++{
++ #pragma acc parallel
++ {
++ #pragma acc loop independent
++ for (int i = 0; i < 16; i++)
++ ;
++ // Note right brace '}' commented out here.
++ //}
++}
++void bar (void)
++{
++}
++
++// Adding right brace '}' here, to make this compile.
++}
++
++
++// ..., and the other way round:
++
++void BAR (void)
++{
++// Note right brace '}' commented out here.
++//}
++
++void FOO (void)
++{
++ #pragma acc parallel
++ {
++ #pragma acc loop independent
++ for (int i = 0; i < 16; i++)
++ ;
++ }
++}
++
++// Adding right brace '}' here, to make this compile.
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.dg/graphite/pr69067.c gcc-6-20160721/gcc/testsuite/gcc.dg/graphite/pr69067.c
+--- gcc-6.1.0/gcc/testsuite/gcc.dg/graphite/pr69067.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.dg/graphite/pr69067.c 2016-05-30 15:54:06.000000000 +0000
+@@ -0,0 +1,28 @@
++/* { dg-do link } */
++/* { dg-options " -O1 -floop-nest-optimize" } */
++/* { dg-additional-options "-flto" { target lto } } */
++
++int a1, c1, cr, kt;
++int aa[2];
++
++int
++ce (void)
++{
++ while (a1 < 1)
++ {
++ int g8;
++ for (g8 = 0; g8 < 3; ++g8)
++ if (c1 != 0)
++ cr = aa[a1 * 2] = kt;
++ for (c1 = 0; c1 < 2; ++c1)
++ aa[c1] = cr;
++ ++a1;
++ }
++ return 0;
++}
++
++int
++main (void)
++{
++ return ce ();
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.dg/graphite/pr69068.c gcc-6-20160721/gcc/testsuite/gcc.dg/graphite/pr69068.c
+--- gcc-6.1.0/gcc/testsuite/gcc.dg/graphite/pr69068.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.dg/graphite/pr69068.c 2016-05-31 07:27:23.000000000 +0000
+@@ -0,0 +1,14 @@
++/* { dg-do compile } */
++/* { dg-options "-O1 -fgraphite-identity" } */
++
++int qo;
++int zh[2];
++
++void
++td (void)
++{
++ int ly, en;
++ for (ly = 0; ly < 2; ++ly)
++ for (en = 0; en < 2; ++en)
++ zh[en] = ((qo == 0) || (((qo * 2) != 0))) ? 1 : -1;
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.dg/graphite/pr70956.c gcc-6-20160721/gcc/testsuite/gcc.dg/graphite/pr70956.c
+--- gcc-6.1.0/gcc/testsuite/gcc.dg/graphite/pr70956.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.dg/graphite/pr70956.c 2016-05-07 07:02:36.000000000 +0000
+@@ -0,0 +1,4 @@
++/* { dg-do compile } */
++/* { dg-options "-O2 -fgraphite-identity" } */
++
++#include "../tree-ssa/vrp66.c"
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.dg/guality/param-5.c gcc-6-20160721/gcc/testsuite/gcc.dg/guality/param-5.c
+--- gcc-6.1.0/gcc/testsuite/gcc.dg/guality/param-5.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.dg/guality/param-5.c 2016-06-22 14:36:16.000000000 +0000
+@@ -0,0 +1,38 @@
++/* { dg-do run } */
++/* { dg-options "-g" } */
++/* { dg-skip-if "" { *-*-* } { "*" } { "-O0" } } */
++
++typedef __UINTPTR_TYPE__ uintptr_t;
++
++typedef struct { uintptr_t pa; uintptr_t pb; } fatp_t
++ __attribute__ ((aligned (2 * __alignof__ (uintptr_t))));
++
++__attribute__((noinline, noclone)) void
++clear_stack (void)
++{
++ char a[128 * 1024 + 128];
++
++ __builtin_memset (a + 128 * 1024, 0, 128);
++}
++
++__attribute__((noinline, noclone)) void
++foo (fatp_t str, int count)
++{
++ char a[128 * 1024];
++
++ if (count > 0)
++ foo (str, count - 1);
++ clear_stack ();
++ count--; /* BREAK */
++}
++
++int
++main (void)
++{
++ fatp_t ptr = { 31415927, 27182818 };
++ foo (ptr, 1);
++ return 0;
++}
++
++/* { dg-final { gdb-test 26 "str.pa" "31415927" } } */
++/* { dg-final { gdb-test 26 "str.pb" "27182818" } } */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.dg/ipa/pr70646.c gcc-6-20160721/gcc/testsuite/gcc.dg/ipa/pr70646.c
+--- gcc-6.1.0/gcc/testsuite/gcc.dg/ipa/pr70646.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.dg/ipa/pr70646.c 2016-05-19 14:56:35.000000000 +0000
+@@ -0,0 +1,40 @@
++/* { dg-do run } */
++/* { dg-options "-O2" } */
++
++#pragma GCC optimize("no-unit-at-a-time")
++
++typedef unsigned char u8;
++typedef unsigned long long u64;
++
++static inline __attribute__((always_inline)) u64 __swab64p(const u64 *p)
++{
++ return (__builtin_constant_p((u64)(*p)) ? ((u64)( (((u64)(*p) & (u64)0x00000000000000ffULL) << 56) | (((u64)(*p) & (u64)0x000000000000ff00ULL) << 40) | (((u64)(*p) & (u64)0x0000000000ff0000ULL) << 24) | (((u64)(*p) & (u64)0x00000000ff000000ULL) << 8) | (((u64)(*p) & (u64)0x000000ff00000000ULL) >> 8) | (((u64)(*p) & (u64)0x0000ff0000000000ULL) >> 24) | (((u64)(*p) & (u64)0x00ff000000000000ULL) >> 40) | (((u64)(*p) & (u64)0xff00000000000000ULL) >> 56))) : __builtin_bswap64(*p));
++}
++
++static inline u64 wwn_to_u64(void *wwn)
++{
++ return __swab64p(wwn);
++}
++
++void __attribute__((noinline,noclone)) broken(u64* shost)
++{
++ u8 node_name[8] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
++ *shost = wwn_to_u64(node_name);
++}
++
++void __attribute__((noinline,noclone)) dummy(void)
++{
++ __builtin_abort();
++}
++
++int main(int argc, char* argv[])
++{
++ u64 v;
++
++ broken(&v);
++
++ if(v != (u64)-1)
++ __builtin_abort();
++
++ return 0;
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.dg/pr71006.c gcc-6-20160721/gcc/testsuite/gcc.dg/pr71006.c
+--- gcc-6.1.0/gcc/testsuite/gcc.dg/pr71006.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.dg/pr71006.c 2016-05-12 14:07:13.000000000 +0000
+@@ -0,0 +1,16 @@
++/* PR target/71006 */
++/* { dg-do compile } */
++/* { dg-options "-O1 -ftree-vectorize" } */
++
++unsigned char uu, gu, e2;
++
++void
++fs (void)
++{
++ char *nq = (char *)&gu, *k4 = (char *)&gu;
++ while (*k4 < 1)
++ {
++ uu += (*nq != 0 || e2 != 0);
++ ++*k4;
++ }
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.dg/pr71071.c gcc-6-20160721/gcc/testsuite/gcc.dg/pr71071.c
+--- gcc-6.1.0/gcc/testsuite/gcc.dg/pr71071.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.dg/pr71071.c 2016-05-30 14:00:18.000000000 +0000
+@@ -0,0 +1,12 @@
++/* PR bootstrap/71071 */
++/* { dg-do compile } *
++/* { dg-options "-O2" } */
++
++struct S { unsigned b : 1; } a;
++
++void
++foo ()
++{
++ if (a.b)
++ ;
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.dg/pr71279.c gcc-6-20160721/gcc/testsuite/gcc.dg/pr71279.c
+--- gcc-6.1.0/gcc/testsuite/gcc.dg/pr71279.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.dg/pr71279.c 2016-05-27 10:43:34.000000000 +0000
+@@ -0,0 +1,14 @@
++/* PR middle-end/71279 */
++/* { dg-do compile } */
++/* { dg-options "-O3" } */
++/* { dg-additional-options "-march=knl" { target { i?86-*-* x86_64-*-* } } } */
++
++extern int a, b;
++long c[1][1][1];
++long d[1][1];
++
++void fn1 ()
++{
++ for (int e = 0; e < b; e = e + 1)
++ *(e + **c) = (a && *d[1]) - 1;
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.dg/pr71518.c gcc-6-20160721/gcc/testsuite/gcc.dg/pr71518.c
+--- gcc-6.1.0/gcc/testsuite/gcc.dg/pr71518.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.dg/pr71518.c 2016-07-11 15:21:20.000000000 +0000
+@@ -0,0 +1,25 @@
++/* PR tree-optimization/71518 */
++/* { dg-options "-O3" } */
++
++int a, *b[9], c, d, e;
++
++static int
++fn1 ()
++{
++ for (c = 6; c >= 0; c--)
++ for (d = 0; d < 2; d++)
++ {
++ b[d * 2 + c] = 0;
++ e = a > 1 ? : 0;
++ if (e == 2)
++ return 0;
++ }
++ return 0;
++}
++
++int
++main ()
++{
++ fn1 ();
++ return 0;
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.dg/pr71558.c gcc-6-20160721/gcc/testsuite/gcc.dg/pr71558.c
+--- gcc-6.1.0/gcc/testsuite/gcc.dg/pr71558.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.dg/pr71558.c 2016-06-21 07:15:36.000000000 +0000
+@@ -0,0 +1,17 @@
++/* PR tree-optimization/71588 */
++
++/* strcpy must not be pure, but make sure we don't ICE even when
++ it is declared incorrectly. */
++char *strcpy (char *, const char *) __attribute__ ((__pure__));
++__SIZE_TYPE__ strlen (const char *);
++void *malloc (__SIZE_TYPE__);
++
++char a[20];
++
++char *
++foo (void)
++{
++ __SIZE_TYPE__ b = strlen (a);
++ char *c = malloc (b);
++ return strcpy (c, a);
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.dg/pr71581.c gcc-6-20160721/gcc/testsuite/gcc.dg/pr71581.c
+--- gcc-6.1.0/gcc/testsuite/gcc.dg/pr71581.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.dg/pr71581.c 2016-06-21 07:13:52.000000000 +0000
+@@ -0,0 +1,24 @@
++/* PR middle-end/71581 */
++/* { dg-do compile } */
++/* { dg-options "-Wuninitialized" } */
++
++_Complex float
++f1 (void)
++{
++ float x;
++ return x; /* { dg-warning "is used uninitialized in this function" } */
++}
++
++_Complex double
++f2 (void)
++{
++ double x;
++ return x; /* { dg-warning "is used uninitialized in this function" } */
++}
++
++_Complex int
++f3 (void)
++{
++ int x;
++ return x; /* { dg-warning "is used uninitialized in this function" } */
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.dg/pr71685.c gcc-6-20160721/gcc/testsuite/gcc.dg/pr71685.c
+--- gcc-6.1.0/gcc/testsuite/gcc.dg/pr71685.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.dg/pr71685.c 2016-07-02 10:22:11.000000000 +0000
+@@ -0,0 +1,6 @@
++/* PR c/71685 */
++/* { dg-do compile } */
++/* { dg-options "-std=gnu11" } */
++
++extern struct S v, s;
++struct S { int t; int p[]; } v = { 4, 0 };
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.dg/spellcheck-options-12.c gcc-6-20160721/gcc/testsuite/gcc.dg/spellcheck-options-12.c
+--- gcc-6.1.0/gcc/testsuite/gcc.dg/spellcheck-options-12.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.dg/spellcheck-options-12.c 2016-06-30 14:39:10.000000000 +0000
+@@ -0,0 +1,7 @@
++/* Verify that we don't include -Wno- variants for options marked
++ with RejectNegative when considering hints for misspelled options
++ (PR driver/71651). */
++
++/* { dg-do compile } */
++/* { dg-options "-fno-stack-protector-explicit" } */
++/* { dg-error "unrecognized command line option .-fno-stack-protector-explicit.; did you mean .-fstack-protector-explicit.." "" { target *-*-* } 0 } */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.dg/torture/float128-cmp-invalid.c gcc-6-20160721/gcc/testsuite/gcc.dg/torture/float128-cmp-invalid.c
+--- gcc-6.1.0/gcc/testsuite/gcc.dg/torture/float128-cmp-invalid.c 2013-11-14 14:29:12.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.dg/torture/float128-cmp-invalid.c 2016-07-05 17:54:02.000000000 +0000
+@@ -1,7 +1,10 @@
+ /* Test for "invalid" exceptions from __float128 comparisons. */
+-/* { dg-do run { target i?86-*-* x86_64-*-* ia64-*-* } } */
++/* { dg-do run } */
+ /* { dg-options "" } */
++/* { dg-require-effective-target __float128 } */
++/* { dg-require-effective-target base_quadfloat_support } */
+ /* { dg-require-effective-target fenv_exceptions } */
++/* { dg-add-options __float128 } */
+
+ #include <fenv.h>
+ #include <stdlib.h>
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.dg/torture/float128-div-underflow.c gcc-6-20160721/gcc/testsuite/gcc.dg/torture/float128-div-underflow.c
+--- gcc-6.1.0/gcc/testsuite/gcc.dg/torture/float128-div-underflow.c 2013-11-14 14:29:12.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.dg/torture/float128-div-underflow.c 2016-07-05 17:54:02.000000000 +0000
+@@ -1,7 +1,10 @@
+ /* Test for spurious underflow from __float128 division. */
+-/* { dg-do run { target i?86-*-* x86_64-*-* ia64-*-* } } */
++/* { dg-do run } */
+ /* { dg-options "" } */
++/* { dg-require-effective-target __float128 } */
++/* { dg-require-effective-target base_quadfloat_support } */
+ /* { dg-require-effective-target fenv_exceptions } */
++/* { dg-add-options __float128 } */
+
+ #include <fenv.h>
+ #include <stdlib.h>
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.dg/torture/float128-extend-nan.c gcc-6-20160721/gcc/testsuite/gcc.dg/torture/float128-extend-nan.c
+--- gcc-6.1.0/gcc/testsuite/gcc.dg/torture/float128-extend-nan.c 2013-11-14 14:29:12.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.dg/torture/float128-extend-nan.c 2016-07-05 17:54:02.000000000 +0000
+@@ -1,7 +1,10 @@
+ /* Test extensions to __float128 quiet signaling NaNs. */
+-/* { dg-do run { target i?86-*-* x86_64-*-* ia64-*-* } } */
++/* { dg-do run } */
+ /* { dg-options "-fsignaling-nans" } */
++/* { dg-require-effective-target __float128 } */
++/* { dg-require-effective-target base_quadfloat_support } */
+ /* { dg-require-effective-target fenv_exceptions } */
++/* { dg-add-options __float128 } */
+
+ #include <fenv.h>
+ #include <float.h>
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.dg/torture/fp-int-convert-float128-timode-2.c gcc-6-20160721/gcc/testsuite/gcc.dg/torture/fp-int-convert-float128-timode-2.c
+--- gcc-6.1.0/gcc/testsuite/gcc.dg/torture/fp-int-convert-float128-timode-2.c 2013-06-21 19:08:01.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.dg/torture/fp-int-convert-float128-timode-2.c 2016-07-05 17:54:02.000000000 +0000
+@@ -1,9 +1,12 @@
+ /* Test floating-point conversions. __float128 type with TImode: bug
+ 53317. */
+ /* Origin: Joseph Myers <joseph@codesourcery.com> */
+-/* { dg-do run { target i?86-*-* x86_64-*-* ia64-*-* } } */
++/* { dg-do run } */
++/* { dg-require-effective-target __float128 } */
++/* { dg-require-effective-target base_quadfloat_support } */
+ /* { dg-require-effective-target int128 } */
+ /* { dg-options "" } */
++/* { dg-add-options __float128 } */
+
+ extern void abort (void);
+ extern void exit (int);
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.dg/torture/fp-int-convert-float128-timode-3.c gcc-6-20160721/gcc/testsuite/gcc.dg/torture/fp-int-convert-float128-timode-3.c
+--- gcc-6.1.0/gcc/testsuite/gcc.dg/torture/fp-int-convert-float128-timode-3.c 2013-11-06 22:46:39.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.dg/torture/fp-int-convert-float128-timode-3.c 2016-07-05 17:54:02.000000000 +0000
+@@ -1,8 +1,11 @@
+ /* Test for correct rounding of conversions from __int128 to
+ __float128. */
+-/* { dg-do run { target i?86-*-* x86_64-*-* ia64-*-* } } */
++/* { dg-do run } */
++/* { dg-require-effective-target __float128 } */
++/* { dg-require-effective-target base_quadfloat_support } */
+ /* { dg-require-effective-target int128 } */
+ /* { dg-options "-frounding-math" } */
++/* { dg-add-options __float128 } */
+
+ #include <fenv.h>
+ #include <stdlib.h>
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.dg/torture/fp-int-convert-float128-timode.c gcc-6-20160721/gcc/testsuite/gcc.dg/torture/fp-int-convert-float128-timode.c
+--- gcc-6.1.0/gcc/testsuite/gcc.dg/torture/fp-int-convert-float128-timode.c 2009-02-12 17:33:18.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.dg/torture/fp-int-convert-float128-timode.c 2016-07-05 17:54:02.000000000 +0000
+@@ -1,7 +1,10 @@
+ /* Test floating-point conversions. __float128 type with TImode. */
+ /* Origin: Joseph Myers <joseph@codesourcery.com> */
+-/* { dg-do run { target i?86-*-* x86_64-*-* ia64-*-* } } */
++/* { dg-do run } */
++/* { dg-require-effective-target __float128 } */
++/* { dg-require-effective-target base_quadfloat_support } */
+ /* { dg-options "" } */
++/* { dg-add-options __float128 } */
+
+ #include "fp-int-convert.h"
+
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.dg/torture/pr70935.c gcc-6-20160721/gcc/testsuite/gcc.dg/torture/pr70935.c
+--- gcc-6.1.0/gcc/testsuite/gcc.dg/torture/pr70935.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.dg/torture/pr70935.c 2016-05-10 14:26:37.000000000 +0000
+@@ -0,0 +1,39 @@
++/* { dg-do compile } */
++/* { dg-options "-O3 -g" } */
++
++int d0, sj, v0, rp, zi;
++
++void
++zn(void)
++{
++ if (v0 != 0)
++ {
++ int *js, *r3;
++ int pm, gc;
++
++ for (gc = 0; gc < 1; ++gc)
++ {
++ sj = 1;
++ while (sj != 0)
++ ;
++ }
++ r3 = &pm;
++ *js = (long)&gc;
++ka:
++ for (d0 = 0; d0 < 2; ++d0)
++ {
++ d0 = zi;
++ if (zi)
++ for (pm = 2; pm != 0; --pm)
++ ;
++ }
++ while (*r3 != 0)
++ {
++ while (pm)
++ ;
++ ++r3;
++ }
++ }
++ rp = 0;
++ goto ka;
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.dg/torture/pr70941.c gcc-6-20160721/gcc/testsuite/gcc.dg/torture/pr70941.c
+--- gcc-6.1.0/gcc/testsuite/gcc.dg/torture/pr70941.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.dg/torture/pr70941.c 2016-05-13 13:22:42.000000000 +0000
+@@ -0,0 +1,12 @@
++/* { dg-do run } */
++/* { dg-require-effective-target int32plus } */
++
++signed char a = 0, b = 0, c = 0, d = 0;
++
++int main()
++{
++ a = -(b - 405418259) - ((d && c) ^ 2040097152);
++ if (a != (signed char) -1634678893)
++ __builtin_abort ();
++ return 0;
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.dg/torture/pr71423.c gcc-6-20160721/gcc/testsuite/gcc.dg/torture/pr71423.c
+--- gcc-6.1.0/gcc/testsuite/gcc.dg/torture/pr71423.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.dg/torture/pr71423.c 2016-07-07 07:30:04.000000000 +0000
+@@ -0,0 +1,20 @@
++/* { dg-do run } */
++
++struct S1
++{
++ int f1:1;
++};
++
++volatile struct S1 b = { 0 };
++
++int
++main ()
++{
++ char c = b.f1;
++ b.f1 = 1;
++
++ if (b.f1 > -1 || c)
++ __builtin_abort ();
++
++ return 0;
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.dg/torture/pr71452.c gcc-6-20160721/gcc/testsuite/gcc.dg/torture/pr71452.c
+--- gcc-6.1.0/gcc/testsuite/gcc.dg/torture/pr71452.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.dg/torture/pr71452.c 2016-07-07 07:30:04.000000000 +0000
+@@ -0,0 +1,10 @@
++/* { dg-do run } */
++
++int main()
++{
++ _Bool b;
++ *(char *)&b = 123;
++ if (*(char *)&b != 123)
++ __builtin_abort ();
++ return 0;
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.dg/torture/pr71522.c gcc-6-20160721/gcc/testsuite/gcc.dg/torture/pr71522.c
+--- gcc-6.1.0/gcc/testsuite/gcc.dg/torture/pr71522.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.dg/torture/pr71522.c 2016-07-07 07:30:04.000000000 +0000
+@@ -0,0 +1,27 @@
++/* { dg-do run } */
++
++#if __SIZEOF_LONG_DOUBLE__ == 16
++#define STR "AAAAAAAAAAAAAAA"
++#elif __SIZEOF_LONG_DOUBLE__ == 12
++#define STR "AAAAAAAAAAA"
++#elif __SIZEOF_LONG_DOUBLE__ == 8
++#define STR "AAAAAAA"
++#elif __SIZEOF_LONG_DOUBLE__ == 4
++#define STR "AAA"
++#else
++#define STR "A"
++#endif
++
++int main()
++{
++ long double d;
++ char s[sizeof d];
++
++ __builtin_memcpy(&d, STR, sizeof d);
++ __builtin_memcpy(&s, &d, sizeof s);
++
++ if (__builtin_strncmp (s, STR, sizeof s) != 0)
++ __builtin_abort ();
++
++ return 0;
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.dg/torture/pr71606.c gcc-6-20160721/gcc/testsuite/gcc.dg/torture/pr71606.c
+--- gcc-6.1.0/gcc/testsuite/gcc.dg/torture/pr71606.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.dg/torture/pr71606.c 2016-07-08 20:20:23.000000000 +0000
+@@ -0,0 +1,11 @@
++_Complex a;
++void fn1 ();
++
++int main () {
++ fn1 (a);
++ return 0;
++}
++
++void fn1 (__complex__ long double p1) {
++ __imag__ p1 = 6.0L;
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.dg/tree-ssa/pr70919.c gcc-6-20160721/gcc/testsuite/gcc.dg/tree-ssa/pr70919.c
+--- gcc-6.1.0/gcc/testsuite/gcc.dg/tree-ssa/pr70919.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.dg/tree-ssa/pr70919.c 2016-05-23 11:27:14.000000000 +0000
+@@ -0,0 +1,46 @@
++/* { dg-do run } */
++/* { dg-options "-O" } */
++
++#pragma pack(1)
++struct S0
++{
++ int f0:24;
++};
++
++struct S1
++{
++ int f1;
++} a;
++
++int b, c;
++
++char
++fn1 (struct S1 p1)
++{
++ return 0;
++}
++
++int
++main ()
++{
++ c = fn1 (a);
++ if (b)
++ {
++ struct S0 f[3][9] =
++ { { { 0 }, { 0 }, { 1 }, { 1 }, { 0 }, { 0 }, { 0 }, { 1 }, { 1 } },
++ { { 0 }, { 0 }, { 1 }, { 1 }, { 0 }, { 0 }, { 0 }, { 1 }, { 1 } },
++ { { 0 }, { 0 }, { 1 }, { 1 }, { 0 }, { 0 }, { 0 }, { 1 }, { 1 } }
++ };
++ b = f[1][8].f0;
++ }
++ struct S0 g[3][9] =
++ { { { 0 }, { 0 }, { 1 }, { 1 }, { 0 }, { 0 }, { 0 }, { 1 }, { 1 } },
++ { { 0 }, { 0 }, { 1 }, { 1 }, { 0 }, { 0 }, { 0 }, { 1 }, { 1 } },
++ { { 0 }, { 0 }, { 1 }, { 1 }, { 0 }, { 0 }, { 0 }, { 1 }, { 1 } }
++ };
++
++ if (g[1][8].f0 != 1)
++ __builtin_abort ();
++
++ return 0;
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.dg/tree-ssa/vrp100.c gcc-6-20160721/gcc/testsuite/gcc.dg/tree-ssa/vrp100.c
+--- gcc-6.1.0/gcc/testsuite/gcc.dg/tree-ssa/vrp100.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.dg/tree-ssa/vrp100.c 2016-05-19 18:42:31.000000000 +0000
+@@ -0,0 +1,32 @@
++/* PR tree-optimization/71031 */
++/* { dg-do compile } */
++/* { dg-options "-Os" } */
++
++int zj;
++int **yr;
++
++void
++nn (void)
++{
++ unsigned int od = 4;
++
++ for (;;)
++ {
++ int lk;
++
++ for (lk = 0; lk < 2; ++lk)
++ {
++ static int cm;
++
++ zj = 0;
++ if (od == 0)
++ return;
++ ++od;
++ for (cm = 0; cm < 2; ++cm)
++ {
++ --od;
++ **yr = 0;
++ }
++ }
++ }
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.dg/tree-ssa/vrp101.c gcc-6-20160721/gcc/testsuite/gcc.dg/tree-ssa/vrp101.c
+--- gcc-6.1.0/gcc/testsuite/gcc.dg/tree-ssa/vrp101.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.dg/tree-ssa/vrp101.c 2016-07-07 07:30:04.000000000 +0000
+@@ -0,0 +1,13 @@
++/* { dg-do compile } */
++/* { dg-options "-O2 -fdump-tree-optimized" } */
++
++int x = 1;
++
++int main ()
++{
++ int t = (1/(1>=x))>>1;
++ if (t != 0) __builtin_abort();
++ return 0;
++}
++
++/* { dg-final { scan-tree-dump "<bb 2>:\[\n\r \]*return 0;" "optimized" } } */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.dg/ubsan/bounds-3.c gcc-6-20160721/gcc/testsuite/gcc.dg/ubsan/bounds-3.c
+--- gcc-6.1.0/gcc/testsuite/gcc.dg/ubsan/bounds-3.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.dg/ubsan/bounds-3.c 2016-05-06 10:54:12.000000000 +0000
+@@ -0,0 +1,22 @@
++/* PR sanitizer/70875 */
++/* { dg-do run } */
++/* { dg-options "-fsanitize=bounds" } */
++
++int
++foo (int n, int k)
++{
++ struct S
++ {
++ int i[n];
++ int value;
++ } s[2];
++ return s[k].value = 0;
++}
++
++int
++main ()
++{
++ return foo (2, 2);
++}
++
++/* { dg-output "index 2 out of bounds for type 'S \\\[2\\\]'" } */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.dg/vect/pr66636.c gcc-6-20160721/gcc/testsuite/gcc.dg/vect/pr66636.c
+--- gcc-6.1.0/gcc/testsuite/gcc.dg/vect/pr66636.c 2015-06-23 13:56:34.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.dg/vect/pr66636.c 2016-05-14 09:25:41.000000000 +0000
+@@ -6,7 +6,8 @@
+
+ struct X { double x; double y; };
+
+-void foo (struct X *x, double px, int s)
++void __attribute__((noinline,noclone))
++foo (struct X *x, double px, int s)
+ {
+ int i;
+ for (i = 0; i < 256; ++i)
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.dg/vect/pr71259.c gcc-6-20160721/gcc/testsuite/gcc.dg/vect/pr71259.c
+--- gcc-6.1.0/gcc/testsuite/gcc.dg/vect/pr71259.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.dg/vect/pr71259.c 2016-06-06 18:47:33.000000000 +0000
+@@ -0,0 +1,28 @@
++/* PR tree-optimization/71259 */
++/* { dg-do run } */
++/* { dg-options "-O3" } */
++/* { dg-additional-options "-mavx" { target avx_runtime } } */
++
++#include "tree-vect.h"
++
++long a, b[1][44][2];
++long long c[44][17][2];
++
++int
++main ()
++{
++ int i, j, k;
++ check_vect ();
++ asm volatile ("" : : : "memory");
++ for (i = 0; i < 44; i++)
++ for (j = 0; j < 17; j++)
++ for (k = 0; k < 2; k++)
++ c[i][j][k] = (30995740 >= *(k + *(j + *b)) != (a != 8)) - 5105075050047261684;
++ asm volatile ("" : : : "memory");
++ for (i = 0; i < 44; i++)
++ for (j = 0; j < 17; j++)
++ for (k = 0; k < 2; k++)
++ if (c[i][j][k] != -5105075050047261684)
++ __builtin_abort ();
++ return 0;
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.dg/vect/pr71264.c gcc-6-20160721/gcc/testsuite/gcc.dg/vect/pr71264.c
+--- gcc-6.1.0/gcc/testsuite/gcc.dg/vect/pr71264.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.dg/vect/pr71264.c 2016-07-07 07:30:04.000000000 +0000
+@@ -0,0 +1,20 @@
++/* { dg-do compile } */
++/* { dg-require-effective-target vect_int } */
++
++typedef unsigned char uint8_t;
++typedef uint8_t footype __attribute__((vector_size(4)));
++
++void test(uint8_t *ptr, uint8_t *mask)
++{
++ footype mv;
++ __builtin_memcpy(&mv, mask, sizeof(mv));
++ for (unsigned i = 0; i < 16; i += 4)
++ {
++ footype temp;
++ __builtin_memcpy(&temp, &ptr[i], sizeof(temp));
++ temp ^= mv;
++ __builtin_memcpy(&ptr[i], &temp, sizeof(temp));
++ }
++}
++
++/* { dg-final { scan-tree-dump "vectorized 1 loops in function" "vect" } } */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.dg/vect/pr71823.c gcc-6-20160721/gcc/testsuite/gcc.dg/vect/pr71823.c
+--- gcc-6.1.0/gcc/testsuite/gcc.dg/vect/pr71823.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.dg/vect/pr71823.c 2016-07-11 20:39:44.000000000 +0000
+@@ -0,0 +1,14 @@
++/* PR tree-optimization/71823 */
++/* { dg-do compile } */
++/* { dg-additional-options "-mfma" { target i?86-*-* x86_64-*-* } } */
++
++float a[4], b[4];
++
++int
++main ()
++{
++ int i;
++ for (i = 0; i < 4; ++i)
++ b[i] = __builtin_fma (1024.0f, 1024.0f, a[i]);
++ return 0;
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.dg/vect/tree-vect.h gcc-6-20160721/gcc/testsuite/gcc.dg/vect/tree-vect.h
+--- gcc-6.1.0/gcc/testsuite/gcc.dg/vect/tree-vect.h 2015-07-08 20:29:26.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.dg/vect/tree-vect.h 2016-05-14 09:25:41.000000000 +0000
+@@ -32,25 +32,26 @@
+ asm volatile (".long 0x10000484");
+ #elif defined(__i386__) || defined(__x86_64__)
+ {
+- unsigned int a, b, c, d, want_level, want_c, want_d;
++ unsigned int a, b, c, d,
++ want_level, want_b = 0, want_c = 0, want_d = 0;
+
+ /* Determine what instruction set we've been compiled for, and detect
+ that we're running with it. This allows us to at least do a compile
+ check for, e.g. SSE4.1 when the machine only supports SSE2. */
+-# ifdef __XOP__
+- want_level = 0x80000001, want_c = bit_XOP, want_d = 0;
++# if defined(__AVX2__)
++ want_level = 7, want_b = bit_AVX2;
+ # elif defined(__AVX__)
+- want_level = 1, want_c = bit_AVX, want_d = 0;
++ want_level = 1, want_c = bit_AVX;
+ # elif defined(__SSE4_1__)
+- want_level = 1, want_c = bit_SSE4_1, want_d = 0;
++ want_level = 1, want_c = bit_SSE4_1;
+ # elif defined(__SSSE3__)
+- want_level = 1, want_c = bit_SSSE3, want_d = 0;
++ want_level = 1, want_c = bit_SSSE3;
+ # else
+- want_level = 1, want_c = 0, want_d = bit_SSE2;
++ want_level = 1, want_d = bit_SSE2;
+ # endif
+
+ if (!__get_cpuid (want_level, &a, &b, &c, &d)
+- || ((c & want_c) | (d & want_d)) == 0)
++ || ((b & want_b) | (c & want_c) | (d & want_d)) == 0)
+ exit (0);
+ }
+ #elif defined(__sparc__)
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/aarch64/noplt_3.c gcc-6-20160721/gcc/testsuite/gcc.target/aarch64/noplt_3.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/aarch64/noplt_3.c 2015-08-07 13:26:23.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/aarch64/noplt_3.c 2016-05-18 12:38:15.000000000 +0000
+@@ -16,5 +16,5 @@
+ dec (a);
+ }
+
+-/* { dg-final { scan-assembler-times "br" 2 } } */
++/* { dg-final { scan-assembler-times "br\t" 2 } } */
+ /* { dg-final { scan-assembler-not "b\t" } } */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/aarch64/pr70809_1.c gcc-6-20160721/gcc/testsuite/gcc.target/aarch64/pr70809_1.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/aarch64/pr70809_1.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/aarch64/pr70809_1.c 2016-05-17 13:08:01.000000000 +0000
+@@ -0,0 +1,18 @@
++/* PR target/70809. */
++/* { dg-do compile } */
++/* { dg-options "-O2 -ftree-vectorize -ffp-contract=off -mtune=xgene1" } */
++
++/* Check that vector FMLS is not generated when contraction is disabled. */
++
++void
++foo (float *__restrict__ __attribute__ ((aligned (16))) a,
++ float *__restrict__ __attribute__ ((aligned (16))) x,
++ float *__restrict__ __attribute__ ((aligned (16))) y,
++ float *__restrict__ __attribute__ ((aligned (16))) z)
++{
++ unsigned i = 0;
++ for (i = 0; i < 256; i++)
++ a[i] = x[i] - (y[i] * z[i]);
++}
++
++/* { dg-final { scan-assembler-not "fmls\tv.*" } } */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/aarch64/simd/vminmaxnm_1.c gcc-6-20160721/gcc/testsuite/gcc.target/aarch64/simd/vminmaxnm_1.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/aarch64/simd/vminmaxnm_1.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/aarch64/simd/vminmaxnm_1.c 2016-07-08 15:41:31.000000000 +0000
+@@ -0,0 +1,82 @@
++/* Test the `v[min|max]nm{q}_f*' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-O2" } */
++
++#include "arm_neon.h"
++
++extern void abort ();
++
++#define CHECK(T, N, R, E) \
++ {\
++ int i = 0;\
++ for (; i < N; i++)\
++ if (* (T *) &R[i] != * (T *) &E[i])\
++ abort ();\
++ }
++
++int
++main (int argc, char **argv)
++{
++ float32x2_t f32x2_input1 = vdup_n_f32 (-1.0);
++ float32x2_t f32x2_input2 = vdup_n_f32 (0.0);
++ float32x2_t f32x2_exp_minnm = vdup_n_f32 (-1.0);
++ float32x2_t f32x2_exp_maxnm = vdup_n_f32 (0.0);
++ float32x2_t f32x2_ret_minnm = vminnm_f32 (f32x2_input1, f32x2_input2);
++ float32x2_t f32x2_ret_maxnm = vmaxnm_f32 (f32x2_input1, f32x2_input2);
++
++ CHECK (uint32_t, 2, f32x2_ret_minnm, f32x2_exp_minnm);
++ CHECK (uint32_t, 2, f32x2_ret_maxnm, f32x2_exp_maxnm);
++
++ f32x2_input1 = vdup_n_f32 (__builtin_nanf (""));
++ f32x2_input2 = vdup_n_f32 (1.0);
++ f32x2_exp_minnm = vdup_n_f32 (1.0);
++ f32x2_exp_maxnm = vdup_n_f32 (1.0);
++ f32x2_ret_minnm = vminnm_f32 (f32x2_input1, f32x2_input2);
++ f32x2_ret_maxnm = vmaxnm_f32 (f32x2_input1, f32x2_input2);
++
++ CHECK (uint32_t, 2, f32x2_ret_minnm, f32x2_exp_minnm);
++ CHECK (uint32_t, 2, f32x2_ret_maxnm, f32x2_exp_maxnm);
++
++ float32x4_t f32x4_input1 = vdupq_n_f32 (-1024.0);
++ float32x4_t f32x4_input2 = vdupq_n_f32 (77.0);
++ float32x4_t f32x4_exp_minnm = vdupq_n_f32 (-1024.0);
++ float32x4_t f32x4_exp_maxnm = vdupq_n_f32 (77.0);
++ float32x4_t f32x4_ret_minnm = vminnmq_f32 (f32x4_input1, f32x4_input2);
++ float32x4_t f32x4_ret_maxnm = vmaxnmq_f32 (f32x4_input1, f32x4_input2);
++
++ CHECK (uint32_t, 4, f32x4_ret_minnm, f32x4_exp_minnm);
++ CHECK (uint32_t, 4, f32x4_ret_maxnm, f32x4_exp_maxnm);
++
++ f32x4_input1 = vdupq_n_f32 (-__builtin_nanf (""));
++ f32x4_input2 = vdupq_n_f32 (-1.0);
++ f32x4_exp_minnm = vdupq_n_f32 (-1.0);
++ f32x4_exp_maxnm = vdupq_n_f32 (-1.0);
++ f32x4_ret_minnm = vminnmq_f32 (f32x4_input1, f32x4_input2);
++ f32x4_ret_maxnm = vmaxnmq_f32 (f32x4_input1, f32x4_input2);
++
++ CHECK (uint32_t, 4, f32x4_ret_minnm, f32x4_exp_minnm);
++ CHECK (uint32_t, 4, f32x4_ret_maxnm, f32x4_exp_maxnm);
++
++ float64x2_t f64x2_input1 = vdupq_n_f64 (1.23);
++ float64x2_t f64x2_input2 = vdupq_n_f64 (4.56);
++ float64x2_t f64x2_exp_minnm = vdupq_n_f64 (1.23);
++ float64x2_t f64x2_exp_maxnm = vdupq_n_f64 (4.56);
++ float64x2_t f64x2_ret_minnm = vminnmq_f64 (f64x2_input1, f64x2_input2);
++ float64x2_t f64x2_ret_maxnm = vmaxnmq_f64 (f64x2_input1, f64x2_input2);
++
++ CHECK (uint64_t, 2, f64x2_ret_minnm, f64x2_exp_minnm);
++ CHECK (uint64_t, 2, f64x2_ret_maxnm, f64x2_exp_maxnm);
++
++ f64x2_input1 = vdupq_n_f64 (-__builtin_nan (""));
++ f64x2_input2 = vdupq_n_f64 (1.0);
++ f64x2_exp_minnm = vdupq_n_f64 (1.0);
++ f64x2_exp_maxnm = vdupq_n_f64 (1.0);
++ f64x2_ret_minnm = vminnmq_f64 (f64x2_input1, f64x2_input2);
++ f64x2_ret_maxnm = vmaxnmq_f64 (f64x2_input1, f64x2_input2);
++
++ CHECK (uint64_t, 2, f64x2_ret_minnm, f64x2_exp_minnm);
++ CHECK (uint64_t, 2, f64x2_ret_maxnm, f64x2_exp_maxnm);
++
++ return 0;
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/aarch64/tail_indirect_call_1.c gcc-6-20160721/gcc/testsuite/gcc.target/aarch64/tail_indirect_call_1.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/aarch64/tail_indirect_call_1.c 2014-05-23 12:13:56.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/aarch64/tail_indirect_call_1.c 2016-05-18 12:38:15.000000000 +0000
+@@ -3,8 +3,8 @@
+
+ typedef void FP (int);
+
+-/* { dg-final { scan-assembler "br" } } */
+-/* { dg-final { scan-assembler-not "blr" } } */
++/* { dg-final { scan-assembler-times "br\t" 2 } } */
++/* { dg-final { scan-assembler-not "blr\t" } } */
+ void
+ f1 (FP fp, int n)
+ {
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/arm/interrupt-1.c gcc-6-20160721/gcc/testsuite/gcc.target/arm/interrupt-1.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/arm/interrupt-1.c 2015-11-06 18:43:15.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/arm/interrupt-1.c 2016-05-12 12:47:03.000000000 +0000
+@@ -1,8 +1,8 @@
+ /* Verify that prologue and epilogue are correct for functions with
+ __attribute__ ((interrupt)). */
+-/* { dg-do compile } */
++/* { dg-do assemble } */
+ /* { dg-require-effective-target arm_nothumb } */
+-/* { dg-options "-O0 -marm" } */
++/* { dg-options "-O0 -marm -save-temps" } */
+
+ /* This test is not valid when -mthumb. */
+ extern void bar (int);
+@@ -14,4 +14,4 @@
+ }
+
+ /* { dg-final { scan-assembler "push\t{r0, r1, r2, r3, r4, fp, ip, lr}" } } */
+-/* { dg-final { scan-assembler "pop\t{r0, r1, r2, r3, r4, fp, ip, pc}\\^" } } */
++/* { dg-final { scan-assembler "ldmfd\tsp!, {r0, r1, r2, r3, r4, fp, ip, pc}\\^" } } */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/arm/interrupt-2.c gcc-6-20160721/gcc/testsuite/gcc.target/arm/interrupt-2.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/arm/interrupt-2.c 2015-11-06 18:43:15.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/arm/interrupt-2.c 2016-05-12 12:47:03.000000000 +0000
+@@ -1,8 +1,8 @@
+ /* Verify that prologue and epilogue are correct for functions with
+ __attribute__ ((interrupt)). */
+-/* { dg-do compile } */
++/* { dg-do assemble } */
+ /* { dg-require-effective-target arm_nothumb } */
+-/* { dg-options "-O1 -marm" } */
++/* { dg-options "-O1 -marm -save-temps" } */
+
+ /* This test is not valid when -mthumb. */
+ extern void bar (int);
+@@ -16,4 +16,4 @@
+ }
+
+ /* { dg-final { scan-assembler "push\t{r0, r1, r2, r3, r4, r5, ip, lr}" } } */
+-/* { dg-final { scan-assembler "pop\t{r0, r1, r2, r3, r4, r5, ip, pc}\\^" } } */
++/* { dg-final { scan-assembler "ldmfd\tsp!, {r0, r1, r2, r3, r4, r5, ip, pc}\\^" } } */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/arm/pr70830.c gcc-6-20160721/gcc/testsuite/gcc.target/arm/pr70830.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/arm/pr70830.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/arm/pr70830.c 2016-05-12 12:47:03.000000000 +0000
+@@ -0,0 +1,14 @@
++/* PR target/70830. */
++/* { dg-do assemble } */
++/* { dg-require-effective-target arm_arm_ok } */
++/* { dg-options "-Os -marm -save-temps" } */
++
++/* This test is not valid when -mthumb. */
++
++extern void prints (char *);
++
++void __attribute__ ((interrupt ("IRQ"))) dm3730_IRQHandler(void)
++{
++ prints("IRQ" );
++}
++/* { dg-final { scan-assembler "ldmfd\tsp!, {r0, r1, r2, r3, ip, pc}\\^" } } */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/arm/pr71056.c gcc-6-20160721/gcc/testsuite/gcc.target/arm/pr71056.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/arm/pr71056.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/arm/pr71056.c 2016-05-31 08:29:39.000000000 +0000
+@@ -0,0 +1,32 @@
++/* PR target/71056. */
++/* { dg-do compile } */
++/* { dg-require-effective-target arm_vfp3_ok } */
++/* { dg-options "-O3 -mfpu=vfpv3" } */
++
++/* Check that compiling for a non-NEON target doesn't try to introduce
++ a NEON vectorized builtin. */
++
++extern char *buff;
++int f2 ();
++struct T1
++{
++ int reserved[2];
++ unsigned int ip;
++ unsigned short cs;
++ unsigned short rsrv2;
++};
++void
++f3 (const char *p)
++{
++ struct T1 x;
++ __builtin_memcpy (&x, p, sizeof (struct T1));
++ x.reserved[0] = __builtin_bswap32 (x.reserved[0]);
++ x.reserved[1] = __builtin_bswap32 (x.reserved[1]);
++ x.ip = __builtin_bswap32 (x.ip);
++ x.cs = x.cs << 8 | x.cs >> 8;
++ x.rsrv2 = x.rsrv2 << 8 | x.rsrv2 >> 8;
++ if (f2 ())
++ {
++ __builtin_memcpy (buff, "\n", 1);
++ }
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/avr/pr50739.c gcc-6-20160721/gcc/testsuite/gcc.target/avr/pr50739.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/avr/pr50739.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/avr/pr50739.c 2016-07-06 13:53:36.000000000 +0000
+@@ -0,0 +1,7 @@
++/* { dg-do compile } */
++/* { dg-options "-fmerge-all-constants" } */
++
++char *ca = "123";
++
++const char a[] __attribute__((__progmem__))= "a";
++const char b[] __attribute__((__progmem__))= "b";
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/avr/pr71103.c gcc-6-20160721/gcc/testsuite/gcc.target/avr/pr71103.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/avr/pr71103.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/avr/pr71103.c 2016-06-20 11:20:27.000000000 +0000
+@@ -0,0 +1,16 @@
++/* { dg-do compile } */
++/* { dg-options "-O1" } */
++
++struct ResponseStruct{
++ unsigned char responseLength;
++ char *response;
++};
++
++static char response[5];
++struct ResponseStruct something(){
++ struct ResponseStruct returnValue;
++ returnValue.responseLength = 5;
++ returnValue.response = response;
++ return returnValue;
++}
++
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/avr/torture/pr71103-2.c gcc-6-20160721/gcc/testsuite/gcc.target/avr/torture/pr71103-2.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/avr/torture/pr71103-2.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/avr/torture/pr71103-2.c 2016-06-20 11:20:27.000000000 +0000
+@@ -0,0 +1,118 @@
++/* Use -g0 so that this test case doesn't just fail because
++ of PR52472. */
++
++/* { dg-do compile } */
++/* { dg-options "-std=gnu99 -g0" } */
++
++struct S12
++{
++ char c;
++ const char *p;
++};
++
++struct S12f
++{
++ char c;
++ struct S12f (*f)(void);
++};
++
++struct S12labl
++{
++ char c;
++ void **labl;
++};
++
++struct S121
++{
++ char c;
++ const char *p;
++ char d;
++};
++
++const char str[5] = "abcd";
++
++struct S12 test_S12_0 (void)
++{
++ struct S12 s;
++ s.c = 'A';
++ s.p = str;
++ return s;
++}
++
++struct S12 test_S12_4 (void)
++{
++ struct S12 s;
++ s.c = 'A';
++ s.p = str + 4;
++ return s;
++}
++
++struct S12f test_S12f (void)
++{
++ struct S12f s;
++ s.c = 'A';
++ s.f = test_S12f;
++ return s;
++}
++
++struct S121 test_S121 (void)
++{
++ struct S121 s;
++ s.c = 'c';
++ s.p = str + 4;
++ s.d = 'd';
++ return s;
++}
++
++extern void use_S12lab (struct S12labl*);
++
++struct S12labl test_S12lab (void)
++{
++ struct S12labl s;
++labl:;
++ s.c = 'A';
++ s.labl = &&labl;
++ return s;
++}
++
++#ifdef __MEMX
++
++struct S13
++{
++ char c;
++ const __memx char *p;
++};
++
++const __memx char str_x[] = "abcd";
++
++struct S13 test_S13_0 (void)
++{
++ struct S13 s;
++ s.c = 'A';
++ s.p = str_x;
++ return s;
++}
++
++struct S13 test_S13_4a (void)
++{
++ struct S13 s;
++ s.c = 'A';
++ s.p = str_x + 4;
++ return s;
++}
++
++#ifdef __FLASH1
++
++const __flash1 char str_1[] = "abcd";
++
++struct S13 test_13_4b (void)
++{
++ struct S13 s;
++ s.c = 'A';
++ s.p = str_1 + 4;
++ return s;
++}
++
++#endif /* have __flash1 */
++#endif /* have __memx */
++
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/i386/avx-pr71559.c gcc-6-20160721/gcc/testsuite/gcc.target/i386/avx-pr71559.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/i386/avx-pr71559.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/i386/avx-pr71559.c 2016-07-02 10:18:27.000000000 +0000
+@@ -0,0 +1,8 @@
++/* PR target/71559 */
++/* { dg-do run { target avx } } */
++/* { dg-options "-O2 -ftree-vectorize -mavx" } */
++
++#include "avx-check.h"
++#define PR71559_TEST avx_test
++
++#include "sse2-pr71559.c"
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/i386/avx512f-ceil-vec-1.c gcc-6-20160721/gcc/testsuite/gcc.target/i386/avx512f-ceil-vec-1.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/i386/avx512f-ceil-vec-1.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/i386/avx512f-ceil-vec-1.c 2016-06-08 13:06:24.000000000 +0000
+@@ -0,0 +1,52 @@
++/* { dg-do run } */
++/* { dg-options "-O2 -ffast-math -ftree-vectorize -mavx512f" } */
++/* { dg-require-effective-target avx512f } */
++/* { dg-skip-if "no M_PI" { vxworks_kernel } } */
++
++#define __NO_MATH_INLINES
++#include <math.h>
++#include "avx512f-check.h"
++
++#define NUM 64
++
++static void
++__attribute__((__target__("fpmath=sse")))
++init_src (double *src)
++{
++ int i, sign = 1;
++ double f = rand ();
++
++ for (i = 0; i < NUM; i++)
++ {
++ src[i] = (i + 1) * f * M_PI * sign;
++ if (i < (NUM / 2))
++ {
++ if ((i % 6) == 0)
++ f = f * src[i];
++ }
++ else if (i == (NUM / 2))
++ f = rand ();
++ else if ((i % 6) == 0)
++ f = 1 / (f * (i + 1) * src[i] * M_PI * sign);
++ sign = -sign;
++ }
++}
++
++static void
++__attribute__((__target__("fpmath=387")))
++avx512f_test (void)
++{
++ double a[NUM];
++ double r[NUM];
++ int i;
++
++ init_src (a);
++
++ for (i = 0; i < NUM; i++)
++ r[i] = ceil (a[i]);
++
++ /* check results: */
++ for (i = 0; i < NUM; i++)
++ if (r[i] != ceil (a[i]))
++ abort();
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/i386/avx512f-ceil-vec-2.c gcc-6-20160721/gcc/testsuite/gcc.target/i386/avx512f-ceil-vec-2.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/i386/avx512f-ceil-vec-2.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/i386/avx512f-ceil-vec-2.c 2016-06-08 13:06:24.000000000 +0000
+@@ -0,0 +1,6 @@
++/* { dg-do compile } */
++/* { dg-options "-O2 -ffast-math -ftree-vectorize -mavx512f" } */
++
++#include "avx512f-ceil-vec-1.c"
++
++/* { dg-final { scan-assembler-times "vrndscalepd\[^\n\]+zmm\[0-9\](?:\n|\[ \\t\]+#)" 1 } } */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/i386/avx512f-ceilf-sfix-vec-1.c gcc-6-20160721/gcc/testsuite/gcc.target/i386/avx512f-ceilf-sfix-vec-1.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/i386/avx512f-ceilf-sfix-vec-1.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/i386/avx512f-ceilf-sfix-vec-1.c 2016-06-08 13:06:24.000000000 +0000
+@@ -0,0 +1,52 @@
++/* { dg-do run } */
++/* { dg-options "-O2 -ffast-math -ftree-vectorize -mavx512f" } */
++/* { dg-require-effective-target avx512f } */
++/* { dg-skip-if "no M_PI" { vxworks_kernel } } */
++
++#define __NO_MATH_INLINES
++#include <math.h>
++#include "avx512f-check.h"
++
++#define NUM 64
++
++static void
++__attribute__((__target__("fpmath=sse")))
++init_src (float *src)
++{
++ int i, sign = 1;
++ float f = rand ();
++
++ for (i = 0; i < NUM; i++)
++ {
++ src[i] = (i + 1) * f * M_PI * sign;
++ if (i < (NUM / 2))
++ {
++ if ((i % 6) == 0)
++ f = f * src[i];
++ }
++ else if (i == (NUM / 2))
++ f = rand ();
++ else if ((i % 6) == 0)
++ f = 1 / (f * (i + 1) * src[i] * M_PI * sign);
++ sign = -sign;
++ }
++}
++
++static void
++__attribute__((__target__("fpmath=387")))
++avx512f_test (void)
++{
++ float a[NUM];
++ int r[NUM];
++ int i;
++
++ init_src (a);
++
++ for (i = 0; i < NUM; i++)
++ r[i] = (int) ceilf (a[i]);
++
++ /* check results: */
++ for (i = 0; i < NUM; i++)
++ if (r[i] != (int) ceilf (a[i]))
++ abort();
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/i386/avx512f-ceilf-sfix-vec-2.c gcc-6-20160721/gcc/testsuite/gcc.target/i386/avx512f-ceilf-sfix-vec-2.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/i386/avx512f-ceilf-sfix-vec-2.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/i386/avx512f-ceilf-sfix-vec-2.c 2016-06-08 13:06:24.000000000 +0000
+@@ -0,0 +1,7 @@
++/* { dg-do compile } */
++/* { dg-options "-O2 -ffast-math -ftree-vectorize -mavx512f" } */
++
++#include "avx512f-ceilf-sfix-vec-1.c"
++
++/* { dg-final { scan-assembler-times "vrndscaleps\[^\n\]+zmm\[0-9\](?:\n|\[ \\t\]+#)" 1 } } */
++/* { dg-final { scan-assembler-times "vcvttps2dq\[^\n\]+zmm\[0-9\].{7}(?:\n|\[ \\t\]+#)" 1 } } */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/i386/avx512f-ceilf-vec-1.c gcc-6-20160721/gcc/testsuite/gcc.target/i386/avx512f-ceilf-vec-1.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/i386/avx512f-ceilf-vec-1.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/i386/avx512f-ceilf-vec-1.c 2016-06-08 13:06:24.000000000 +0000
+@@ -0,0 +1,52 @@
++/* { dg-do run } */
++/* { dg-options "-O2 -ffast-math -ftree-vectorize -mavx512f" } */
++/* { dg-require-effective-target avx512f } */
++/* { dg-skip-if "no M_PI" { vxworks_kernel } } */
++
++#define __NO_MATH_INLINES
++#include <math.h>
++#include "avx512f-check.h"
++
++#define NUM 64
++
++static void
++__attribute__((__target__("fpmath=sse")))
++init_src (float *src)
++{
++ int i, sign = 1;
++ float f = rand ();
++
++ for (i = 0; i < NUM; i++)
++ {
++ src[i] = (i + 1) * f * M_PI * sign;
++ if (i < (NUM / 2))
++ {
++ if ((i % 6) == 0)
++ f = f * src[i];
++ }
++ else if (i == (NUM / 2))
++ f = rand ();
++ else if ((i % 6) == 0)
++ f = 1 / (f * (i + 1) * src[i] * M_PI * sign);
++ sign = -sign;
++ }
++}
++
++static void
++__attribute__((__target__("fpmath=387")))
++avx512f_test (void)
++{
++ float a[NUM];
++ float r[NUM];
++ int i;
++
++ init_src (a);
++
++ for (i = 0; i < NUM; i++)
++ r[i] = ceilf (a[i]);
++
++ /* check results: */
++ for (i = 0; i < NUM; i++)
++ if (r[i] != ceilf (a[i]))
++ abort();
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/i386/avx512f-ceilf-vec-2.c gcc-6-20160721/gcc/testsuite/gcc.target/i386/avx512f-ceilf-vec-2.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/i386/avx512f-ceilf-vec-2.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/i386/avx512f-ceilf-vec-2.c 2016-06-08 13:06:24.000000000 +0000
+@@ -0,0 +1,6 @@
++/* { dg-do compile } */
++/* { dg-options "-O2 -ffast-math -ftree-vectorize -mavx512f" } */
++
++#include "avx512f-ceilf-vec-1.c"
++
++/* { dg-final { scan-assembler-times "vrndscaleps\[^\n\]+zmm\[0-9\](?:\n|\[ \\t\]+#)" 1 } } */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/i386/avx512f-floor-vec-1.c gcc-6-20160721/gcc/testsuite/gcc.target/i386/avx512f-floor-vec-1.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/i386/avx512f-floor-vec-1.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/i386/avx512f-floor-vec-1.c 2016-06-08 13:06:24.000000000 +0000
+@@ -0,0 +1,52 @@
++/* { dg-do run } */
++/* { dg-options "-O2 -ffast-math -ftree-vectorize -mavx512f" } */
++/* { dg-require-effective-target avx512f } */
++/* { dg-skip-if "no M_PI" { vxworks_kernel } } */
++
++#define __NO_MATH_INLINES
++#include <math.h>
++#include "avx512f-check.h"
++
++#define NUM 64
++
++static void
++__attribute__((__target__("fpmath=sse")))
++init_src (double *src)
++{
++ int i, sign = 1;
++ double f = rand ();
++
++ for (i = 0; i < NUM; i++)
++ {
++ src[i] = (i + 1) * f * M_PI * sign;
++ if (i < (NUM / 2))
++ {
++ if ((i % 6) == 0)
++ f = f * src[i];
++ }
++ else if (i == (NUM / 2))
++ f = rand ();
++ else if ((i % 6) == 0)
++ f = 1 / (f * (i + 1) * src[i] * M_PI * sign);
++ sign = -sign;
++ }
++}
++
++static void
++__attribute__((__target__("fpmath=387")))
++avx512f_test (void)
++{
++ double a[NUM];
++ double r[NUM];
++ int i;
++
++ init_src (a);
++
++ for (i = 0; i < NUM; i++)
++ r[i] = floor (a[i]);
++
++ /* check results: */
++ for (i = 0; i < NUM; i++)
++ if (r[i] != floor (a[i]))
++ abort();
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/i386/avx512f-floor-vec-2.c gcc-6-20160721/gcc/testsuite/gcc.target/i386/avx512f-floor-vec-2.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/i386/avx512f-floor-vec-2.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/i386/avx512f-floor-vec-2.c 2016-06-08 13:06:24.000000000 +0000
+@@ -0,0 +1,6 @@
++/* { dg-do compile } */
++/* { dg-options "-O2 -ffast-math -ftree-vectorize -mavx512f" } */
++
++#include "avx512f-floor-vec-1.c"
++
++/* { dg-final { scan-assembler-times "vrndscalepd\[^\n\]+zmm\[0-9\](?:\n|\[ \\t\]+#)" 1 } } */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/i386/avx512f-floorf-sfix-vec-1.c gcc-6-20160721/gcc/testsuite/gcc.target/i386/avx512f-floorf-sfix-vec-1.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/i386/avx512f-floorf-sfix-vec-1.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/i386/avx512f-floorf-sfix-vec-1.c 2016-06-08 13:06:24.000000000 +0000
+@@ -0,0 +1,52 @@
++/* { dg-do run } */
++/* { dg-options "-O2 -ffast-math -ftree-vectorize -mavx512f" } */
++/* { dg-require-effective-target avx512f } */
++/* { dg-skip-if "no M_PI" { vxworks_kernel } } */
++
++#define __NO_MATH_INLINES
++#include <math.h>
++#include "avx512f-check.h"
++
++#define NUM 64
++
++static void
++__attribute__((__target__("fpmath=sse")))
++init_src (float *src)
++{
++ int i, sign = 1;
++ float f = rand ();
++
++ for (i = 0; i < NUM; i++)
++ {
++ src[i] = (i + 1) * f * M_PI * sign;
++ if (i < (NUM / 2))
++ {
++ if ((i % 6) == 0)
++ f = f * src[i];
++ }
++ else if (i == (NUM / 2))
++ f = rand ();
++ else if ((i % 6) == 0)
++ f = 1 / (f * (i + 1) * src[i] * M_PI * sign);
++ sign = -sign;
++ }
++}
++
++static void
++__attribute__((__target__("fpmath=387")))
++avx512f_test (void)
++{
++ float a[NUM];
++ int r[NUM];
++ int i;
++
++ init_src (a);
++
++ for (i = 0; i < NUM; i++)
++ r[i] = (int) floorf (a[i]);
++
++ /* check results: */
++ for (i = 0; i < NUM; i++)
++ if (r[i] != (int) floorf (a[i]))
++ abort();
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/i386/avx512f-floorf-sfix-vec-2.c gcc-6-20160721/gcc/testsuite/gcc.target/i386/avx512f-floorf-sfix-vec-2.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/i386/avx512f-floorf-sfix-vec-2.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/i386/avx512f-floorf-sfix-vec-2.c 2016-06-08 13:06:24.000000000 +0000
+@@ -0,0 +1,7 @@
++/* { dg-do compile } */
++/* { dg-options "-O2 -ffast-math -ftree-vectorize -mavx512f" } */
++
++#include "avx512f-floorf-sfix-vec-1.c"
++
++/* { dg-final { scan-assembler-times "vrndscaleps\[^\n\]+zmm\[0-9\](?:\n|\[ \\t\]+#)" 1 } } */
++/* { dg-final { scan-assembler-times "vcvttps2dq\[^\n\]+zmm\[0-9\].{7}(?:\n|\[ \\t\]+#)" 1 } } */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/i386/avx512f-floorf-vec-1.c gcc-6-20160721/gcc/testsuite/gcc.target/i386/avx512f-floorf-vec-1.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/i386/avx512f-floorf-vec-1.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/i386/avx512f-floorf-vec-1.c 2016-06-08 13:06:24.000000000 +0000
+@@ -0,0 +1,52 @@
++/* { dg-do run } */
++/* { dg-options "-O2 -ffast-math -ftree-vectorize -mavx512f" } */
++/* { dg-require-effective-target avx512f } */
++/* { dg-skip-if "no M_PI" { vxworks_kernel } } */
++
++#define __NO_MATH_INLINES
++#include <math.h>
++#include "avx512f-check.h"
++
++#define NUM 64
++
++static void
++__attribute__((__target__("fpmath=sse")))
++init_src (float *src)
++{
++ int i, sign = 1;
++ float f = rand ();
++
++ for (i = 0; i < NUM; i++)
++ {
++ src[i] = (i + 1) * f * M_PI * sign;
++ if (i < (NUM / 2))
++ {
++ if ((i % 6) == 0)
++ f = f * src[i];
++ }
++ else if (i == (NUM / 2))
++ f = rand ();
++ else if ((i % 6) == 0)
++ f = 1 / (f * (i + 1) * src[i] * M_PI * sign);
++ sign = -sign;
++ }
++}
++
++static void
++__attribute__((__target__("fpmath=387")))
++avx512f_test (void)
++{
++ float a[NUM];
++ float r[NUM];
++ int i;
++
++ init_src (a);
++
++ for (i = 0; i < NUM; i++)
++ r[i] = floorf (a[i]);
++
++ /* check results: */
++ for (i = 0; i < NUM; i++)
++ if (r[i] != floorf (a[i]))
++ abort();
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/i386/avx512f-floorf-vec-2.c gcc-6-20160721/gcc/testsuite/gcc.target/i386/avx512f-floorf-vec-2.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/i386/avx512f-floorf-vec-2.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/i386/avx512f-floorf-vec-2.c 2016-06-08 13:06:24.000000000 +0000
+@@ -0,0 +1,6 @@
++/* { dg-do compile } */
++/* { dg-options "-O2 -ffast-math -ftree-vectorize -mavx512f" } */
++
++#include "avx512f-floorf-vec-1.c"
++
++/* { dg-final { scan-assembler-times "vrndscaleps\[^\n\]+zmm\[0-9\](?:\n|\[ \\t\]+#)" 1 } } */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/i386/avx512f-pr71559.c gcc-6-20160721/gcc/testsuite/gcc.target/i386/avx512f-pr71559.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/i386/avx512f-pr71559.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/i386/avx512f-pr71559.c 2016-07-02 10:18:27.000000000 +0000
+@@ -0,0 +1,8 @@
++/* PR target/71559 */
++/* { dg-do run { target avx512f } } */
++/* { dg-options "-O2 -ftree-vectorize -mavx512f" } */
++
++#include "avx512f-check.h"
++#define PR71559_TEST avx512f_test
++
++#include "sse2-pr71559.c"
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/i386/avx512f-rint-sfix-vec-1.c gcc-6-20160721/gcc/testsuite/gcc.target/i386/avx512f-rint-sfix-vec-1.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/i386/avx512f-rint-sfix-vec-1.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/i386/avx512f-rint-sfix-vec-1.c 2016-06-08 13:06:24.000000000 +0000
+@@ -0,0 +1,52 @@
++/* { dg-do run } */
++/* { dg-options "-O2 -ffast-math -ftree-vectorize -mavx512f" } */
++/* { dg-require-effective-target avx512f } */
++/* { dg-skip-if "no M_PI" { vxworks_kernel } } */
++
++#define __NO_MATH_INLINES
++#include <math.h>
++#include "avx512f-check.h"
++
++#define NUM 64
++
++static void
++__attribute__((__target__("fpmath=sse")))
++init_src (double *src)
++{
++ int i, sign = 1;
++ double f = rand ();
++
++ for (i = 0; i < NUM; i++)
++ {
++ src[i] = (i + 1) * f * M_PI * sign;
++ if (i < (NUM / 2))
++ {
++ if ((i % 6) == 0)
++ f = f * src[i];
++ }
++ else if (i == (NUM / 2))
++ f = rand ();
++ else if ((i % 6) == 0)
++ f = 1 / (f * (i + 1) * src[i] * M_PI * sign);
++ sign = -sign;
++ }
++}
++
++static void
++__attribute__((__target__("fpmath=387")))
++avx512f_test (void)
++{
++ double a[NUM];
++ int r[NUM];
++ int i;
++
++ init_src (a);
++
++ for (i = 0; i < NUM; i++)
++ r[i] = (int) rint (a[i]);
++
++ /* check results: */
++ for (i = 0; i < NUM; i++)
++ if (r[i] != (int) rint (a[i]))
++ abort();
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/i386/avx512f-rint-sfix-vec-2.c gcc-6-20160721/gcc/testsuite/gcc.target/i386/avx512f-rint-sfix-vec-2.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/i386/avx512f-rint-sfix-vec-2.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/i386/avx512f-rint-sfix-vec-2.c 2016-06-08 13:06:24.000000000 +0000
+@@ -0,0 +1,7 @@
++/* { dg-do compile } */
++/* { dg-options "-O2 -ffast-math -ftree-vectorize -mavx512f" } */
++
++#include "avx512f-rint-sfix-vec-1.c"
++
++/* { dg-final { scan-assembler-times "vcvtpd2dq\[^\n\]+ymm\[0-9\](?:\n|\[ \\t\]+#)" 2 } } */
++/* { dg-final { scan-assembler-times "vinserti64x4\[^\n\]+zmm\[0-9\](?:\n|\[ \\t\]+#)" 1 } } */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/i386/avx512f-rintf-sfix-vec-1.c gcc-6-20160721/gcc/testsuite/gcc.target/i386/avx512f-rintf-sfix-vec-1.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/i386/avx512f-rintf-sfix-vec-1.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/i386/avx512f-rintf-sfix-vec-1.c 2016-06-08 13:06:24.000000000 +0000
+@@ -0,0 +1,52 @@
++/* { dg-do run } */
++/* { dg-options "-O2 -ffast-math -ftree-vectorize -mavx512f" } */
++/* { dg-require-effective-target avx512f } */
++/* { dg-skip-if "no M_PI" { vxworks_kernel } } */
++
++#define __NO_MATH_INLINES
++#include <math.h>
++#include "avx512f-check.h"
++
++#define NUM 64
++
++static void
++__attribute__((__target__("fpmath=sse")))
++init_src (float *src)
++{
++ int i, sign = 1;
++ float f = rand ();
++
++ for (i = 0; i < NUM; i++)
++ {
++ src[i] = (i + 1) * f * M_PI * sign;
++ if (i < (NUM / 2))
++ {
++ if ((i % 6) == 0)
++ f = f * src[i];
++ }
++ else if (i == (NUM / 2))
++ f = rand ();
++ else if ((i % 6) == 0)
++ f = 1 / (f * (i + 1) * src[i] * M_PI * sign);
++ sign = -sign;
++ }
++}
++
++static void
++__attribute__((__target__("fpmath=387")))
++avx512f_test (void)
++{
++ float a[NUM];
++ int r[NUM];
++ int i;
++
++ init_src (a);
++
++ for (i = 0; i < NUM; i++)
++ r[i] = (int) rintf (a[i]);
++
++ /* check results: */
++ for (i = 0; i < NUM; i++)
++ if (r[i] != (int) rintf (a[i]))
++ abort();
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/i386/avx512f-rintf-sfix-vec-2.c gcc-6-20160721/gcc/testsuite/gcc.target/i386/avx512f-rintf-sfix-vec-2.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/i386/avx512f-rintf-sfix-vec-2.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/i386/avx512f-rintf-sfix-vec-2.c 2016-06-08 13:06:24.000000000 +0000
+@@ -0,0 +1,6 @@
++/* { dg-do compile } */
++/* { dg-options "-O2 -ffast-math -ftree-vectorize -mavx512f" } */
++
++#include "avx512f-rintf-sfix-vec-1.c"
++
++/* { dg-final { scan-assembler-times "vcvtps2dq\[^\n\]+zmm\[0-9\](?:\n|\[ \\t\]+#)" 1 } } */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/i386/avx512f-round-sfix-vec-1.c gcc-6-20160721/gcc/testsuite/gcc.target/i386/avx512f-round-sfix-vec-1.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/i386/avx512f-round-sfix-vec-1.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/i386/avx512f-round-sfix-vec-1.c 2016-06-08 13:06:24.000000000 +0000
+@@ -0,0 +1,52 @@
++/* { dg-do run } */
++/* { dg-options "-O2 -ffast-math -ftree-vectorize -mavx512f" } */
++/* { dg-require-effective-target avx512f } */
++/* { dg-skip-if "no M_PI" { vxworks_kernel } } */
++
++#define __NO_MATH_INLINES
++#include <math.h>
++#include "avx512f-check.h"
++
++#define NUM 64
++
++static void
++__attribute__((__target__("fpmath=sse")))
++init_src (double *src)
++{
++ int i, sign = 1;
++ double f = rand ();
++
++ for (i = 0; i < NUM; i++)
++ {
++ src[i] = (i + 1) * f * M_PI * sign;
++ if (i < (NUM / 2))
++ {
++ if ((i % 6) == 0)
++ f = f * src[i];
++ }
++ else if (i == (NUM / 2))
++ f = rand ();
++ else if ((i % 6) == 0)
++ f = 1 / (f * (i + 1) * src[i] * M_PI * sign);
++ sign = -sign;
++ }
++}
++
++static void
++__attribute__((__target__("fpmath=387")))
++avx512f_test (void)
++{
++ double a[NUM];
++ int r[NUM];
++ int i;
++
++ init_src (a);
++
++ for (i = 0; i < NUM; i++)
++ r[i] = (int) round (a[i]);
++
++ /* check results: */
++ for (i = 0; i < NUM; i++)
++ if (r[i] != (int) round (a[i]))
++ abort();
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/i386/avx512f-round-sfix-vec-2.c gcc-6-20160721/gcc/testsuite/gcc.target/i386/avx512f-round-sfix-vec-2.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/i386/avx512f-round-sfix-vec-2.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/i386/avx512f-round-sfix-vec-2.c 2016-06-08 13:06:24.000000000 +0000
+@@ -0,0 +1,7 @@
++/* { dg-do compile } */
++/* { dg-options "-O2 -ffast-math -ftree-vectorize -mavx512f" } */
++
++#include "avx512f-round-sfix-vec-1.c"
++
++/* { dg-final { scan-assembler-times "vrndscalepd\[^\n\]+zmm\[0-9\](?:\n|\[ \\t\]+#)" 2 } } */
++/* { dg-final { scan-assembler-times "vcvttpd2dq\[^\n\]+zmm\[0-9\].{7}(?:\n|\[ \\t\]+#)" 2 } } */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/i386/avx512f-roundf-sfix-vec-1.c gcc-6-20160721/gcc/testsuite/gcc.target/i386/avx512f-roundf-sfix-vec-1.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/i386/avx512f-roundf-sfix-vec-1.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/i386/avx512f-roundf-sfix-vec-1.c 2016-06-08 13:06:24.000000000 +0000
+@@ -0,0 +1,52 @@
++/* { dg-do run } */
++/* { dg-options "-O2 -ffast-math -ftree-vectorize -mavx512f" } */
++/* { dg-require-effective-target avx512f } */
++/* { dg-skip-if "no M_PI" { vxworks_kernel } } */
++
++#define __NO_MATH_INLINES
++#include <math.h>
++#include "avx512f-check.h"
++
++#define NUM 64
++
++static void
++__attribute__((__target__("fpmath=sse")))
++init_src (float *src)
++{
++ int i, sign = 1;
++ float f = rand ();
++
++ for (i = 0; i < NUM; i++)
++ {
++ src[i] = (i + 1) * f * M_PI * sign;
++ if (i < (NUM / 2))
++ {
++ if ((i % 6) == 0)
++ f = f * src[i];
++ }
++ else if (i == (NUM / 2))
++ f = rand ();
++ else if ((i % 6) == 0)
++ f = 1 / (f * (i + 1) * src[i] * M_PI * sign);
++ sign = -sign;
++ }
++}
++
++static void
++__attribute__((__target__("fpmath=387")))
++avx512f_test (void)
++{
++ float a[NUM];
++ int r[NUM];
++ int i;
++
++ init_src (a);
++
++ for (i = 0; i < NUM; i++)
++ r[i] = (int) roundf (a[i]);
++
++ /* check results: */
++ for (i = 0; i < NUM; i++)
++ if (r[i] != (int) roundf (a[i]))
++ abort();
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/i386/avx512f-roundf-sfix-vec-2.c gcc-6-20160721/gcc/testsuite/gcc.target/i386/avx512f-roundf-sfix-vec-2.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/i386/avx512f-roundf-sfix-vec-2.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/i386/avx512f-roundf-sfix-vec-2.c 2016-06-08 13:06:24.000000000 +0000
+@@ -0,0 +1,7 @@
++/* { dg-do compile } */
++/* { dg-options "-O2 -ffast-math -ftree-vectorize -mavx512f" } */
++
++#include "avx512f-roundf-sfix-vec-1.c"
++
++/* { dg-final { scan-assembler-times "vrndscaleps\[^\n\]+zmm\[0-9\](?:\n|\[ \\t\]+#)" 1 } } */
++/* { dg-final { scan-assembler-times "vcvttps2dq\[^\n\]+zmm\[0-9\].{7}(?:\n|\[ \\t\]+#)" 1 } } */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/i386/avx512f-trunc-vec-1.c gcc-6-20160721/gcc/testsuite/gcc.target/i386/avx512f-trunc-vec-1.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/i386/avx512f-trunc-vec-1.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/i386/avx512f-trunc-vec-1.c 2016-06-08 13:06:24.000000000 +0000
+@@ -0,0 +1,52 @@
++/* { dg-do run } */
++/* { dg-options "-O2 -ffast-math -ftree-vectorize -mavx512f" } */
++/* { dg-require-effective-target avx512f } */
++/* { dg-skip-if "no M_PI" { vxworks_kernel } } */
++
++#define __NO_MATH_INLINES
++#include <math.h>
++#include "avx512f-check.h"
++
++#define NUM 64
++
++static void
++__attribute__((__target__("fpmath=sse")))
++init_src (double *src)
++{
++ int i, sign = 1;
++ double f = rand ();
++
++ for (i = 0; i < NUM; i++)
++ {
++ src[i] = (i + 1) * f * M_PI * sign;
++ if (i < (NUM / 2))
++ {
++ if ((i % 6) == 0)
++ f = f * src[i];
++ }
++ else if (i == (NUM / 2))
++ f = rand ();
++ else if ((i % 6) == 0)
++ f = 1 / (f * (i + 1) * src[i] * M_PI * sign);
++ sign = -sign;
++ }
++}
++
++static void
++__attribute__((__target__("fpmath=387")))
++avx512f_test (void)
++{
++ double a[NUM];
++ double r[NUM];
++ int i;
++
++ init_src (a);
++
++ for (i = 0; i < NUM; i++)
++ r[i] = trunc (a[i]);
++
++ /* check results: */
++ for (i = 0; i < NUM; i++)
++ if (r[i] != trunc (a[i]))
++ abort();
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/i386/avx512f-trunc-vec-2.c gcc-6-20160721/gcc/testsuite/gcc.target/i386/avx512f-trunc-vec-2.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/i386/avx512f-trunc-vec-2.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/i386/avx512f-trunc-vec-2.c 2016-06-08 13:06:24.000000000 +0000
+@@ -0,0 +1,6 @@
++/* { dg-do compile } */
++/* { dg-options "-O2 -ffast-math -ftree-vectorize -mavx512f" } */
++
++#include "avx512f-trunc-vec-1.c"
++
++/* { dg-final { scan-assembler-times "vrndscalepd\[^\n\]+zmm\[0-9\](?:\n|\[ \\t\]+#)" 1 } } */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/i386/avx512f-truncf-vec-1.c gcc-6-20160721/gcc/testsuite/gcc.target/i386/avx512f-truncf-vec-1.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/i386/avx512f-truncf-vec-1.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/i386/avx512f-truncf-vec-1.c 2016-06-08 13:06:24.000000000 +0000
+@@ -0,0 +1,52 @@
++/* { dg-do run } */
++/* { dg-options "-O2 -ffast-math -ftree-vectorize -mavx512f" } */
++/* { dg-require-effective-target avx512f } */
++/* { dg-skip-if "no M_PI" { vxworks_kernel } } */
++
++#define __NO_MATH_INLINES
++#include <math.h>
++#include "avx512f-check.h"
++
++#define NUM 64
++
++static void
++__attribute__((__target__("fpmath=sse")))
++init_src (float *src)
++{
++ int i, sign = 1;
++ float f = rand ();
++
++ for (i = 0; i < NUM; i++)
++ {
++ src[i] = (i + 1) * f * M_PI * sign;
++ if (i < (NUM / 2))
++ {
++ if ((i % 6) == 0)
++ f = f * src[i];
++ }
++ else if (i == (NUM / 2))
++ f = rand ();
++ else if ((i % 6) == 0)
++ f = 1 / (f * (i + 1) * src[i] * M_PI * sign);
++ sign = -sign;
++ }
++}
++
++static void
++__attribute__((__target__("fpmath=387")))
++avx512f_test (void)
++{
++ float a[NUM];
++ float r[NUM];
++ int i;
++
++ init_src (a);
++
++ for (i = 0; i < NUM; i++)
++ r[i] = truncf (a[i]);
++
++ /* check results: */
++ for (i = 0; i < NUM; i++)
++ if (r[i] != truncf (a[i]))
++ abort();
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/i386/avx512f-truncf-vec-2.c gcc-6-20160721/gcc/testsuite/gcc.target/i386/avx512f-truncf-vec-2.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/i386/avx512f-truncf-vec-2.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/i386/avx512f-truncf-vec-2.c 2016-06-08 13:06:24.000000000 +0000
+@@ -0,0 +1,6 @@
++/* { dg-do compile } */
++/* { dg-options "-O2 -ffast-math -ftree-vectorize -mavx512f" } */
++
++#include "avx512f-truncf-vec-1.c"
++
++/* { dg-final { scan-assembler-times "vrndscaleps\[^\n\]+zmm\[0-9\](?:\n|\[ \\t\]+#)" 1 } } */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/i386/fabsneg-1.c gcc-6-20160721/gcc/testsuite/gcc.target/i386/fabsneg-1.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/i386/fabsneg-1.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/i386/fabsneg-1.c 2016-05-09 19:03:11.000000000 +0000
+@@ -0,0 +1,36 @@
++/* { dg-do run } */
++/* { dg-require-effective-target lp64 } */
++/* { dg-options "-O2 -mtune=nocona" } */
++
++double x;
++
++void
++__attribute__ ((noinline, noclone))
++test_fabs (double a)
++{
++ asm volatile ("" : "+r" (a));
++ x = __builtin_fabs (a);
++}
++
++void
++__attribute__ ((noinline, noclone))
++test_neg (double a)
++{
++ asm volatile ("" : "+r" (a));
++ x = -a;
++}
++
++int main ()
++{
++ test_fabs (-1.0);
++
++ if (x != 1.0)
++ __builtin_abort ();
++
++ test_neg (-1.0);
++
++ if (x != 1.0)
++ __builtin_abort ();
++
++ return 0;
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/i386/iamcu/args.h gcc-6-20160721/gcc/testsuite/gcc.target/i386/iamcu/args.h
+--- gcc-6.1.0/gcc/testsuite/gcc.target/i386/iamcu/args.h 2015-06-30 16:46:45.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/i386/iamcu/args.h 2016-05-30 14:53:28.000000000 +0000
+@@ -30,7 +30,7 @@
+ /* Clear all scratch integer registers, excluding the one used to return
+ aggregate. */
+ #define clear_non_sret_int_hardware_registers \
+- asm __volatile__ ("xor %%edx, %%ebx\n\t" \
++ asm __volatile__ ("xor %%edx, %%edx\n\t" \
+ "xor %%ecx, %%ecx\n\t" \
+ ::: "edx", "ecx");
+
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/i386/pr68657.c gcc-6-20160721/gcc/testsuite/gcc.target/i386/pr68657.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/i386/pr68657.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/i386/pr68657.c 2016-06-14 14:44:28.000000000 +0000
+@@ -0,0 +1,15 @@
++/* PR c/68657 */
++/* { dg-options "-mno-avx512f -Werror=psabi" } */
++
++typedef int V __attribute__((vector_size (64)));
++
++void foo (V x, V *y) { /* { dg-error "AVX512F vector argument without AVX512F enabled" } */
++ *y = x;
++}
++
++V bar (V *x) { /* { dg-error "AVX512F vector return without AVX512F enabled" } */
++ return *x;
++}
++
++/* { dg-message "The ABI for passing parameters with 64-byte alignment has changed" "" { target *-*-* } 6 } */
++/* { dg-message "some warnings being treated as errors" "" { target *-*-* } 0 } */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/i386/pr70728.c gcc-6-20160721/gcc/testsuite/gcc.target/i386/pr70728.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/i386/pr70728.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/i386/pr70728.c 2016-04-27 12:09:45.000000000 +0000
+@@ -0,0 +1,30 @@
++/* PR target/70728 */
++/* { dg-do compile } */
++/* { dg-options "-S -Ofast -march=knl" } */
++
++short a = -15726;
++int b = (int)-7003557328690506537LL;
++short c[5][5][3][6];
++char d[2][5][3][2][4];
++void fn1() {
++ for (int e = 0; e < 3; e = e + 1)
++ for (int f = 0; f < 2; f = f + 1)
++ for (int g = 0; g < 4; g = g + 1)
++ for (int h = 0; h < 3; h = h + 1)
++ for (int i = 0; i < 2; i = i + 1)
++ for (int j = 0; j < 4; j = j + 1)
++ d[f][g][h][i][j] =
++ 7 << (1236110361944357083 >> a + 15728) - 309027590486089270 >>
++ (c[e][f][h][j] + 2147483647 << ~b - 7003557328690506536) -
++ 2147480981;
++}
++int main() {
++ for (int k = 0; k < 5; ++k)
++ for (int l = 0; l < 5; ++l)
++ for (int m = 0; m < 3; ++m)
++ for (int n = 0; n < 4; ++n)
++ c[k][l][m][n] = -2639;
++ fn1();
++}
++
++/* { dg-final { scan-assembler-not "sll\[ \\t\]+\[^\n\]*%\.mm(?:1\[6-9\]|\[2-3\]\[0-9\])" } } */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/i386/pr70750-1.c gcc-6-20160721/gcc/testsuite/gcc.target/i386/pr70750-1.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/i386/pr70750-1.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/i386/pr70750-1.c 2016-04-27 13:35:03.000000000 +0000
+@@ -0,0 +1,11 @@
++/* { dg-do compile { target *-*-linux* } } */
++/* { dg-options "-O2" } */
++
++int
++f (int (**p) (void))
++{
++ return p[1]();
++}
++
++/* { dg-final { scan-assembler "jmp\[ \t\].*\\(%rdi\\)" { target { lp64 } } } } */
++/* { dg-final { scan-assembler "jmp\[ \t\]\\*%rax" { target { x32 } } } } */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/i386/pr70750-2.c gcc-6-20160721/gcc/testsuite/gcc.target/i386/pr70750-2.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/i386/pr70750-2.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/i386/pr70750-2.c 2016-04-27 13:35:03.000000000 +0000
+@@ -0,0 +1,11 @@
++/* { dg-do compile { target *-*-linux* } } */
++/* { dg-options "-O2" } */
++
++int
++f (int (**p) (void))
++{
++ return -p[1]();
++}
++
++/* { dg-final { scan-assembler "call\[ \t\].*\\(%rdi\\)" { target { lp64 } } } } */
++/* { dg-final { scan-assembler "call\[ \t\]\\*%rax" { target { x32 } } } } */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/i386/pr70858.c gcc-6-20160721/gcc/testsuite/gcc.target/i386/pr70858.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/i386/pr70858.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/i386/pr70858.c 2016-04-28 19:45:48.000000000 +0000
+@@ -0,0 +1,45 @@
++/* PR target/70858 */
++/* { dg-do compile } */
++/* { dg-options "-O2 -mlwp -mbmi -mtbm -mbmi2 -std=gnu11" } */
++
++void
++f1 (unsigned long long x, unsigned int y)
++{
++ __builtin_ia32_lwpval64 (x, y, 1); /* { dg-warning "implicit declaration of function .__builtin_ia32_lwpval64." "" { target ia32 } } */
++}
++
++char
++f2 (unsigned long long x, unsigned int y)
++{
++ return __builtin_ia32_lwpins64 (x, y, 1); /* { dg-warning "implicit declaration of function .__builtin_ia32_lwpins64." "" { target ia32 } } */
++}
++
++unsigned long long
++f3 (unsigned long long x, unsigned long long y)
++{
++ return __builtin_ia32_bextr_u64 (x, y); /* { dg-warning "implicit declaration of function .__builtin_ia32_bextr_u64." "" { target ia32 } } */
++}
++
++unsigned long long
++f4 (unsigned long long x)
++{
++ return __builtin_ia32_bextri_u64 (x, 1); /* { dg-warning "implicit declaration of function .__builtin_ia32_bextri_u64." "" { target ia32 } } */
++}
++
++unsigned long long
++f5 (unsigned long long x, unsigned long long y)
++{
++ return __builtin_ia32_bzhi_di (x, y); /* { dg-warning "implicit declaration of function .__builtin_ia32_bzhi_di." "" { target ia32 } } */
++}
++
++unsigned long long
++f6 (unsigned long long x, unsigned long long y)
++{
++ return __builtin_ia32_pdep_di (x, y); /* { dg-warning "implicit declaration of function .__builtin_ia32_pdep_di." "" { target ia32 } } */
++}
++
++unsigned long long
++f7 (unsigned long long x, unsigned long long y)
++{
++ return __builtin_ia32_pext_di (x, y); /* { dg-warning "implicit declaration of function .__builtin_ia32_pext_di." "" { target ia32 } } */
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/i386/pr70876.c gcc-6-20160721/gcc/testsuite/gcc.target/i386/pr70876.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/i386/pr70876.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/i386/pr70876.c 2016-05-11 09:51:49.000000000 +0000
+@@ -0,0 +1,13 @@
++/* { dg-do compile { target { ! x32 } } } */
++/* { dg-options "-fcheck-pointer-bounds -mmpx -Wno-implicit-function-declaration" } */
++
++void f (char *s1, char *s2)
++{
++ int z = 5;
++
++ struct { char a[z]; } x;
++
++ s1[0] = s2[0];
++
++ foo (x, x);
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/i386/pr70877.c gcc-6-20160721/gcc/testsuite/gcc.target/i386/pr70877.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/i386/pr70877.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/i386/pr70877.c 2016-05-11 09:55:55.000000000 +0000
+@@ -0,0 +1,14 @@
++/* { dg-do compile { target { ! x32 } } } */
++/* { dg-options "-fcheck-pointer-bounds -mmpx" } */
++
++int foo(int);
++
++typedef struct {
++ double d;
++ int a;
++} str_t;
++
++void bar(double d, int i, str_t s)
++{
++ d = ((double (*) (int)) foo) (i); /* { dg-warning "function called through a non-compatible type" } */
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/i386/pr71529.C gcc-6-20160721/gcc/testsuite/gcc.target/i386/pr71529.C
+--- gcc-6.1.0/gcc/testsuite/gcc.target/i386/pr71529.C 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/i386/pr71529.C 2016-06-20 11:35:02.000000000 +0000
+@@ -0,0 +1,22 @@
++/* PR71529 */
++/* { dg-do compile { target { ! x32 } } } */
++/* { dg-options "-fcheck-pointer-bounds -mmpx -O2" } */
++
++class c1
++{
++ public:
++ virtual ~c1 ();
++};
++
++class c2
++{
++ public:
++ virtual ~c2 ();
++};
++
++class c3 : c1, c2 { };
++
++int main (int, char **)
++{
++ c3 obj;
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/i386/pr71647.c gcc-6-20160721/gcc/testsuite/gcc.target/i386/pr71647.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/i386/pr71647.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/i386/pr71647.c 2016-06-24 18:46:47.000000000 +0000
+@@ -0,0 +1,32 @@
++/* PR tree-optimization/71647 */
++/* { dg-do compile } */
++/* { dg-options "-O3 -fopenmp-simd -mavx -mno-avx512f -fdump-tree-vect-details" } */
++
++void
++foo (double *a, double *b)
++{
++ int i;
++#pragma omp simd aligned(a,b:4*sizeof(double))
++ for (i = 0; i < 32768; i++)
++ a[i] += b[i];
++}
++
++void
++bar (double *a, double *b)
++{
++ int i;
++#pragma omp simd aligned(a,b:32)
++ for (i = 0; i < 32768; i++)
++ a[i] += b[i];
++}
++
++void
++baz (double *a, double *b)
++{
++ int i;
++#pragma omp simd aligned(a,b:32L)
++ for (i = 0; i < 32768; i++)
++ a[i] += b[i];
++}
++
++/* { dg-final { scan-tree-dump-not "Alignment of access forced using peeling" "vect" } } */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/i386/sse2-pr71559.c gcc-6-20160721/gcc/testsuite/gcc.target/i386/sse2-pr71559.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/i386/sse2-pr71559.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/i386/sse2-pr71559.c 2016-07-02 10:18:27.000000000 +0000
+@@ -0,0 +1,73 @@
++/* PR target/71559 */
++/* { dg-do run { target sse2 } } */
++/* { dg-options "-O2 -ftree-vectorize -msse2" } */
++
++#ifndef PR71559_TEST
++#include "sse2-check.h"
++#define PR71559_TEST sse2_test
++#endif
++
++#define N 16
++float a[N] = { 5.0f, -3.0f, 1.0f, __builtin_nanf (""), 9.0f, 7.0f, -3.0f, -9.0f,
++ -3.0f, -5.0f, -9.0f, __builtin_nanf (""), 0.5f, -0.5f, 0.0f, 0.0f };
++float b[N] = { -5.0f, 3.0f, 1.0f, 7.0f, 8.0f, 8.0f, -3.0f, __builtin_nanf (""),
++ -4.0f, -4.0f, -9.0f, __builtin_nanf (""), 0.0f, 0.0f, 0.0f, __builtin_nanf ("") };
++int c[N], d[N];
++
++#define FN(name, op) \
++void \
++name (void) \
++{ \
++ int i; \
++ for (i = 0; i < N; i++) \
++ c[i] = (op || d[i] > 37) ? 5 : 32; \
++}
++FN (eq, a[i] == b[i])
++FN (ne, a[i] != b[i])
++FN (gt, a[i] > b[i])
++FN (ge, a[i] >= b[i])
++FN (lt, a[i] < b[i])
++FN (le, a[i] <= b[i])
++FN (unle, !__builtin_isgreater (a[i], b[i]))
++FN (unlt, !__builtin_isgreaterequal (a[i], b[i]))
++FN (unge, !__builtin_isless (a[i], b[i]))
++FN (ungt, !__builtin_islessequal (a[i], b[i]))
++FN (uneq, !__builtin_islessgreater (a[i], b[i]))
++FN (ordered, !__builtin_isunordered (a[i], b[i]))
++FN (unordered, __builtin_isunordered (a[i], b[i]))
++
++#define TEST(name, GT, LT, EQ, UO) \
++ name (); \
++ for (i = 0; i < N; i++) \
++ { \
++ int v; \
++ switch (i % 4) \
++ { \
++ case 0: v = GT ? 5 : 32; break; \
++ case 1: v = LT ? 5 : 32; break; \
++ case 2: v = EQ ? 5 : 32; break; \
++ case 3: v = UO ? 5 : 32; break; \
++ } \
++ if (c[i] != v) \
++ __builtin_abort (); \
++ }
++
++void
++PR71559_TEST (void)
++{
++ int i;
++ asm volatile ("" : : "g" (a), "g" (b), "g" (c), "g" (d) : "memory");
++ TEST (eq, 0, 0, 1, 0)
++ TEST (ne, 1, 1, 0, 1)
++ TEST (gt, 1, 0, 0, 0)
++ TEST (ge, 1, 0, 1, 0)
++ TEST (lt, 0, 1, 0, 0)
++ TEST (le, 0, 1, 1, 0)
++ TEST (unle, 0, 1, 1, 1)
++ TEST (unlt, 0, 1, 0, 1)
++ TEST (unge, 1, 0, 1, 1)
++ TEST (ungt, 1, 0, 0, 1)
++ TEST (uneq, 0, 0, 1, 1)
++ TEST (ordered, 1, 1, 1, 0)
++ TEST (unordered, 0, 0, 0, 1)
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/abs128-1.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/abs128-1.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/abs128-1.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/abs128-1.c 2016-07-01 17:19:15.000000000 +0000
+@@ -0,0 +1,61 @@
++/* { dg-do run { target { powerpc64*-*-* && vsx_hw } } } */
++/* { dg-options "-mfloat128 -mvsx" } */
++
++void abort ();
++
++typedef unsigned long long int uint64_t;
++
++typedef union
++{
++ __float128 value;
++
++ struct
++ {
++#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
++ unsigned negative:1;
++ unsigned exponent:15;
++ unsigned quiet_nan:1;
++ uint64_t mant_high:47;
++ uint64_t mant_low:64;
++#else
++ uint64_t mant_low:64;
++ uint64_t mant_high:47;
++ unsigned quiet_nan:1;
++ unsigned exponent:15;
++ unsigned negative:1;
++#endif
++ } nan;
++
++} ieee854_float128;
++
++int
++main (int argc, int *argv[])
++{
++ ieee854_float128 x, z;
++
++ x.nan.negative = 1;
++ x.nan.exponent = 0x22;
++ x.nan.quiet_nan = 0;
++ x.nan.mant_high = 0x1234;
++ x.nan.mant_low = 0xabcdef;
++
++ z.value = __builtin_fabsq (x.value);
++
++ if (z.nan.negative != 0
++ || z.nan.exponent != 0x22
++ || z.nan.quiet_nan != 0
++ || z.nan.mant_high != 0x1234
++ || z.nan.mant_low != 0xabcdef)
++ abort ();
++
++ z.value = __builtin_fabsq (z.value);
++
++ if (z.nan.negative != 0
++ || z.nan.exponent != 0x22
++ || z.nan.quiet_nan != 0
++ || z.nan.mant_high != 0x1234
++ || z.nan.mant_low != 0xabcdef)
++ abort ();
++
++ return 0;
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/copysign128-1.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/copysign128-1.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/copysign128-1.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/copysign128-1.c 2016-07-01 17:19:15.000000000 +0000
+@@ -0,0 +1,58 @@
++/* { dg-do run { target { powerpc64*-*-* && vsx_hw } } } */
++/* { dg-options "-mfloat128 -mvsx" } */
++
++void abort ();
++
++typedef unsigned long long int uint64_t;
++
++typedef union
++{
++ __float128 value;
++
++ struct
++ {
++#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
++ unsigned negative:1;
++ unsigned exponent:15;
++ unsigned quiet_nan:1;
++ uint64_t mant_high:47;
++ uint64_t mant_low:64;
++#else
++ uint64_t mant_low:64;
++ uint64_t mant_high:47;
++ unsigned quiet_nan:1;
++ unsigned exponent:15;
++ unsigned negative:1;
++#endif
++ } nan;
++
++} ieee854_float128;
++
++int
++main (int argc, int *argv[])
++{
++ ieee854_float128 x, y, z;
++
++ x.nan.negative = 0;
++ x.nan.exponent = 0x22;
++ x.nan.quiet_nan = 0;
++ x.nan.mant_high = 0x1234;
++ x.nan.mant_low = 0xabcdef;
++
++ y.nan.negative = 1;
++ y.nan.exponent = 0;
++ y.nan.quiet_nan = 0;
++ y.nan.mant_high = 0;
++ y.nan.mant_low = 0;
++
++ z.value = __builtin_copysignq (x.value, y.value);
++
++ if (z.nan.negative != 1
++ || z.nan.exponent != 0x22
++ || z.nan.quiet_nan != 0
++ || z.nan.mant_high != 0x1234
++ || z.nan.mant_low != 0xabcdef)
++ abort ();
++
++ return 0;
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/ctz-3.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/ctz-3.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/ctz-3.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/ctz-3.c 2016-06-01 23:23:42.000000000 +0000
+@@ -0,0 +1,62 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-options "-mcpu=power9 -O2 -ftree-vectorize -fvect-cost-model=dynamic -fno-unroll-loops -fno-unroll-all-loops" } */
++
++#ifndef SIZE
++#define SIZE 1024
++#endif
++
++#ifndef ALIGN
++#define ALIGN 32
++#endif
++
++#define ALIGN_ATTR __attribute__((__aligned__(ALIGN)))
++
++#define DO_BUILTIN(PREFIX, TYPE, CTZ) \
++TYPE PREFIX ## _a[SIZE] ALIGN_ATTR; \
++TYPE PREFIX ## _b[SIZE] ALIGN_ATTR; \
++ \
++void \
++PREFIX ## _ctz (void) \
++{ \
++ unsigned long i; \
++ \
++ for (i = 0; i < SIZE; i++) \
++ PREFIX ## _a[i] = CTZ (PREFIX ## _b[i]); \
++}
++
++#if !defined(DO_LONG_LONG) && !defined(DO_LONG) && !defined(DO_INT) && !defined(DO_SHORT) && !defined(DO_CHAR)
++#define DO_INT 1
++#endif
++
++#if DO_LONG_LONG
++/* At the moment, only int is auto vectorized. */
++DO_BUILTIN (sll, long long, __builtin_ctzll)
++DO_BUILTIN (ull, unsigned long long, __builtin_ctzll)
++#endif
++
++#if defined(_ARCH_PPC64) && DO_LONG
++DO_BUILTIN (sl, long, __builtin_ctzl)
++DO_BUILTIN (ul, unsigned long, __builtin_ctzl)
++#endif
++
++#if DO_INT
++DO_BUILTIN (si, int, __builtin_ctz)
++DO_BUILTIN (ui, unsigned int, __builtin_ctz)
++#endif
++
++#if DO_SHORT
++DO_BUILTIN (ss, short, __builtin_ctz)
++DO_BUILTIN (us, unsigned short, __builtin_ctz)
++#endif
++
++#if DO_CHAR
++DO_BUILTIN (sc, signed char, __builtin_ctz)
++DO_BUILTIN (uc, unsigned char, __builtin_ctz)
++#endif
++
++/* { dg-final { scan-assembler-times "vctzw" 2 } } */
++/* { dg-final { scan-assembler-not "cnttzd" } } */
++/* { dg-final { scan-assembler-not "cnttzw" } } */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/ctz-4.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/ctz-4.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/ctz-4.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/ctz-4.c 2016-06-01 23:23:42.000000000 +0000
+@@ -0,0 +1,110 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-options "-mcpu=power9 -O2" } */
++
++#include <altivec.h>
++
++vector signed char
++count_trailing_zeros_v16qi_1s (vector signed char a)
++{
++ return vec_vctz (a);
++}
++
++vector signed char
++count_trailing_zeros_v16qi_2s (vector signed char a)
++{
++ return vec_vctzb (a);
++}
++
++vector unsigned char
++count_trailing_zeros_v16qi_1u (vector unsigned char a)
++{
++ return vec_vctz (a);
++}
++
++vector unsigned char
++count_trailing_zeros_v16qi_2u (vector unsigned char a)
++{
++ return vec_vctzb (a);
++}
++
++vector short
++count_trailing_zeros_v8hi_1s (vector short a)
++{
++ return vec_vctz (a);
++}
++
++vector short
++count_trailing_zeros_v8hi_2s (vector short a)
++{
++ return vec_vctzh (a);
++}
++
++vector unsigned short
++count_trailing_zeros_v8hi_1u (vector unsigned short a)
++{
++ return vec_vctz (a);
++}
++
++vector unsigned short
++count_trailing_zeros_v8hi_2u (vector unsigned short a)
++{
++ return vec_vctzh (a);
++}
++
++vector int
++count_trailing_zeros_v4si_1s (vector int a)
++{
++ return vec_vctz (a);
++}
++
++vector int
++count_trailing_zeros_v4si_2s (vector int a)
++{
++ return vec_vctzw (a);
++}
++
++vector unsigned int
++count_trailing_zeros_v4si_1u (vector unsigned int a)
++{
++ return vec_vctz (a);
++}
++
++vector unsigned int
++count_trailing_zeros_v4si_2u (vector unsigned int a)
++{
++ return vec_vctzw (a);
++}
++
++vector long long
++count_trailing_zeros_v2di_1s (vector long long a)
++{
++ return vec_vctz (a);
++}
++
++vector long long
++count_trailing_zeros_v2di_2s (vector long long a)
++{
++ return vec_vctzd (a);
++}
++
++vector unsigned long long
++count_trailing_zeros_v2di_1u (vector unsigned long long a)
++{
++ return vec_vctz (a);
++}
++
++vector unsigned long long
++count_trailing_zeros_v2di_2u (vector unsigned long long a)
++{
++ return vec_vctzd (a);
++}
++
++/* { dg-final { scan-assembler "vctzb" } } */
++/* { dg-final { scan-assembler "vctzd" } } */
++/* { dg-final { scan-assembler "vctzh" } } */
++/* { dg-final { scan-assembler "vctzw" } } */
++/* { dg-final { scan-assembler-not "cnttzd" } } */
++/* { dg-final { scan-assembler-not "cnttzw" } } */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/darn-0.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/darn-0.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/darn-0.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/darn-0.c 2016-07-01 20:09:06.000000000 +0000
+@@ -0,0 +1,15 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power9" } */
++
++/* This test should succeed on both 32- and 64-bit configurations. */
++#include <altivec.h>
++
++int get_random ()
++{
++ return __builtin_darn_32 ();
++}
++
++/* { dg-final { scan-assembler "darn" } } */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/darn-1.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/darn-1.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/darn-1.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/darn-1.c 2016-07-01 20:09:06.000000000 +0000
+@@ -0,0 +1,15 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-require-effective-target lp64 } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power9" } */
++
++#include <altivec.h>
++
++long long get_conditioned_random ()
++{
++ return __builtin_darn ();
++}
++
++/* { dg-final { scan-assembler "darn" } } */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/darn-2.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/darn-2.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/darn-2.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/darn-2.c 2016-07-01 20:09:06.000000000 +0000
+@@ -0,0 +1,15 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-require-effective-target lp64 } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power9" } */
++
++#include <altivec.h>
++
++long long get_raw_random ()
++{
++ return __builtin_darn_raw ();
++}
++
++/* { dg-final { scan-assembler "darn" } } */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dform-1.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dform-1.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dform-1.c 2015-11-25 22:49:41.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dform-1.c 2016-06-01 22:09:14.000000000 +0000
+@@ -1,7 +1,7 @@
+ /* { dg-do compile { target { powerpc*-*-* && lp64 } } } */
+ /* { dg-require-effective-target powerpc_p9vector_ok } */
+ /* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
+-/* { dg-options "-mcpu=power9 -mpower9-dform -O2" } */
++/* { dg-options "-mcpu=power9 -mpower9-dform -O2 -mlra" } */
+
+ #ifndef TYPE
+ #define TYPE double
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dform-2.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dform-2.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dform-2.c 2015-11-25 22:49:41.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dform-2.c 2016-06-01 22:09:14.000000000 +0000
+@@ -1,7 +1,7 @@
+ /* { dg-do compile { target { powerpc*-*-* && lp64 } } } */
+ /* { dg-require-effective-target powerpc_p9vector_ok } */
+ /* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
+-/* { dg-options "-mcpu=power9 -mpower9-dform -O2" } */
++/* { dg-options "-mcpu=power9 -mpower9-dform -O2 -mlra" } */
+
+ #ifndef TYPE
+ #define TYPE float
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dform-3.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dform-3.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dform-3.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dform-3.c 2016-06-01 22:15:47.000000000 +0000
+@@ -0,0 +1,39 @@
++/* { dg-do compile { target { powerpc*-*-* && lp64 } } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-options "-mcpu=power9 -mpower9-dform -O2 -mlra" } */
++
++#ifndef TYPE
++#define TYPE vector double
++#endif
++
++struct foo {
++ TYPE a, b, c, d;
++};
++
++/* Test whether ISA 3.0 vector d-form instructions are implemented. */
++void
++add (struct foo *p)
++{
++ p->b = p->c + p->d;
++}
++
++/* Make sure we don't use direct moves to get stuff into GPR registers. */
++void
++gpr (struct foo *p)
++{
++ TYPE x = p->c;
++
++ __asm__ (" # reg = %0" : "+r" (x));
++
++ p->b = x;
++}
++
++/* { dg-final { scan-assembler "lxv " } } */
++/* { dg-final { scan-assembler "stxv " } } */
++/* { dg-final { scan-assembler-not "lxvx " } } */
++/* { dg-final { scan-assembler-not "stxvx " } } */
++/* { dg-final { scan-assembler-not "mfvsrd " } } */
++/* { dg-final { scan-assembler-not "mfvsrld " } } */
++/* { dg-final { scan-assembler "l\[dq\] " } } */
++/* { dg-final { scan-assembler "st\[dq\] " } } */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dfp.exp gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dfp.exp
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dfp.exp 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dfp.exp 2016-07-07 19:42:07.000000000 +0000
+@@ -0,0 +1,39 @@
++# Copyright (C) 2014-2016 Free Software Foundation, Inc.
++#
++# This file is part of GCC.
++#
++# GCC is free software; you can redistribute it and/or modify
++# it under the terms of the GNU General Public License as published by
++# the Free Software Foundation; either version 3, or (at your option)
++# any later version.
++#
++# GCC is distributed in the hope that it will be useful,
++# but WITHOUT ANY WARRANTY; without even the implied warranty of
++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++# GNU General Public License for more details.
++#
++# You should have received a copy of the GNU General Public License
++# along with GCC; see the file COPYING3. If not see
++# <http://www.gnu.org/licenses/>.
++
++# Exit immediately if this isn't a PowerPC target.
++if { ![istarget powerpc*-*-*] && ![istarget rs6000-*-*] } then {
++ return
++}
++
++global DEFAULT_CFLAGS
++if ![info exists DEFAULT_CFLAGS] then {
++ set DEFAULT_CFLAGS " -ansi -pedantic-errors"
++}
++
++# Load support procs.
++load_lib gcc-dg.exp
++load_lib torture-options.exp
++
++# Initialize.
++dg-init
++
++dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.c*]] "" $DEFAULT_CFLAGS
++
++# All done.
++dg-finish
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-0.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-0.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-0.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-0.c 2016-07-07 19:42:07.000000000 +0000
+@@ -0,0 +1,17 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power9" } */
++
++/* This test should succeed on both 32- and 64-bit configurations. */
++#include <altivec.h>
++
++int doTestBCDSignificance (_Decimal64 *p)
++{
++ _Decimal64 source = *p;
++
++ return __builtin_dfp_dtstsfi_lt (5, source);
++}
++
++/* { dg-final { scan-assembler "dtstsfi" } } */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-1.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-1.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-1.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-1.c 2016-07-07 19:42:07.000000000 +0000
+@@ -0,0 +1,15 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power8" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power8" } */
++
++#include <altivec.h>
++
++int doTestBCDSignificance (_Decimal64 *p)
++{
++ _Decimal64 source = *p;
++
++ return __builtin_dfp_dtstsfi_lt (5, source); /* { dg-error "Builtin function __builtin_dtstsfi_lt_dd requires" } */
++}
++
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-10.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-10.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-10.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-10.c 2016-07-07 19:42:07.000000000 +0000
+@@ -0,0 +1,17 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power9" } */
++
++/* This test should succeed on both 32- and 64-bit configurations. */
++#include <altivec.h>
++
++int doTestBCDSignificance (_Decimal64 *p)
++{
++ _Decimal64 source = *p;
++
++ return __builtin_dfp_dtstsfi_lt_dd (5, source);
++}
++
++/* { dg-final { scan-assembler "dtstsfi" } } */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-11.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-11.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-11.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-11.c 2016-07-07 19:42:07.000000000 +0000
+@@ -0,0 +1,15 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power8" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power8" } */
++
++#include <altivec.h>
++
++int doTestBCDSignificance (_Decimal64 *p)
++{
++ _Decimal64 source = *p;
++
++ return __builtin_dfp_dtstsfi_lt_dd (5, source); /* { dg-error "Builtin function __builtin_dtstsfi_lt_dd requires" } */
++}
++
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-12.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-12.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-12.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-12.c 2016-07-07 19:42:07.000000000 +0000
+@@ -0,0 +1,15 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power9" } */
++
++#include <altivec.h>
++
++int doTestBCDSignificance (_Decimal64 *p)
++{
++ _Decimal64 source = *p;
++
++ return __builtin_dfp_dtstsfi_lt_dd (65, source); /* { dg-error "argument 1 must be a 6-bit unsigned literal" } */
++}
++
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-13.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-13.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-13.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-13.c 2016-07-07 19:42:07.000000000 +0000
+@@ -0,0 +1,20 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power9" } */
++
++#include <altivec.h>
++
++int doTestBCDSignificance (_Decimal64 *p)
++{
++ _Decimal64 source = *p;
++
++ if (__builtin_dfp_dtstsfi_lt_dd (63, source))
++ return 3;
++ else
++ return 5;
++}
++
++/* { dg-final { scan-assembler "dtstsfi" } } */
++
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-14.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-14.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-14.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-14.c 2016-07-07 19:42:07.000000000 +0000
+@@ -0,0 +1,15 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power9" } */
++
++#include <altivec.h>
++
++int doTestBCDSignificance (_Decimal64 *p, unsigned int significance)
++{
++ _Decimal64 source = *p;
++
++ return __builtin_dfp_dtstsfi_lt_dd (significance, source); /* { dg-error "argument 1 must be a 6-bit unsigned literal" } */
++}
++
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-15.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-15.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-15.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-15.c 2016-07-07 19:42:07.000000000 +0000
+@@ -0,0 +1,18 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power9" } */
++
++/* This test should succeed on both 32- and 64-bit configurations. */
++#include <altivec.h>
++
++int doTestBCDSignificance (_Decimal128 *p)
++{
++ _Decimal128 source = *p;
++
++ return __builtin_dfp_dtstsfi_lt_td (5, source);
++}
++
++/* { dg-final { scan-assembler "dtstsfiq" } } */
++
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-16.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-16.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-16.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-16.c 2016-07-07 19:42:07.000000000 +0000
+@@ -0,0 +1,16 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power8" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power8" } */
++
++#include <altivec.h>
++
++int doTestBCDSignificance (_Decimal128 *p)
++{
++ _Decimal128 source = *p;
++
++ return __builtin_dfp_dtstsfi_lt_td (5, source); /* { dg-error "Builtin function __builtin_dtstsfi_lt_td requires" } */
++}
++
++
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-17.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-17.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-17.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-17.c 2016-07-07 19:42:07.000000000 +0000
+@@ -0,0 +1,16 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power9" } */
++
++#include <altivec.h>
++
++int doTestBCDSignificance (_Decimal128 *p)
++{
++ _Decimal128 source = *p;
++
++ return __builtin_dfp_dtstsfi_lt_td (65, source); /* { dg-error "argument 1 must be a 6-bit unsigned literal" } */
++}
++
++
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-18.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-18.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-18.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-18.c 2016-07-07 19:42:07.000000000 +0000
+@@ -0,0 +1,20 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power9" } */
++
++#include <altivec.h>
++
++int doTestBCDSignificance (_Decimal128 *p)
++{
++ _Decimal128 source = *p;
++
++ if (__builtin_dfp_dtstsfi_lt_td (63, source))
++ return 3;
++ else
++ return 5;
++}
++
++/* { dg-final { scan-assembler "dtstsfiq" } } */
++
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-19.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-19.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-19.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-19.c 2016-07-07 19:42:07.000000000 +0000
+@@ -0,0 +1,14 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power9" } */
++
++#include <altivec.h>
++
++int doTestBCDSignificance (_Decimal128 *p, unsigned int significance)
++{
++ _Decimal128 source = *p;
++
++ return __builtin_dfp_dtstsfi_lt_td (significance, source); /* { dg-error "argument 1 must be a 6-bit unsigned literal" } */
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-2.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-2.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-2.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-2.c 2016-07-07 19:42:07.000000000 +0000
+@@ -0,0 +1,15 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power9" } */
++
++#include <altivec.h>
++
++int doTestBCDSignificance (_Decimal64 *p)
++{
++ _Decimal64 source = *p;
++
++ return __builtin_dfp_dtstsfi_lt (65, source); /* { dg-error "argument 1 must be a 6-bit unsigned literal" } */
++}
++
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-20.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-20.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-20.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-20.c 2016-07-07 19:42:07.000000000 +0000
+@@ -0,0 +1,17 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power9" } */
++
++/* This test should succeed on both 32- and 64-bit configurations. */
++#include <altivec.h>
++
++int doTestBCDSignificance (_Decimal64 *p)
++{
++ _Decimal64 source = *p;
++
++ return __builtin_dfp_dtstsfi_gt (5, source);
++}
++
++/* { dg-final { scan-assembler "dtstsfi" } } */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-21.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-21.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-21.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-21.c 2016-07-07 19:42:07.000000000 +0000
+@@ -0,0 +1,15 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power8" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power8" } */
++
++#include <altivec.h>
++
++int doTestBCDSignificance (_Decimal64 *p)
++{
++ _Decimal64 source = *p;
++
++ return __builtin_dfp_dtstsfi_gt (5, source); /* { dg-error "Builtin function __builtin_dtstsfi_gt_dd requires" } */
++}
++
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-22.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-22.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-22.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-22.c 2016-07-07 19:42:07.000000000 +0000
+@@ -0,0 +1,15 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power9" } */
++
++#include <altivec.h>
++
++int doTestBCDSignificance (_Decimal64 *p)
++{
++ _Decimal64 source = *p;
++
++ return __builtin_dfp_dtstsfi_gt (65, source); /* { dg-error "argument 1 must be a 6-bit unsigned literal" } */
++}
++
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-23.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-23.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-23.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-23.c 2016-07-07 19:42:07.000000000 +0000
+@@ -0,0 +1,20 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power9" } */
++
++#include <altivec.h>
++
++int doTestBCDSignificance (_Decimal64 *p)
++{
++ _Decimal64 source = *p;
++
++ if (__builtin_dfp_dtstsfi_gt (63, source))
++ return 3;
++ else
++ return 5;
++}
++
++/* { dg-final { scan-assembler "dtstsfi" } } */
++
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-24.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-24.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-24.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-24.c 2016-07-07 19:42:07.000000000 +0000
+@@ -0,0 +1,15 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power9" } */
++
++#include <altivec.h>
++
++int doTestBCDSignificance (_Decimal64 *p, unsigned int significance)
++{
++ _Decimal64 source = *p;
++
++ return __builtin_dfp_dtstsfi_gt (significance, source); /* { dg-error "argument 1 must be a 6-bit unsigned literal" } */
++}
++
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-25.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-25.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-25.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-25.c 2016-07-07 19:42:07.000000000 +0000
+@@ -0,0 +1,18 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power9" } */
++
++/* This test should succeed on both 32- and 64-bit configurations. */
++#include <altivec.h>
++
++int doTestBCDSignificance (_Decimal128 *p)
++{
++ _Decimal128 source = *p;
++
++ return __builtin_dfp_dtstsfi_gt (5, source);
++}
++
++/* { dg-final { scan-assembler "dtstsfiq" } } */
++
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-26.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-26.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-26.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-26.c 2016-07-07 19:42:07.000000000 +0000
+@@ -0,0 +1,16 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power8" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power8" } */
++
++#include <altivec.h>
++
++int doTestBCDSignificance (_Decimal128 *p)
++{
++ _Decimal128 source = *p;
++
++ return __builtin_dfp_dtstsfi_gt (5, source); /* { dg-error "Builtin function __builtin_dtstsfi_gt_td requires" } */
++}
++
++
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-27.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-27.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-27.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-27.c 2016-07-07 19:42:07.000000000 +0000
+@@ -0,0 +1,16 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power9" } */
++
++#include <altivec.h>
++
++int doTestBCDSignificance (_Decimal128 *p)
++{
++ _Decimal128 source = *p;
++
++ return __builtin_dfp_dtstsfi_gt (65, source); /* { dg-error "argument 1 must be a 6-bit unsigned literal" } */
++}
++
++
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-28.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-28.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-28.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-28.c 2016-07-07 19:42:07.000000000 +0000
+@@ -0,0 +1,20 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power9" } */
++
++#include <altivec.h>
++
++int doTestBCDSignificance (_Decimal128 *p)
++{
++ _Decimal128 source = *p;
++
++ if (__builtin_dfp_dtstsfi_gt (63, source))
++ return 3;
++ else
++ return 5;
++}
++
++/* { dg-final { scan-assembler "dtstsfiq" } } */
++
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-29.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-29.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-29.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-29.c 2016-07-07 19:42:07.000000000 +0000
+@@ -0,0 +1,14 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power9" } */
++
++#include <altivec.h>
++
++int doTestBCDSignificance (_Decimal128 *p, unsigned int significance)
++{
++ _Decimal128 source = *p;
++
++ return __builtin_dfp_dtstsfi_gt (significance, source); /* { dg-error "argument 1 must be a 6-bit unsigned literal" } */
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-3.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-3.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-3.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-3.c 2016-07-07 19:42:07.000000000 +0000
+@@ -0,0 +1,20 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power9" } */
++
++#include <altivec.h>
++
++int doTestBCDSignificance (_Decimal64 *p)
++{
++ _Decimal64 source = *p;
++
++ if (__builtin_dfp_dtstsfi_lt (63, source))
++ return 3;
++ else
++ return 5;
++}
++
++/* { dg-final { scan-assembler "dtstsfi" } } */
++
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-30.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-30.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-30.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-30.c 2016-07-07 19:42:07.000000000 +0000
+@@ -0,0 +1,17 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power9" } */
++
++/* This test should succeed on both 32- and 64-bit configurations. */
++#include <altivec.h>
++
++int doTestBCDSignificance (_Decimal64 *p)
++{
++ _Decimal64 source = *p;
++
++ return __builtin_dfp_dtstsfi_gt_dd (5, source);
++}
++
++/* { dg-final { scan-assembler "dtstsfi" } } */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-31.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-31.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-31.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-31.c 2016-07-07 19:42:07.000000000 +0000
+@@ -0,0 +1,15 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power8" } */
++
++#include <altivec.h>
++
++int doTestBCDSignificance (_Decimal64 *p)
++{
++ _Decimal64 source = *p;
++
++ return __builtin_dfp_dtstsfi_gt_dd (5, source); /* { dg-error "Builtin function __builtin_dtstsfi_gt_dd requires" } */
++}
++
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-32.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-32.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-32.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-32.c 2016-07-07 19:42:07.000000000 +0000
+@@ -0,0 +1,15 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power9" } */
++
++#include <altivec.h>
++
++int doTestBCDSignificance (_Decimal64 *p)
++{
++ _Decimal64 source = *p;
++
++ return __builtin_dfp_dtstsfi_gt_dd (65, source); /* { dg-error "argument 1 must be a 6-bit unsigned literal" } */
++}
++
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-33.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-33.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-33.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-33.c 2016-07-07 19:42:07.000000000 +0000
+@@ -0,0 +1,20 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power9" } */
++
++#include <altivec.h>
++
++int doTestBCDSignificance (_Decimal64 *p)
++{
++ _Decimal64 source = *p;
++
++ if (__builtin_dfp_dtstsfi_gt_dd (63, source))
++ return 3;
++ else
++ return 5;
++}
++
++/* { dg-final { scan-assembler "dtstsfi" } } */
++
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-34.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-34.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-34.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-34.c 2016-07-07 19:42:07.000000000 +0000
+@@ -0,0 +1,15 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power9" } */
++
++#include <altivec.h>
++
++int doTestBCDSignificance (_Decimal64 *p, unsigned int significance)
++{
++ _Decimal64 source = *p;
++
++ return __builtin_dfp_dtstsfi_gt_dd (significance, source); /* { dg-error "argument 1 must be a 6-bit unsigned literal" } */
++}
++
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-35.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-35.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-35.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-35.c 2016-07-07 19:42:07.000000000 +0000
+@@ -0,0 +1,18 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power9" } */
++
++/* This test should succeed on both 32- and 64-bit configurations. */
++#include <altivec.h>
++
++int doTestBCDSignificance (_Decimal128 *p)
++{
++ _Decimal128 source = *p;
++
++ return __builtin_dfp_dtstsfi_gt_td (5, source);
++}
++
++/* { dg-final { scan-assembler "dtstsfiq" } } */
++
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-36.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-36.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-36.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-36.c 2016-07-07 19:42:07.000000000 +0000
+@@ -0,0 +1,16 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power8" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power8" } */
++
++#include <altivec.h>
++
++int doTestBCDSignificance (_Decimal128 *p)
++{
++ _Decimal128 source = *p;
++
++ return __builtin_dfp_dtstsfi_gt_td (5, source); /* { dg-error "Builtin function __builtin_dtstsfi_gt_td requires" } */
++}
++
++
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-37.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-37.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-37.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-37.c 2016-07-07 19:42:07.000000000 +0000
+@@ -0,0 +1,16 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power9" } */
++
++#include <altivec.h>
++
++int doTestBCDSignificance (_Decimal128 *p)
++{
++ _Decimal128 source = *p;
++
++ return __builtin_dfp_dtstsfi_gt_td (65, source); /* { dg-error "argument 1 must be a 6-bit unsigned literal" } */
++}
++
++
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-38.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-38.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-38.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-38.c 2016-07-07 19:42:07.000000000 +0000
+@@ -0,0 +1,20 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power9" } */
++
++#include <altivec.h>
++
++int doTestBCDSignificance (_Decimal128 *p)
++{
++ _Decimal128 source = *p;
++
++ if (__builtin_dfp_dtstsfi_gt_td (63, source))
++ return 3;
++ else
++ return 5;
++}
++
++/* { dg-final { scan-assembler "dtstsfiq" } } */
++
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-39.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-39.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-39.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-39.c 2016-07-07 19:42:07.000000000 +0000
+@@ -0,0 +1,14 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power9" } */
++
++#include <altivec.h>
++
++int doTestBCDSignificance (_Decimal128 *p, unsigned int significance)
++{
++ _Decimal128 source = *p;
++
++ return __builtin_dfp_dtstsfi_gt_td (significance, source); /* { dg-error "argument 1 must be a 6-bit unsigned literal" } */
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-4.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-4.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-4.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-4.c 2016-07-07 19:42:07.000000000 +0000
+@@ -0,0 +1,15 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power9" } */
++
++#include <altivec.h>
++
++int doTestBCDSignificance (_Decimal64 *p, unsigned int significance)
++{
++ _Decimal64 source = *p;
++
++ return __builtin_dfp_dtstsfi_lt (significance, source); /* { dg-error "argument 1 must be a 6-bit unsigned literal" } */
++}
++
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-40.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-40.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-40.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-40.c 2016-07-07 19:42:07.000000000 +0000
+@@ -0,0 +1,17 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power9" } */
++
++/* This test should succeed on both 32- and 64-bit configurations. */
++#include <altivec.h>
++
++int doTestBCDSignificance (_Decimal64 *p)
++{
++ _Decimal64 source = *p;
++
++ return __builtin_dfp_dtstsfi_eq (5, source);
++}
++
++/* { dg-final { scan-assembler "dtstsfi" } } */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-41.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-41.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-41.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-41.c 2016-07-07 19:42:07.000000000 +0000
+@@ -0,0 +1,15 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power8" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power8" } */
++
++#include <altivec.h>
++
++int doTestBCDSignificance (_Decimal64 *p)
++{
++ _Decimal64 source = *p;
++
++ return __builtin_dfp_dtstsfi_eq (5, source); /* { dg-error "Builtin function __builtin_dtstsfi_eq_dd requires" } */
++}
++
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-42.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-42.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-42.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-42.c 2016-07-07 19:42:07.000000000 +0000
+@@ -0,0 +1,15 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power9" } */
++
++#include <altivec.h>
++
++int doTestBCDSignificance (_Decimal64 *p)
++{
++ _Decimal64 source = *p;
++
++ return __builtin_dfp_dtstsfi_eq (65, source); /* { dg-error "argument 1 must be a 6-bit unsigned literal" } */
++}
++
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-43.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-43.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-43.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-43.c 2016-07-07 19:42:07.000000000 +0000
+@@ -0,0 +1,20 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power9" } */
++
++#include <altivec.h>
++
++int doTestBCDSignificance (_Decimal64 *p)
++{
++ _Decimal64 source = *p;
++
++ if (__builtin_dfp_dtstsfi_eq (63, source))
++ return 3;
++ else
++ return 5;
++}
++
++/* { dg-final { scan-assembler "dtstsfi" } } */
++
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-44.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-44.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-44.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-44.c 2016-07-07 19:42:07.000000000 +0000
+@@ -0,0 +1,15 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power9" } */
++
++#include <altivec.h>
++
++int doTestBCDSignificance (_Decimal64 *p, unsigned int significance)
++{
++ _Decimal64 source = *p;
++
++ return __builtin_dfp_dtstsfi_eq (significance, source); /* { dg-error "argument 1 must be a 6-bit unsigned literal" } */
++}
++
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-45.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-45.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-45.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-45.c 2016-07-07 19:42:07.000000000 +0000
+@@ -0,0 +1,18 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power9" } */
++
++/* This test should succeed on both 32- and 64-bit configurations. */
++#include <altivec.h>
++
++int doTestBCDSignificance (_Decimal128 *p)
++{
++ _Decimal128 source = *p;
++
++ return __builtin_dfp_dtstsfi_eq (5, source);
++}
++
++/* { dg-final { scan-assembler "dtstsfiq" } } */
++
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-46.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-46.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-46.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-46.c 2016-07-07 19:42:07.000000000 +0000
+@@ -0,0 +1,16 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power8" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power8" } */
++
++#include <altivec.h>
++
++int doTestBCDSignificance (_Decimal128 *p)
++{
++ _Decimal128 source = *p;
++
++ return __builtin_dfp_dtstsfi_eq (5, source); /* { dg-error "Builtin function __builtin_dtstsfi_eq_td requires" } */
++}
++
++
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-47.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-47.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-47.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-47.c 2016-07-07 19:42:07.000000000 +0000
+@@ -0,0 +1,16 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power9" } */
++
++#include <altivec.h>
++
++int doTestBCDSignificance (_Decimal128 *p)
++{
++ _Decimal128 source = *p;
++
++ return __builtin_dfp_dtstsfi_eq (65, source); /* { dg-error "argument 1 must be a 6-bit unsigned literal" } */
++}
++
++
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-48.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-48.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-48.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-48.c 2016-07-07 19:42:07.000000000 +0000
+@@ -0,0 +1,20 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power9" } */
++
++#include <altivec.h>
++
++int doTestBCDSignificance (_Decimal128 *p)
++{
++ _Decimal128 source = *p;
++
++ if (__builtin_dfp_dtstsfi_eq (63, source))
++ return 3;
++ else
++ return 5;
++}
++
++/* { dg-final { scan-assembler "dtstsfiq" } } */
++
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-49.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-49.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-49.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-49.c 2016-07-07 19:42:07.000000000 +0000
+@@ -0,0 +1,14 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power9" } */
++
++#include <altivec.h>
++
++int doTestBCDSignificance (_Decimal128 *p, unsigned int significance)
++{
++ _Decimal128 source = *p;
++
++ return __builtin_dfp_dtstsfi_eq (significance, source); /* { dg-error "argument 1 must be a 6-bit unsigned literal" } */
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-5.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-5.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-5.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-5.c 2016-07-07 19:42:07.000000000 +0000
+@@ -0,0 +1,18 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power9" } */
++
++/* This test should succeed on both 32- and 64-bit configurations. */
++#include <altivec.h>
++
++int doTestBCDSignificance (_Decimal128 *p)
++{
++ _Decimal128 source = *p;
++
++ return __builtin_dfp_dtstsfi_lt (5, source);
++}
++
++/* { dg-final { scan-assembler "dtstsfiq" } } */
++
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-50.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-50.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-50.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-50.c 2016-07-07 19:42:07.000000000 +0000
+@@ -0,0 +1,17 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power9" } */
++
++/* This test should succeed on both 32- and 64-bit configurations. */
++#include <altivec.h>
++
++int doTestBCDSignificance (_Decimal64 *p)
++{
++ _Decimal64 source = *p;
++
++ return __builtin_dfp_dtstsfi_eq_dd (5, source);
++}
++
++/* { dg-final { scan-assembler "dtstsfi" } } */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-51.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-51.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-51.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-51.c 2016-07-07 19:42:07.000000000 +0000
+@@ -0,0 +1,15 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power8" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power8" } */
++
++#include <altivec.h>
++
++int doTestBCDSignificance (_Decimal64 *p)
++{
++ _Decimal64 source = *p;
++
++ return __builtin_dfp_dtstsfi_eq_dd (5, source); /* { dg-error "Builtin function __builtin_dtstsfi_eq_dd requires" } */
++}
++
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-52.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-52.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-52.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-52.c 2016-07-07 19:42:07.000000000 +0000
+@@ -0,0 +1,15 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power9" } */
++
++#include <altivec.h>
++
++int doTestBCDSignificance (_Decimal64 *p)
++{
++ _Decimal64 source = *p;
++
++ return __builtin_dfp_dtstsfi_eq_dd (65, source); /* { dg-error "argument 1 must be a 6-bit unsigned literal" } */
++}
++
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-53.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-53.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-53.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-53.c 2016-07-07 19:42:07.000000000 +0000
+@@ -0,0 +1,20 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power9" } */
++
++#include <altivec.h>
++
++int doTestBCDSignificance (_Decimal64 *p)
++{
++ _Decimal64 source = *p;
++
++ if (__builtin_dfp_dtstsfi_eq_dd (63, source))
++ return 3;
++ else
++ return 5;
++}
++
++/* { dg-final { scan-assembler "dtstsfi" } } */
++
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-54.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-54.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-54.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-54.c 2016-07-07 19:42:07.000000000 +0000
+@@ -0,0 +1,15 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power9" } */
++
++#include <altivec.h>
++
++int doTestBCDSignificance (_Decimal64 *p, unsigned int significance)
++{
++ _Decimal64 source = *p;
++
++ return __builtin_dfp_dtstsfi_eq_dd (significance, source); /* { dg-error "argument 1 must be a 6-bit unsigned literal" } */
++}
++
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-55.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-55.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-55.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-55.c 2016-07-07 19:42:07.000000000 +0000
+@@ -0,0 +1,18 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power9" } */
++
++/* This test should succeed on both 32- and 64-bit configurations. */
++#include <altivec.h>
++
++int doTestBCDSignificance (_Decimal128 *p)
++{
++ _Decimal128 source = *p;
++
++ return __builtin_dfp_dtstsfi_eq_td (5, source);
++}
++
++/* { dg-final { scan-assembler "dtstsfiq" } } */
++
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-56.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-56.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-56.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-56.c 2016-07-07 19:42:07.000000000 +0000
+@@ -0,0 +1,16 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power8" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power8" } */
++
++#include <altivec.h>
++
++int doTestBCDSignificance (_Decimal128 *p)
++{
++ _Decimal128 source = *p;
++
++ return __builtin_dfp_dtstsfi_eq_td (5, source); /* { dg-error "Builtin function __builtin_dtstsfi_eq_td requires" } */
++}
++
++
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-57.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-57.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-57.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-57.c 2016-07-07 19:42:07.000000000 +0000
+@@ -0,0 +1,16 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power9" } */
++
++#include <altivec.h>
++
++int doTestBCDSignificance (_Decimal128 *p)
++{
++ _Decimal128 source = *p;
++
++ return __builtin_dfp_dtstsfi_eq_td (65, source); /* { dg-error "argument 1 must be a 6-bit unsigned literal" } */
++}
++
++
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-58.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-58.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-58.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-58.c 2016-07-07 19:42:07.000000000 +0000
+@@ -0,0 +1,20 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power9" } */
++
++#include <altivec.h>
++
++int doTestBCDSignificance (_Decimal128 *p)
++{
++ _Decimal128 source = *p;
++
++ if (__builtin_dfp_dtstsfi_eq_td (63, source))
++ return 3;
++ else
++ return 5;
++}
++
++/* { dg-final { scan-assembler "dtstsfiq" } } */
++
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-59.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-59.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-59.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-59.c 2016-07-07 19:42:07.000000000 +0000
+@@ -0,0 +1,14 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power9" } */
++
++#include <altivec.h>
++
++int doTestBCDSignificance (_Decimal128 *p, unsigned int significance)
++{
++ _Decimal128 source = *p;
++
++ return __builtin_dfp_dtstsfi_eq_td (significance, source); /* { dg-error "argument 1 must be a 6-bit unsigned literal" } */
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-6.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-6.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-6.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-6.c 2016-07-07 19:42:07.000000000 +0000
+@@ -0,0 +1,16 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power8" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power8" } */
++
++#include <altivec.h>
++
++int doTestBCDSignificance (_Decimal128 *p)
++{
++ _Decimal128 source = *p;
++
++ return __builtin_dfp_dtstsfi_lt (5, source); /* { dg-error "Builtin function __builtin_dtstsfi_lt_td requires" } */
++}
++
++
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-60.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-60.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-60.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-60.c 2016-07-07 19:42:07.000000000 +0000
+@@ -0,0 +1,17 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power9" } */
++
++/* This test should succeed on both 32- and 64-bit configurations. */
++#include <altivec.h>
++
++int doTestBCDSignificance (_Decimal64 *p)
++{
++ _Decimal64 source = *p;
++
++ return __builtin_dfp_dtstsfi_ov (5, source);
++}
++
++/* { dg-final { scan-assembler "dtstsfi" } } */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-61.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-61.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-61.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-61.c 2016-07-07 19:42:07.000000000 +0000
+@@ -0,0 +1,15 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power8" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power8" } */
++
++#include <altivec.h>
++
++int doTestBCDSignificance (_Decimal64 *p)
++{
++ _Decimal64 source = *p;
++
++ return __builtin_dfp_dtstsfi_ov (5, source); /* { dg-error "Builtin function __builtin_dtstsfi_ov_dd requires" } */
++}
++
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-62.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-62.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-62.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-62.c 2016-07-07 19:42:07.000000000 +0000
+@@ -0,0 +1,15 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power9" } */
++
++#include <altivec.h>
++
++int doTestBCDSignificance (_Decimal64 *p)
++{
++ _Decimal64 source = *p;
++
++ return __builtin_dfp_dtstsfi_ov (65, source); /* { dg-error "argument 1 must be a 6-bit unsigned literal" } */
++}
++
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-63.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-63.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-63.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-63.c 2016-07-07 19:42:07.000000000 +0000
+@@ -0,0 +1,20 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power9" } */
++
++#include <altivec.h>
++
++int doTestBCDSignificance (_Decimal64 *p)
++{
++ _Decimal64 source = *p;
++
++ if (__builtin_dfp_dtstsfi_ov (63, source))
++ return 3;
++ else
++ return 5;
++}
++
++/* { dg-final { scan-assembler "dtstsfi" } } */
++
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-64.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-64.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-64.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-64.c 2016-07-07 19:42:07.000000000 +0000
+@@ -0,0 +1,15 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power9" } */
++
++#include <altivec.h>
++
++int doTestBCDSignificance (_Decimal64 *p, unsigned int significance)
++{
++ _Decimal64 source = *p;
++
++ return __builtin_dfp_dtstsfi_ov (significance, source); /* { dg-error "argument 1 must be a 6-bit unsigned literal" } */
++}
++
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-65.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-65.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-65.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-65.c 2016-07-07 19:42:07.000000000 +0000
+@@ -0,0 +1,18 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power9" } */
++
++/* This test should succeed on both 32- and 64-bit configurations. */
++#include <altivec.h>
++
++int doTestBCDSignificance (_Decimal128 *p)
++{
++ _Decimal128 source = *p;
++
++ return __builtin_dfp_dtstsfi_ov (5, source);
++}
++
++/* { dg-final { scan-assembler "dtstsfiq" } } */
++
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-66.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-66.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-66.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-66.c 2016-07-07 19:42:07.000000000 +0000
+@@ -0,0 +1,16 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power8" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power8" } */
++
++#include <altivec.h>
++
++int doTestBCDSignificance (_Decimal128 *p)
++{
++ _Decimal128 source = *p;
++
++ return __builtin_dfp_dtstsfi_ov (5, source); /* { dg-error "Builtin function __builtin_dtstsfi_ov_td requires" } */
++}
++
++
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-67.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-67.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-67.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-67.c 2016-07-07 19:42:07.000000000 +0000
+@@ -0,0 +1,16 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power9" } */
++
++#include <altivec.h>
++
++int doTestBCDSignificance (_Decimal128 *p)
++{
++ _Decimal128 source = *p;
++
++ return __builtin_dfp_dtstsfi_ov (65, source); /* { dg-error "argument 1 must be a 6-bit unsigned literal" } */
++}
++
++
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-68.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-68.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-68.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-68.c 2016-07-07 19:42:07.000000000 +0000
+@@ -0,0 +1,20 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power9" } */
++
++#include <altivec.h>
++
++int doTestBCDSignificance (_Decimal128 *p)
++{
++ _Decimal128 source = *p;
++
++ if (__builtin_dfp_dtstsfi_ov (63, source))
++ return 3;
++ else
++ return 5;
++}
++
++/* { dg-final { scan-assembler "dtstsfiq" } } */
++
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-69.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-69.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-69.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-69.c 2016-07-07 19:42:07.000000000 +0000
+@@ -0,0 +1,14 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power9" } */
++
++#include <altivec.h>
++
++int doTestBCDSignificance (_Decimal128 *p, unsigned int significance)
++{
++ _Decimal128 source = *p;
++
++ return __builtin_dfp_dtstsfi_ov (significance, source); /* { dg-error "argument 1 must be a 6-bit unsigned literal" } */
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-7.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-7.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-7.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-7.c 2016-07-07 19:42:07.000000000 +0000
+@@ -0,0 +1,14 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power9" } */
++
++#include <altivec.h>
++
++int doTestBCDSignificance (_Decimal128 *p)
++{
++ _Decimal128 source = *p;
++
++ return __builtin_dfp_dtstsfi_lt (65, source); /* { dg-error "argument 1 must be a 6-bit unsigned literal" } */
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-70.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-70.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-70.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-70.c 2016-07-07 19:42:07.000000000 +0000
+@@ -0,0 +1,17 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power9" } */
++
++/* This test should succeed on both 32- and 64-bit configurations. */
++#include <altivec.h>
++
++int doTestBCDSignificance (_Decimal64 *p)
++{
++ _Decimal64 source = *p;
++
++ return __builtin_dfp_dtstsfi_ov_dd (5, source);
++}
++
++/* { dg-final { scan-assembler "dtstsfi" } } */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-71.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-71.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-71.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-71.c 2016-07-07 19:42:07.000000000 +0000
+@@ -0,0 +1,15 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power8" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power8" } */
++
++#include <altivec.h>
++
++int doTestBCDSignificance (_Decimal64 *p)
++{
++ _Decimal64 source = *p;
++
++ return __builtin_dfp_dtstsfi_ov_dd (5, source); /* { dg-error "Builtin function __builtin_dtstsfi_ov_dd requires" } */
++}
++
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-72.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-72.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-72.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-72.c 2016-07-07 19:42:07.000000000 +0000
+@@ -0,0 +1,15 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power9" } */
++
++#include <altivec.h>
++
++int doTestBCDSignificance (_Decimal64 *p)
++{
++ _Decimal64 source = *p;
++
++ return __builtin_dfp_dtstsfi_ov_dd (65, source); /* { dg-error "argument 1 must be a 6-bit unsigned literal" } */
++}
++
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-73.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-73.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-73.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-73.c 2016-07-07 19:42:07.000000000 +0000
+@@ -0,0 +1,20 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power9" } */
++
++#include <altivec.h>
++
++int doTestBCDSignificance (_Decimal64 *p)
++{
++ _Decimal64 source = *p;
++
++ if (__builtin_dfp_dtstsfi_ov_dd (63, source))
++ return 3;
++ else
++ return 5;
++}
++
++/* { dg-final { scan-assembler "dtstsfi" } } */
++
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-74.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-74.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-74.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-74.c 2016-07-07 19:42:07.000000000 +0000
+@@ -0,0 +1,15 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power9" } */
++
++#include <altivec.h>
++
++int doTestBCDSignificance (_Decimal64 *p, unsigned int significance)
++{
++ _Decimal64 source = *p;
++
++ return __builtin_dfp_dtstsfi_ov_dd (significance, source); /* { dg-error "argument 1 must be a 6-bit unsigned literal" } */
++}
++
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-75.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-75.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-75.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-75.c 2016-07-07 19:42:07.000000000 +0000
+@@ -0,0 +1,18 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power9" } */
++
++/* This test should succeed on both 32- and 64-bit configurations. */
++#include <altivec.h>
++
++int doTestBCDSignificance (_Decimal128 *p)
++{
++ _Decimal128 source = *p;
++
++ return __builtin_dfp_dtstsfi_ov_td (5, source);
++}
++
++/* { dg-final { scan-assembler "dtstsfiq" } } */
++
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-76.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-76.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-76.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-76.c 2016-07-07 19:42:07.000000000 +0000
+@@ -0,0 +1,16 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power8" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power8" } */
++
++#include <altivec.h>
++
++int doTestBCDSignificance (_Decimal128 *p)
++{
++ _Decimal128 source = *p;
++
++ return __builtin_dfp_dtstsfi_ov_td (5, source); /* { dg-error "Builtin function __builtin_dtstsfi_ov_td requires" } */
++}
++
++
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-77.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-77.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-77.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-77.c 2016-07-07 19:42:07.000000000 +0000
+@@ -0,0 +1,16 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power9" } */
++
++#include <altivec.h>
++
++int doTestBCDSignificance (_Decimal128 *p)
++{
++ _Decimal128 source = *p;
++
++ return __builtin_dfp_dtstsfi_ov_td (65, source); /* { dg-error "argument 1 must be a 6-bit unsigned literal" } */
++}
++
++
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-78.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-78.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-78.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-78.c 2016-07-07 19:42:07.000000000 +0000
+@@ -0,0 +1,20 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power9" } */
++
++#include <altivec.h>
++
++int doTestBCDSignificance (_Decimal128 *p)
++{
++ _Decimal128 source = *p;
++
++ if (__builtin_dfp_dtstsfi_ov_td (63, source))
++ return 3;
++ else
++ return 5;
++}
++
++/* { dg-final { scan-assembler "dtstsfiq" } } */
++
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-79.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-79.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-79.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-79.c 2016-07-07 19:42:07.000000000 +0000
+@@ -0,0 +1,14 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power9" } */
++
++#include <altivec.h>
++
++int doTestBCDSignificance (_Decimal128 *p, unsigned int significance)
++{
++ _Decimal128 source = *p;
++
++ return __builtin_dfp_dtstsfi_ov_td (significance, source); /* { dg-error "argument 1 must be a 6-bit unsigned literal" } */
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-8.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-8.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-8.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-8.c 2016-07-07 19:42:07.000000000 +0000
+@@ -0,0 +1,20 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power9" } */
++
++#include <altivec.h>
++
++int doTestBCDSignificance (_Decimal128 *p)
++{
++ _Decimal128 source = *p;
++
++ if (__builtin_dfp_dtstsfi_lt (63, source))
++ return 3;
++ else
++ return 5;
++}
++
++/* { dg-final { scan-assembler "dtstsfiq" } } */
++
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-9.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-9.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-9.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/dfp/dtstsfi-9.c 2016-07-07 19:42:07.000000000 +0000
+@@ -0,0 +1,14 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power9" } */
++
++#include <altivec.h>
++
++int doTestBCDSignificance (_Decimal128 *p, unsigned int significance)
++{
++ _Decimal128 source = *p;
++
++ return __builtin_dfp_dtstsfi_lt (significance, source); /* { dg-error "argument 1 must be a 6-bit unsigned literal" } */
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/divkc3-1.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/divkc3-1.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/divkc3-1.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/divkc3-1.c 2016-07-15 20:22:23.000000000 +0000
+@@ -0,0 +1,23 @@
++/* { dg-do run { target { powerpc64*-*-* && vsx_hw } } } */
++/* { dg-require-effective-target powerpc_p8vector_ok } */
++/* { dg-options "-mfloat128 -mvsx" } */
++
++void abort ();
++
++typedef __complex float __cfloat128 __attribute__((mode(KC)));
++
++__cfloat128 divide (__cfloat128 x, __cfloat128 y)
++{
++ return x / y;
++}
++
++__cfloat128 z, a;
++
++int main ()
++{
++ z = divide (5.0q + 5.0jq, 2.0q + 1.0jq);
++ a = 3.0q + 1.0jq;
++ if (z != a)
++ abort ();
++ return 0;
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/float128-complex-1.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/float128-complex-1.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/float128-complex-1.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/float128-complex-1.c 2016-06-27 18:25:58.000000000 +0000
+@@ -0,0 +1,157 @@
++/* { dg-do compile { target { powerpc*-*-linux* } } } */
++/* { dg-require-effective-target powerpc_float128_sw_ok } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power7" } } */
++/* { dg-options "-O2 -mcpu=power7 -mfloat128" } */
++
++#ifndef NO_FLOAT
++typedef _Complex float float_complex;
++extern float_complex cfloat1 (void);
++extern float_complex cfloat2 (void);
++
++#define FLOAT_ARG(NAME, OP) ARG_OP(float, float_complex, NAME, OP)
++#define FLOAT_PTR(NAME, OP) PTR_OP(float, float_complex, NAME, OP)
++#define FLOAT_CALL() CALL_OP(float, float_complex, cfloat1, cfloat2)
++
++#else
++#define FLOAT_ARG(NAME, OP)
++#define FLOAT_PTR(NAME, OP)
++#define FLOAT_CALL()
++#endif
++
++#ifndef NO_DOUBLE
++typedef _Complex double double_complex;
++extern double_complex cdouble1 (void);
++extern double_complex cdouble2 (void);
++
++#define DOUBLE_ARG(NAME, OP) ARG_OP(double, double_complex, NAME, OP)
++#define DOUBLE_PTR(NAME, OP) PTR_OP(double, double_complex, NAME, OP)
++#define DOUBLE_CALL() CALL_OP(double, double_complex, cdouble1, cdouble2)
++
++#else
++#define DOUBLE_ARG(NAME, OP)
++#define DOUBLE_PTR(NAME, OP)
++#define DOUBLE_CALL()
++#endif
++
++#ifndef NO_FLOAT128
++#ifdef __VSX__
++typedef _Complex float __attribute__((mode(KC))) float128_complex;
++#else
++typedef _Complex float __attribute__((mode(TC))) float128_complex;
++#endif
++
++extern float128_complex cfloat128_1 (void);
++extern float128_complex cfloat128_2 (void);
++
++#define FLOAT128_ARG(NAME, OP) ARG_OP(float128, float128_complex, NAME, OP)
++#define FLOAT128_PTR(NAME, OP) PTR_OP(float128, float128_complex, NAME, OP)
++#define FLOAT128_CALL() CALL_OP(float128, float128_complex, cfloat128_1, cfloat128_2)
++
++#else
++#define FLOAT128_ARG(NAME, OP)
++#define FLOAT128_PTR(NAME, OP)
++#define FLOAT128_CALL()
++#endif
++
++#ifndef NO_LDOUBLE
++typedef _Complex long double ldouble_complex;
++extern ldouble_complex cldouble1 (void);
++extern ldouble_complex cldouble2 (void);
++
++#define LDOUBLE_ARG(NAME, OP) ARG_OP(ldouble, ldouble_complex, NAME, OP)
++#define LDOUBLE_PTR(NAME, OP) PTR_OP(ldouble, ldouble_complex, NAME, OP)
++#define LDOUBLE_CALL() CALL_OP(ldouble, ldouble_complex, cldouble1, cldouble2)
++
++#else
++#define LDOUBLE_ARG(NAME, OP)
++#define LDOUBLE_PTR(NAME, OP)
++#define LDOUBLE_CALL()
++#endif
++
++
++#define ARG_OP(SUFFIX, TYPE, NAME, OP) \
++TYPE arg_ ## NAME ## _ ## SUFFIX (TYPE a, TYPE b) \
++{ \
++ return a OP b; \
++}
++
++#define PTR_OP(SUFFIX, TYPE, NAME, OP) \
++void ptr_ ## NAME ## _ ## SUFFIX (TYPE *p, TYPE *a, TYPE *b) \
++{ \
++ *p = *a OP *b; \
++}
++
++#define CALL_OP(SUFFIX, TYPE, FUNC1, FUNC2) \
++TYPE call_ ## SUFFIX (void) \
++{ \
++ TYPE value1 = FUNC1 (); \
++ TYPE value2 = FUNC2 (); \
++ return value1 + value2; \
++}
++
++#ifndef NO_ARG
++#ifndef NO_ADD
++FLOAT_ARG (add, +)
++DOUBLE_ARG (add, +)
++FLOAT128_ARG (add, +)
++LDOUBLE_ARG (add, +)
++#endif
++
++#ifndef NO_SUB
++FLOAT_ARG (sub, -)
++DOUBLE_ARG (sub, -)
++FLOAT128_ARG (sub, -)
++LDOUBLE_ARG (sub, -)
++#endif
++
++#ifndef NO_MUL
++FLOAT_ARG (mul, *)
++DOUBLE_ARG (mul, *)
++FLOAT128_ARG (mul, *)
++LDOUBLE_ARG (mul, *)
++#endif
++
++#ifndef NO_DIV
++FLOAT_ARG (div, /)
++DOUBLE_ARG (div, /)
++FLOAT128_ARG (div, /)
++LDOUBLE_ARG (div, /)
++#endif
++#endif
++
++#ifndef NO_PTR
++#ifndef NO_ADD
++FLOAT_PTR (add, +)
++DOUBLE_PTR (add, +)
++FLOAT128_PTR (add, +)
++LDOUBLE_PTR (add, +)
++#endif
++
++#ifndef NO_SUB
++FLOAT_PTR (sub, -)
++DOUBLE_PTR (sub, -)
++FLOAT128_PTR (sub, -)
++LDOUBLE_PTR (sub, -)
++#endif
++
++#ifndef NO_MUL
++FLOAT_PTR (mul, *)
++DOUBLE_PTR (mul, *)
++FLOAT128_PTR (mul, *)
++LDOUBLE_PTR (mul, *)
++#endif
++
++#ifndef NO_DIV
++FLOAT_PTR (div, /)
++DOUBLE_PTR (div, /)
++FLOAT128_PTR (div, /)
++LDOUBLE_PTR (div, /)
++#endif
++#endif
++
++#ifndef NO_CALL
++FLOAT_CALL ()
++DOUBLE_CALL ()
++FLOAT128_CALL ()
++LDOUBLE_CALL ()
++#endif
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/float128-complex-2.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/float128-complex-2.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/float128-complex-2.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/float128-complex-2.c 2016-06-27 18:25:58.000000000 +0000
+@@ -0,0 +1,160 @@
++/* { dg-do compile { target { powerpc*-*-linux* } } } */
++/* { dg-require-effective-target powerpc_float128_hw_ok } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-options "-O2 -mcpu=power9 -mfloat128 -mfloat128-hardware" } */
++
++#ifndef NO_FLOAT
++typedef _Complex float float_complex;
++extern float_complex cfloat1 (void);
++extern float_complex cfloat2 (void);
++
++#define FLOAT_ARG(NAME, OP) ARG_OP(float, float_complex, NAME, OP)
++#define FLOAT_PTR(NAME, OP) PTR_OP(float, float_complex, NAME, OP)
++#define FLOAT_CALL() CALL_OP(float, float_complex, cfloat1, cfloat2)
++
++#else
++#define FLOAT_ARG(NAME, OP)
++#define FLOAT_PTR(NAME, OP)
++#define FLOAT_CALL()
++#endif
++
++#ifndef NO_DOUBLE
++typedef _Complex double double_complex;
++extern double_complex cdouble1 (void);
++extern double_complex cdouble2 (void);
++
++#define DOUBLE_ARG(NAME, OP) ARG_OP(double, double_complex, NAME, OP)
++#define DOUBLE_PTR(NAME, OP) PTR_OP(double, double_complex, NAME, OP)
++#define DOUBLE_CALL() CALL_OP(double, double_complex, cdouble1, cdouble2)
++
++#else
++#define DOUBLE_ARG(NAME, OP)
++#define DOUBLE_PTR(NAME, OP)
++#define DOUBLE_CALL()
++#endif
++
++#ifndef NO_FLOAT128
++#ifdef __VSX__
++typedef _Complex float __attribute__((mode(KC))) float128_complex;
++#else
++typedef _Complex float __attribute__((mode(TC))) float128_complex;
++#endif
++
++extern float128_complex cfloat128_1 (void);
++extern float128_complex cfloat128_2 (void);
++
++#define FLOAT128_ARG(NAME, OP) ARG_OP(float128, float128_complex, NAME, OP)
++#define FLOAT128_PTR(NAME, OP) PTR_OP(float128, float128_complex, NAME, OP)
++#define FLOAT128_CALL() CALL_OP(float128, float128_complex, cfloat128_1, cfloat128_2)
++
++#else
++#define FLOAT128_ARG(NAME, OP)
++#define FLOAT128_PTR(NAME, OP)
++#define FLOAT128_CALL()
++#endif
++
++#ifndef NO_LDOUBLE
++typedef _Complex long double ldouble_complex;
++extern ldouble_complex cldouble1 (void);
++extern ldouble_complex cldouble2 (void);
++
++#define LDOUBLE_ARG(NAME, OP) ARG_OP(ldouble, ldouble_complex, NAME, OP)
++#define LDOUBLE_PTR(NAME, OP) PTR_OP(ldouble, ldouble_complex, NAME, OP)
++#define LDOUBLE_CALL() CALL_OP(ldouble, ldouble_complex, cldouble1, cldouble2)
++
++#else
++#define LDOUBLE_ARG(NAME, OP)
++#define LDOUBLE_PTR(NAME, OP)
++#define LDOUBLE_CALL()
++#endif
++
++
++#define ARG_OP(SUFFIX, TYPE, NAME, OP) \
++TYPE arg_ ## NAME ## _ ## SUFFIX (TYPE a, TYPE b) \
++{ \
++ return a OP b; \
++}
++
++#define PTR_OP(SUFFIX, TYPE, NAME, OP) \
++void ptr_ ## NAME ## _ ## SUFFIX (TYPE *p, TYPE *a, TYPE *b) \
++{ \
++ *p = *a OP *b; \
++}
++
++#define CALL_OP(SUFFIX, TYPE, FUNC1, FUNC2) \
++TYPE call_ ## SUFFIX (void) \
++{ \
++ TYPE value1 = FUNC1 (); \
++ TYPE value2 = FUNC2 (); \
++ return value1 + value2; \
++}
++
++#ifndef NO_ARG
++#ifndef NO_ADD
++FLOAT_ARG (add, +)
++DOUBLE_ARG (add, +)
++FLOAT128_ARG (add, +)
++LDOUBLE_ARG (add, +)
++#endif
++
++#ifndef NO_SUB
++FLOAT_ARG (sub, -)
++DOUBLE_ARG (sub, -)
++FLOAT128_ARG (sub, -)
++LDOUBLE_ARG (sub, -)
++#endif
++
++#ifndef NO_MUL
++FLOAT_ARG (mul, *)
++DOUBLE_ARG (mul, *)
++FLOAT128_ARG (mul, *)
++LDOUBLE_ARG (mul, *)
++#endif
++
++#ifndef NO_DIV
++FLOAT_ARG (div, /)
++DOUBLE_ARG (div, /)
++FLOAT128_ARG (div, /)
++LDOUBLE_ARG (div, /)
++#endif
++#endif
++
++#ifndef NO_PTR
++#ifndef NO_ADD
++FLOAT_PTR (add, +)
++DOUBLE_PTR (add, +)
++FLOAT128_PTR (add, +)
++LDOUBLE_PTR (add, +)
++#endif
++
++#ifndef NO_SUB
++FLOAT_PTR (sub, -)
++DOUBLE_PTR (sub, -)
++FLOAT128_PTR (sub, -)
++LDOUBLE_PTR (sub, -)
++#endif
++
++#ifndef NO_MUL
++FLOAT_PTR (mul, *)
++DOUBLE_PTR (mul, *)
++FLOAT128_PTR (mul, *)
++LDOUBLE_PTR (mul, *)
++#endif
++
++#ifndef NO_DIV
++FLOAT_PTR (div, /)
++DOUBLE_PTR (div, /)
++FLOAT128_PTR (div, /)
++LDOUBLE_PTR (div, /)
++#endif
++#endif
++
++#ifndef NO_CALL
++FLOAT_CALL ()
++DOUBLE_CALL ()
++FLOAT128_CALL ()
++LDOUBLE_CALL ()
++#endif
++
++/* { dg-final { scan-assembler "xsaddqp" } } */
++/* { dg-final { scan-assembler "xssubqp" } } */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/inf128-1.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/inf128-1.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/inf128-1.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/inf128-1.c 2016-07-01 17:19:15.000000000 +0000
+@@ -0,0 +1,55 @@
++/* { dg-do run { target { powerpc64*-*-* && vsx_hw } } } */
++/* { dg-options "-mfloat128 -mvsx" } */
++
++void abort ();
++
++typedef unsigned long long int uint64_t;
++
++typedef union
++{
++ __float128 value;
++
++ struct
++ {
++#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
++ unsigned negative:1;
++ unsigned exponent:15;
++ unsigned quiet_nan:1;
++ uint64_t mant_high:47;
++ uint64_t mant_low:64;
++#else
++ uint64_t mant_low:64;
++ uint64_t mant_high:47;
++ unsigned quiet_nan:1;
++ unsigned exponent:15;
++ unsigned negative:1;
++#endif
++ } nan;
++
++} ieee854_float128;
++
++int
++main (int argc, int *argv[])
++{
++ ieee854_float128 y;
++
++ y.value = __builtin_infq ();
++
++ if (y.nan.negative != 0
++ || y.nan.exponent != 0x7fff
++ || y.nan.quiet_nan != 0
++ || y.nan.mant_high != 0
++ || y.nan.mant_low != 0)
++ abort ();
++
++ y.value = __builtin_huge_valq ();
++
++ if (y.nan.negative != 0
++ || y.nan.exponent != 0x7fff
++ || y.nan.quiet_nan != 0
++ || y.nan.mant_high != 0
++ || y.nan.mant_low != 0)
++ abort ();
++
++ return 0;
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/mulkc3-1.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/mulkc3-1.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/mulkc3-1.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/mulkc3-1.c 2016-07-15 20:22:23.000000000 +0000
+@@ -0,0 +1,23 @@
++/* { dg-do run { target { powerpc64*-*-* && vsx_hw } } } */
++/* { dg-require-effective-target powerpc_p8vector_ok } */
++/* { dg-options "-mfloat128 -mvsx" } */
++
++void abort ();
++
++typedef __complex float __cfloat128 __attribute__((mode(KC)));
++
++__cfloat128 multiply (__cfloat128 x, __cfloat128 y)
++{
++ return x * y;
++}
++
++__cfloat128 z, a;
++
++int main ()
++{
++ z = multiply (2.0q + 1.0jq, 3.0q + 1.0jq);
++ a = 5.0q + 5.0jq;
++ if (z != a)
++ abort ();
++ return 0;
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/nan128-1.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/nan128-1.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/nan128-1.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/nan128-1.c 2016-07-01 17:19:15.000000000 +0000
+@@ -0,0 +1,77 @@
++/* { dg-do run { target { powerpc64*-*-* && vsx_hw } } } */
++/* { dg-options "-mfloat128 -mvsx" } */
++
++#include <stdio.h>
++
++void abort ();
++
++typedef unsigned long long int uint64_t;
++
++typedef union
++{
++ __float128 value;
++
++ struct
++ {
++#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
++ unsigned negative:1;
++ unsigned exponent:15;
++ unsigned quiet_nan:1;
++ uint64_t mant_high:47;
++ uint64_t mant_low:64;
++#else
++ uint64_t mant_low:64;
++ uint64_t mant_high:47;
++ unsigned quiet_nan:1;
++ unsigned exponent:15;
++ unsigned negative:1;
++#endif
++ } nan;
++
++} ieee854_float128;
++
++int
++main (int argc, int *argv[])
++{
++ ieee854_float128 y;
++
++ y.value = __builtin_nanq ("1");
++
++ if (y.nan.negative != 0
++ || y.nan.exponent != 0x7fff
++ || y.nan.quiet_nan != 1
++ || y.nan.mant_high != 0
++ || y.nan.mant_low != 1)
++ abort ();
++
++ y.value = __builtin_nanq ("0x2ab3c");
++
++ if (y.nan.negative != 0
++ || y.nan.exponent != 0x7fff
++ || y.nan.quiet_nan != 1
++ || y.nan.mant_high != 0
++ || y.nan.mant_low != 0x2ab3c)
++ abort ();
++
++ y.value = __builtin_nansq ("1");
++
++ if (
++ y.nan.negative != 0
++ || y.nan.exponent != 0x7fff
++ || y.nan.quiet_nan != 0
++ || y.nan.mant_high != 0
++ || y.nan.mant_low != 1
++ )
++ abort ();
++
++ y.value = __builtin_nansq ("0x2ab3c");
++
++ if (y.nan.negative != 0
++ || y.nan.exponent != 0x7fff
++ || y.nan.quiet_nan != 0
++ || y.nan.mant_high != 0
++ || y.nan.mant_low != 0x2ab3c)
++ abort ();
++
++ return 0;
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/p8vector-int128-1.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/p8vector-int128-1.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/p8vector-int128-1.c 2014-11-04 12:09:50.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/p8vector-int128-1.c 2016-06-01 22:09:14.000000000 +0000
+@@ -2,7 +2,7 @@
+ /* { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } } */
+ /* { dg-require-effective-target powerpc_p8vector_ok } */
+ /* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power8" } } */
+-/* { dg-options "-mcpu=power8 -O3 -mvsx-timode" } */
++/* { dg-options "-mcpu=power8 -O3 -mvsx-timode -mlra" } */
+
+ #include <altivec.h>
+
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/p9-lxvx-stxvx-3.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/p9-lxvx-stxvx-3.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/p9-lxvx-stxvx-3.c 2016-03-01 21:31:47.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/p9-lxvx-stxvx-3.c 2016-07-08 14:51:44.000000000 +0000
+@@ -1,6 +1,6 @@
+ /* { dg-do compile { target { powerpc64le-*-* } } } */
+ /* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
+-/* { dg-options "-mcpu=power9 -O3" } */
++/* { dg-options "-mcpu=power9 -O3 -mfloat128" } */
+ /* { dg-require-effective-target powerpc_p9vector_ok } */
+ /* { dg-final { scan-assembler "lxvx" } } */
+ /* { dg-final { scan-assembler "stxvx" } } */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/p9-minmax-1.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/p9-minmax-1.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/p9-minmax-1.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/p9-minmax-1.c 2016-06-02 19:41:47.000000000 +0000
+@@ -0,0 +1,171 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-options "-mcpu=power9 -O2 -mpower9-minmax -ffast-math" } */
++/* { dg-final { scan-assembler-not "fsel" } } */
++/* { dg-final { scan-assembler "xscmpeqdp" } } */
++/* { dg-final { scan-assembler "xscmpgtdp" } } */
++/* { dg-final { scan-assembler "xscmpgedp" } } */
++/* { dg-final { scan-assembler-not "xscmpodp" } } */
++/* { dg-final { scan-assembler-not "xscmpudp" } } */
++/* { dg-final { scan-assembler "xsmaxcdp" } } */
++/* { dg-final { scan-assembler-not "xsmaxdp" } } */
++/* { dg-final { scan-assembler "xsmincdp" } } */
++/* { dg-final { scan-assembler-not "xsmindp" } } */
++/* { dg-final { scan-assembler "xxsel" } } */
++
++double
++dbl_max1 (double a, double b)
++{
++ return (a >= b) ? a : b;
++}
++
++double
++dbl_max2 (double a, double b)
++{
++ return (a > b) ? a : b;
++}
++
++double
++dbl_min1 (double a, double b)
++{
++ return (a < b) ? a : b;
++}
++
++double
++dbl_min2 (double a, double b)
++{
++ return (a <= b) ? a : b;
++}
++
++double
++dbl_cmp_eq (double a, double b, double c, double d)
++{
++ return (a == b) ? c : d;
++}
++
++double
++dbl_cmp_ne (double a, double b, double c, double d)
++{
++ return (a != b) ? c : d;
++}
++
++double
++dbl_cmp_gt (double a, double b, double c, double d)
++{
++ return (a > b) ? c : d;
++}
++
++double
++dbl_cmp_ge (double a, double b, double c, double d)
++{
++ return (a >= b) ? c : d;
++}
++
++double
++dbl_cmp_lt (double a, double b, double c, double d)
++{
++ return (a < b) ? c : d;
++}
++
++double
++dbl_cmp_le (double a, double b, double c, double d)
++{
++ return (a <= b) ? c : d;
++}
++
++float
++flt_max1 (float a, float b)
++{
++ return (a >= b) ? a : b;
++}
++
++float
++flt_max2 (float a, float b)
++{
++ return (a > b) ? a : b;
++}
++
++float
++flt_min1 (float a, float b)
++{
++ return (a < b) ? a : b;
++}
++
++float
++flt_min2 (float a, float b)
++{
++ return (a <= b) ? a : b;
++}
++
++float
++flt_cmp_eq (float a, float b, float c, float d)
++{
++ return (a == b) ? c : d;
++}
++
++float
++flt_cmp_ne (float a, float b, float c, float d)
++{
++ return (a != b) ? c : d;
++}
++
++float
++flt_cmp_gt (float a, float b, float c, float d)
++{
++ return (a > b) ? c : d;
++}
++
++float
++flt_cmp_ge (float a, float b, float c, float d)
++{
++ return (a >= b) ? c : d;
++}
++
++float
++flt_cmp_lt (float a, float b, float c, float d)
++{
++ return (a < b) ? c : d;
++}
++
++float
++flt_cmp_le (float a, float b, float c, float d)
++{
++ return (a <= b) ? c : d;
++}
++
++double
++dbl_flt_max1 (float a, float b)
++{
++ return (a > b) ? a : b;
++}
++
++double
++dbl_flt_max2 (double a, float b)
++{
++ return (a > b) ? a : b;
++}
++
++double
++dbl_flt_max3 (float a, double b)
++{
++ return (a > b) ? a : b;
++}
++
++double
++dbl_flt_min1 (float a, float b)
++{
++ return (a < b) ? a : b;
++}
++
++double
++dbl_flt_min2 (double a, float b)
++{
++ return (a < b) ? a : b;
++}
++
++double
++dbl_flt_min3 (float a, double b)
++{
++ return (a < b) ? a : b;
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/p9-minmax-2.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/p9-minmax-2.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/p9-minmax-2.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/p9-minmax-2.c 2016-06-02 19:41:47.000000000 +0000
+@@ -0,0 +1,191 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-options "-mcpu=power9 -O2 -mpower9-minmax" } */
++/* { dg-final { scan-assembler-not "fsel" } } */
++/* { dg-final { scan-assembler "xscmpeqdp" } } */
++/* { dg-final { scan-assembler "xscmpgtdp" } } */
++/* { dg-final { scan-assembler-not "xscmpodp" } } */
++/* { dg-final { scan-assembler-not "xscmpudp" } } */
++/* { dg-final { scan-assembler "xsmaxcdp" } } */
++/* { dg-final { scan-assembler-not "xsmaxdp" } } */
++/* { dg-final { scan-assembler "xsmincdp" } } */
++/* { dg-final { scan-assembler-not "xsmindp" } } */
++/* { dg-final { scan-assembler "xxsel" } } */
++
++/* Due to NaN support, <= and >= are not handled presently unless -ffast-math
++ is used. At some point this will be fixed and the xscmpgedp instruction can
++ be generated normally. The <= and >= tests are bracketed with
++ #ifdef DO_GE_LE. */
++
++#ifdef DO_GE_LE
++double
++dbl_max1 (double a, double b)
++{
++ return (a >= b) ? a : b;
++}
++#endif
++
++double
++dbl_max2 (double a, double b)
++{
++ return (a > b) ? a : b;
++}
++
++double
++dbl_min1 (double a, double b)
++{
++ return (a < b) ? a : b;
++}
++
++#ifdef DO_GE_LE
++double
++dbl_min2 (double a, double b)
++{
++ return (a <= b) ? a : b;
++}
++#endif
++
++double
++dbl_cmp_eq (double a, double b, double c, double d)
++{
++ return (a == b) ? c : d;
++}
++
++double
++dbl_cmp_ne (double a, double b, double c, double d)
++{
++ return (a != b) ? c : d;
++}
++
++double
++dbl_cmp_gt (double a, double b, double c, double d)
++{
++ return (a > b) ? c : d;
++}
++
++#ifdef DO_GE_LE
++double
++dbl_cmp_ge (double a, double b, double c, double d)
++{
++ return (a >= b) ? c : d;
++}
++#endif
++
++double
++dbl_cmp_lt (double a, double b, double c, double d)
++{
++ return (a < b) ? c : d;
++}
++
++#ifdef DO_GE_LE
++double
++dbl_cmp_le (double a, double b, double c, double d)
++{
++ return (a <= b) ? c : d;
++}
++#endif
++
++#ifdef DO_GE_LE
++float
++flt_max1 (float a, float b)
++{
++ return (a >= b) ? a : b;
++}
++#endif
++
++float
++flt_max2 (float a, float b)
++{
++ return (a > b) ? a : b;
++}
++
++float
++flt_min1 (float a, float b)
++{
++ return (a < b) ? a : b;
++}
++
++#ifdef DO_GE_LE
++float
++flt_min2 (float a, float b)
++{
++ return (a <= b) ? a : b;
++}
++#endif
++
++float
++flt_cmp_eq (float a, float b, float c, float d)
++{
++ return (a == b) ? c : d;
++}
++
++float
++flt_cmp_ne (float a, float b, float c, float d)
++{
++ return (a != b) ? c : d;
++}
++
++float
++flt_cmp_gt (float a, float b, float c, float d)
++{
++ return (a > b) ? c : d;
++}
++
++#ifdef DO_GE_LE
++float
++flt_cmp_ge (float a, float b, float c, float d)
++{
++ return (a >= b) ? c : d;
++}
++#endif
++
++float
++flt_cmp_lt (float a, float b, float c, float d)
++{
++ return (a < b) ? c : d;
++}
++
++#ifdef DO_GE_LE
++float
++flt_cmp_le (float a, float b, float c, float d)
++{
++ return (a <= b) ? c : d;
++}
++#endif
++
++double
++dbl_flt_max1 (float a, float b)
++{
++ return (a > b) ? a : b;
++}
++
++double
++dbl_flt_max2 (double a, float b)
++{
++ return (a > b) ? a : b;
++}
++
++double
++dbl_flt_max3 (float a, double b)
++{
++ return (a > b) ? a : b;
++}
++
++double
++dbl_flt_min1 (float a, float b)
++{
++ return (a < b) ? a : b;
++}
++
++double
++dbl_flt_min2 (double a, float b)
++{
++ return (a < b) ? a : b;
++}
++
++double
++dbl_flt_min3 (float a, double b)
++{
++ return (a < b) ? a : b;
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/p9-permute.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/p9-permute.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/p9-permute.c 2016-03-01 21:31:47.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/p9-permute.c 2016-06-01 23:23:42.000000000 +0000
+@@ -1,4 +1,4 @@
+-/* { dg-do compile { target { powerpc64le-*-* } } } */
++/* { dg-do compile { target { powerpc64*-*-* } } } */
+ /* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
+ /* { dg-options "-mcpu=power9 -O2" } */
+ /* { dg-require-effective-target powerpc_p9vector_ok } */
+@@ -17,5 +17,6 @@
+ return vec_perm (a, b, mask);
+ }
+
++/* expect xxpermr on little-endian, xxperm on big-endian */
+ /* { dg-final { scan-assembler "xxperm" } } */
+ /* { dg-final { scan-assembler-not "vperm" } } */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/p9-splat-1.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/p9-splat-1.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/p9-splat-1.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/p9-splat-1.c 2016-06-09 23:28:23.000000000 +0000
+@@ -0,0 +1,27 @@
++/* { dg-do compile { target { powerpc64le-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-options "-mcpu=power9 -O2" } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++
++#include <altivec.h>
++
++vector int
++foo_r (int a)
++{
++ return (vector int) { a, a, a, a }; /* mtvsrws */
++}
++
++vector int
++foo_r2 (int a)
++{
++ return vec_splats (a); /* mtvsrws */
++}
++
++vector int
++foo_p (int *a)
++{
++ return (vector int) { *a, *a, *a, *a }; /* lxvwsx */
++}
++
++/* { dg-final { scan-assembler-times "mtvsrws" 2 } } */
++/* { dg-final { scan-assembler-times "lxvwsx" 1 } } */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/p9-splat-2.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/p9-splat-2.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/p9-splat-2.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/p9-splat-2.c 2016-06-09 23:28:23.000000000 +0000
+@@ -0,0 +1,38 @@
++/* { dg-do compile { target { powerpc64le-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-options "-mcpu=power9 -O2" } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++
++#include <altivec.h>
++
++vector float
++foo_r (float a)
++{
++ return (vector float) { a, a, a, a }; /* xscvdpspn/xxspltw */
++}
++
++vector float
++foo_r2 (float a)
++{
++ return vec_splats (a); /* xscvdpspn/xxspltw */
++}
++
++vector float
++foo_g (float *a)
++{
++ float f = *a;
++
++ __asm__ (" # %0" : "+r" (f));
++ return (vector float) { f, f, f, f }; /* mtvsrws */
++}
++
++vector float
++foo_p (float *a)
++{
++ return (vector float) { *a, *a, *a, *a }; /* lxvwsx */
++}
++
++/* { dg-final { scan-assembler-times "xscvdpspn" 2 } } */
++/* { dg-final { scan-assembler-times "xxspltw" 2 } } */
++/* { dg-final { scan-assembler-times "mtvsrws" 1 } } */
++/* { dg-final { scan-assembler-times "lxvwsx" 1 } } */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/p9-splat-3.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/p9-splat-3.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/p9-splat-3.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/p9-splat-3.c 2016-06-09 23:28:23.000000000 +0000
+@@ -0,0 +1,61 @@
++/* { dg-do compile { target { powerpc64le-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-options "-mcpu=power9 -O2" } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++
++#include <altivec.h>
++
++typedef vector signed char v16qi_t;
++typedef vector short v8hi_t;
++typedef vector int v4si_t;
++typedef vector long long v2di_t;
++
++void v16qi_0a (v16qi_t *p) { *p = (v16qi_t) { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; }
++void v8hi_0a (v8hi_t *p) { *p = (v8hi_t) { 0, 0, 0, 0, 0, 0, 0, 0 }; }
++void v4si_0a (v4si_t *p) { *p = (v4si_t) { 0, 0, 0, 0 }; }
++void v2di_0a (v2di_t *p) { *p = (v2di_t) { 0, 0 }; }
++
++void v16qi_0b (v16qi_t *p) { *p = (v16qi_t) vec_splats ((signed char)0); }
++void v8hi_0b (v8hi_t *p) { *p = (v8hi_t) vec_splats ((short)0); }
++void v4si_0b (v4si_t *p) { *p = (v4si_t) vec_splats ((int)0); }
++void v2di_0b (v2di_t *p) { *p = (v2di_t) vec_splats ((long long)0); }
++
++void v16qi_m1a (v16qi_t *p) { *p = (v16qi_t) { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }; }
++void v8hi_m1a (v8hi_t *p) { *p = (v8hi_t) { -1, -1, -1, -1, -1, -1, -1, -1 }; }
++void v4si_m1a (v4si_t *p) { *p = (v4si_t) { -1, -1, -1, -1 }; }
++void v2di_m1a (v2di_t *p) { *p = (v2di_t) { -1, -1 }; }
++
++void v16qi_m1b (v16qi_t *p) { *p = (v16qi_t) vec_splats ((signed char)-1); }
++void v8hi_m1b (v8hi_t *p) { *p = (v8hi_t) vec_splats ((short)-1); }
++void v4si_m1b (v4si_t *p) { *p = (v4si_t) vec_splats ((int)-1); }
++void v2di_m1b (v2di_t *p) { *p = (v2di_t) vec_splats ((long long)-1); }
++
++void v16qi_5a (v16qi_t *p) { *p = (v16qi_t) { 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 }; }
++void v8hi_5a (v8hi_t *p) { *p = (v8hi_t) { 5, 5, 5, 5, 5, 5, 5, 5 }; }
++void v4si_5a (v4si_t *p) { *p = (v4si_t) { 5, 5, 5, 5 }; }
++void v2di_5a (v2di_t *p) { *p = (v2di_t) { 5, 5 }; }
++
++void v16qi_5b (v16qi_t *p) { *p = (v16qi_t) vec_splats ((signed char)5); }
++void v8hi_5b (v8hi_t *p) { *p = (v8hi_t) vec_splats ((short)5); }
++void v4si_5b (v4si_t *p) { *p = (v4si_t) vec_splats ((int)5); }
++void v2di_5b (v2di_t *p) { *p = (v2di_t) vec_splats ((long long)5); }
++
++void v16qi_33a (v16qi_t *p) { *p = (v16qi_t) { 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33 }; }
++void v8hi_33a (v8hi_t *p) { *p = (v8hi_t) { 33, 33, 33, 33, 33, 33, 33, 33 }; }
++void v4si_33a (v4si_t *p) { *p = (v4si_t) { 33, 33, 33, 33 }; }
++void v2di_33a (v2di_t *p) { *p = (v2di_t) { 33, 33 }; }
++
++void v16qi_33b (v16qi_t *p) { *p = (v16qi_t) vec_splats ((signed char)33); }
++void v8hi_33b (v8hi_t *p) { *p = (v8hi_t) vec_splats ((short)33); }
++void v4si_33b (v4si_t *p) { *p = (v4si_t) vec_splats ((int)33); }
++void v2di_33b (v2di_t *p) { *p = (v2di_t) vec_splats ((long long)33); }
++
++/* { dg-final { scan-assembler "xxspltib" } } */
++/* { dg-final { scan-assembler "vextsb2d" } } */
++/* { dg-final { scan-assembler "vextsb2w" } } */
++/* { dg-final { scan-assembler "vupk\[hl\]sb" } } */
++/* { dg-final { scan-assembler-not "lxvd2x" } } */
++/* { dg-final { scan-assembler-not "lxvw4x" } } */
++/* { dg-final { scan-assembler-not "lxv " } } */
++/* { dg-final { scan-assembler-not "lxvx" } } */
++/* { dg-final { scan-assembler-not "lvx" } } */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/p9-splat-4.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/p9-splat-4.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/p9-splat-4.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/p9-splat-4.c 2016-06-09 23:28:23.000000000 +0000
+@@ -0,0 +1,10 @@
++/* { dg-do compile { target { powerpc64*-*-* && lp64 } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-options "-mcpu=power9 -O2" } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++
++#include <altivec.h>
++
++vector long long foo (long long a) { return (vector long long) { a, a }; }
++
++/* { dg-final { scan-assembler "mtvsrdd" } } */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/p9-vneg.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/p9-vneg.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/p9-vneg.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/p9-vneg.c 2016-06-01 23:23:42.000000000 +0000
+@@ -0,0 +1,12 @@
++/* { dg-do compile { target { powerpc64*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-options "-mcpu=power9 -O2" } */
++
++/* Verify P9 vector negate instructions. */
++
++vector long long v2di_neg (vector long long a) { return -a; }
++vector int v4si_neg (vector int a) { return -a; }
++
++/* { dg-final { scan-assembler "vnegd" } } */
++/* { dg-final { scan-assembler "vnegw" } } */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/p9-vparity.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/p9-vparity.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/p9-vparity.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/p9-vparity.c 2016-06-01 23:23:42.000000000 +0000
+@@ -0,0 +1,107 @@
++/* { dg-do compile { target { powerpc64*-*-* && lp64 } } } */
++/* { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-options "-mcpu=power9 -O2 -mlra -mvsx-timode" } */
++
++#include <altivec.h>
++
++vector int
++parity_v4si_1s (vector int a)
++{
++ return vec_vprtyb (a);
++}
++
++vector int
++parity_v4si_2s (vector int a)
++{
++ return vec_vprtybw (a);
++}
++
++vector unsigned int
++parity_v4si_1u (vector unsigned int a)
++{
++ return vec_vprtyb (a);
++}
++
++vector unsigned int
++parity_v4si_2u (vector unsigned int a)
++{
++ return vec_vprtybw (a);
++}
++
++vector long long
++parity_v2di_1s (vector long long a)
++{
++ return vec_vprtyb (a);
++}
++
++vector long long
++parity_v2di_2s (vector long long a)
++{
++ return vec_vprtybd (a);
++}
++
++vector unsigned long long
++parity_v2di_1u (vector unsigned long long a)
++{
++ return vec_vprtyb (a);
++}
++
++vector unsigned long long
++parity_v2di_2u (vector unsigned long long a)
++{
++ return vec_vprtybd (a);
++}
++
++vector __int128_t
++parity_v1ti_1s (vector __int128_t a)
++{
++ return vec_vprtyb (a);
++}
++
++vector __int128_t
++parity_v1ti_2s (vector __int128_t a)
++{
++ return vec_vprtybq (a);
++}
++
++__int128_t
++parity_ti_3s (__int128_t a)
++{
++ return vec_vprtyb (a);
++}
++
++__int128_t
++parity_ti_4s (__int128_t a)
++{
++ return vec_vprtybq (a);
++}
++
++vector __uint128_t
++parity_v1ti_1u (vector __uint128_t a)
++{
++ return vec_vprtyb (a);
++}
++
++vector __uint128_t
++parity_v1ti_2u (vector __uint128_t a)
++{
++ return vec_vprtybq (a);
++}
++
++__uint128_t
++parity_ti_3u (__uint128_t a)
++{
++ return vec_vprtyb (a);
++}
++
++__uint128_t
++parity_ti_4u (__uint128_t a)
++{
++ return vec_vprtybq (a);
++}
++
++/* { dg-final { scan-assembler "vprtybd" } } */
++/* { dg-final { scan-assembler "vprtybq" } } */
++/* { dg-final { scan-assembler "vprtybw" } } */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/p9-vpermr.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/p9-vpermr.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/p9-vpermr.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/p9-vpermr.c 2016-06-01 23:23:42.000000000 +0000
+@@ -0,0 +1,21 @@
++/* { dg-do compile { target { powerpc64le-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-options "-mcpu=power9 -O2" } */
++
++/* Test generation of VPERMR/XXPERMR on ISA 3.0 in little endian. */
++
++#include <altivec.h>
++
++vector long long
++permute (vector long long *p, vector long long *q, vector unsigned char mask)
++{
++ vector long long a = *p;
++ vector long long b = *q;
++
++ /* Force a, b to be in altivec registers to select vpermr insn. */
++ __asm__ (" # a: %x0, b: %x1" : "+v" (a), "+v" (b));
++
++ return vec_perm (a, b, mask);
++}
++
++/* { dg-final { scan-assembler "vpermr\|xxpermr" } } */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/pr47755.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/pr47755.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/pr47755.c 2014-11-04 12:09:50.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/pr47755.c 2016-06-09 23:28:23.000000000 +0000
+@@ -3,7 +3,7 @@
+ /* { dg-require-effective-target powerpc_vsx_ok } */
+ /* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power7" } } */
+ /* { dg-options "-O3 -mcpu=power7" } */
+-/* { dg-final { scan-assembler "xxlxor" } } */
++/* { dg-final { scan-assembler "xxlxor\|vspltis\[bhw\]" } } */
+ /* { dg-final { scan-assembler-not "lxvd2x" } } */
+ /* { dg-final { scan-assembler-not "lxvw4x" } } */
+ /* { dg-final { scan-assembler-not "lvx" } } */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/pr68805.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/pr68805.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/pr68805.c 2015-12-17 01:01:24.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/pr68805.c 2016-06-01 22:09:14.000000000 +0000
+@@ -1,6 +1,6 @@
+ /* { dg-do compile { target powerpc64le-*-* } } */
+ /* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power8" } } */
+-/* { dg-options "-O2 -mvsx-timode -mcpu=power8" } */
++/* { dg-options "-O2 -mvsx-timode -mcpu=power8 -mlra" } */
+
+ typedef struct bar {
+ void *a;
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/pr70963.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/pr70963.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/pr70963.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/pr70963.c 2016-05-15 21:48:43.000000000 +0000
+@@ -0,0 +1,44 @@
++/* { dg-do run { target powerpc64*-*-* } } */
++/* { dg-require-effective-target p8vector_hw } */
++/* { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power8" } } */
++/* { dg-options "-mcpu=power8" } */
++
++#include <stdlib.h>
++#include <stdio.h>
++#include <altivec.h>
++
++static int failed;
++static void test (void);
++
++static void check (int result, const char *name)
++{
++ if (!result)
++ {
++ failed++;
++ printf ("fail %s\n", name);
++ }
++}
++
++int main (void)
++{
++ test ();
++ if (failed)
++ abort ();
++ return 0;
++}
++
++vector double x = { 81.0, 76.0 };
++vector long long y = { 81, 76 };
++
++static void test()
++{
++ vector long long a = vec_cts (x, 0);
++ vector double b = vec_ctf (a, 0);
++ vector long long c = __builtin_vsx_xvcvdpuxds_scale (x, 0);
++ vector double d = vec_ctf (c, 0);
++ check (vec_all_eq (a, y), "vec_cts");
++ check (vec_all_eq (b, x), "vec_ctf");
++ check (vec_all_eq (c, y), "xvcvdpuxds");
++ check (vec_all_eq (d, x), "vec_ctf unsigned");
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/pr71186.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/pr71186.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/pr71186.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/pr71186.c 2016-06-09 23:28:23.000000000 +0000
+@@ -0,0 +1,32 @@
++/* { dg-do compile { target { powerpc64*-*-* && lp64 } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-options "-mcpu=power9 -O2" } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++
++static unsigned short x[(16384/sizeof(unsigned short))] __attribute__ ((aligned (16)));
++static unsigned short y[(16384/sizeof(unsigned short))] __attribute__ ((aligned (16)));
++static unsigned short a;
++
++void obfuscate(void *a, ...);
++
++static void __attribute__((noinline)) do_one(void)
++{
++ unsigned long i;
++
++ obfuscate(x, y, &a);
++
++ for (i = 0; i < (16384/sizeof(unsigned short)); i++)
++ y[i] = a * x[i];
++
++ obfuscate(x, y, &a);
++}
++
++int main(void)
++{
++ unsigned long i;
++
++ for (i = 0; i < 1000000; i++)
++ do_one();
++
++ return 0;
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/pr71493-1.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/pr71493-1.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/pr71493-1.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/pr71493-1.c 2016-07-19 03:39:34.000000000 +0000
+@@ -0,0 +1,13 @@
++/* { dg-do compile { target { powerpc*-*-linux* && ilp32 } } } */
++/* { dg-options "-O2 -msvr4-struct-return" } */
++
++struct S1 { float f; };
++
++struct S1 foo1 (void)
++{
++ struct S1 s = { 1.0f };
++ return s;
++}
++
++/* { dg-final { scan-assembler "lwz" } } */
++/* { dg-final { scan-assembler-not "lfs" } } */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/pr71493-2.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/pr71493-2.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/pr71493-2.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/pr71493-2.c 2016-07-19 03:39:34.000000000 +0000
+@@ -0,0 +1,13 @@
++/* { dg-do compile { target { powerpc*-*-linux* && ilp32 } } } */
++/* { dg-options "-O2 -msvr4-struct-return" } */
++
++struct S2 { double d; };
++
++struct S2 foo2 (void)
++{
++ struct S2 s = { 1.0 };
++ return s;
++}
++
++/* { dg-final { scan-assembler "lwz" } } */
++/* { dg-final { scan-assembler-not "lfd" } } */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/pr71656-1.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/pr71656-1.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/pr71656-1.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/pr71656-1.c 2016-07-01 17:56:54.000000000 +0000
+@@ -0,0 +1,20 @@
++/* Test for reload ICE arising from POWER9 Vector Dform code generation. */
++/* { dg-do compile } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-options "-O1 -mcpu=power9 -mpower9-dform-vector -mno-lra" } */
++
++typedef __attribute__((altivec(vector__))) int type_t;
++type_t
++func (type_t *src)
++{
++ asm volatile ("# force the base reg on the load below to be spilled"
++ : /* no outputs */
++ : /* no inputs */
++ : "r0", "r3", "r4", "r5", "r6", "r7",
++ "r8", "r9", "r10", "r11", "r12", "r14", "r15",
++ "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
++ "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31");
++ return src[1];
++}
++
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/pr71656-2.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/pr71656-2.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/pr71656-2.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/pr71656-2.c 2016-07-01 17:56:54.000000000 +0000
+@@ -0,0 +1,47 @@
++/* Test for reload ICE arising from POWER9 Vector Dform code generation. */
++/* { dg-do compile } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-options "-O3 -mcpu=power9 -mpower9-dform-vector -mno-lra -funroll-loops -fno-aggressive-loop-optimizations" } */
++
++typedef double vec[3];
++struct vec_t
++{
++ vec x;
++ vec y;
++};
++int a, j, k, l, m, n, o, p, q;
++double b, i;
++vec c;
++double h[6];
++void func1 (vec);
++
++void
++func2 (double *b)
++{
++ for (; k; k--)
++ for (; j <= k;)
++ for (; m <= q; m++)
++ for (; n <= k; n++)
++ for (; o <= l; o++)
++ {
++ j = p + m + n + o;
++ h[j] = i;
++ }
++}
++
++void
++func3 (void)
++{
++ struct vec_t d;
++ func1 (d.y);
++ func2 (&b);
++ for (; a;)
++ {
++ double *e = d.y, *g;
++ double f;
++ c[0] = g[0] + f * e[0];
++ c[1] = g[1] + f * e[1];
++ func1 (c);
++ }
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/pr71670.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/pr71670.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/pr71670.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/pr71670.c 2016-07-04 09:52:38.000000000 +0000
+@@ -0,0 +1,7 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-options "-mcpu=power9 -O1" } */
++
++volatile int a;
++int b;
++void fn1(void) { b + (long)b || a; }
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/pr71698.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/pr71698.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/pr71698.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/pr71698.c 2016-07-01 16:06:26.000000000 +0000
+@@ -0,0 +1,13 @@
++/* Test for a reload ICE arising from trying to direct move a TDmode value. */
++/* { dg-do compile } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-require-effective-target dfp } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-options "-O1 -mcpu=power9 -mno-lra" } */
++
++extern void testvad128 (int n, ...);
++void
++testitd128 (_Decimal128 g01d128)
++{
++ testvad128 (1, g01d128);
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/pr71720.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/pr71720.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/pr71720.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/pr71720.c 2016-07-07 22:44:15.000000000 +0000
+@@ -0,0 +1,15 @@
++/* { dg-do compile { target { powerpc64*-*-* && lp64 } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-options "-mcpu=power9 -O2" } */
++
++/* Verify that we generate xxspltw <reg>,<reg>,0 for V4SFmode splat. */
++
++vector float
++splat_v4sf (float f)
++{
++ return (vector float) { f, f, f, f };
++}
++
++/* { dg-final { scan-assembler "xscvdpspn " } } */
++/* { dg-final { scan-assembler "xxspltw .*,.*,0" } } */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/pr71763.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/pr71763.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/pr71763.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/pr71763.c 2016-07-15 20:58:23.000000000 +0000
+@@ -0,0 +1,25 @@
++// PR target/71763
++// { dg-do compile }
++// { dg-options "-O1 -mvsx" }
++
++int a, b;
++float c;
++
++void fn2(void);
++
++void fn1(void)
++{
++ long d;
++
++ for (d = 3; d; d--) {
++ for (a = 0; a <= 1; a++) {
++ b &= 1;
++ if (b) {
++ for (;;) {
++ fn2();
++ c = d;
++ }
++ }
++ }
++ }
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/pr71805.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/pr71805.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/pr71805.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/pr71805.c 2016-07-12 18:12:11.000000000 +0000
+@@ -0,0 +1,113 @@
++/* { dg-require-effective-target p9vector_hw } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-options "-mcpu=power9 -O3 --param tree-reassoc-width=1" } */
++
++/* Originally from gcc.dg/vect/pr45752.c. */
++#include <stdarg.h>
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++extern void abort (void);
++extern void exit (int);
++#ifdef __cplusplus
++}
++#endif
++
++#define M00 100
++#define M10 216
++#define M20 23
++#define M30 237
++#define M40 437
++
++#define M01 1322
++#define M11 13
++#define M21 27271
++#define M31 2280
++#define M41 284
++
++#define M02 74
++#define M12 191
++#define M22 500
++#define M32 111
++#define M42 1114
++
++#define M03 134
++#define M13 117
++#define M23 11
++#define M33 771
++#define M43 71
++
++#define M04 334
++#define M14 147
++#define M24 115
++#define M34 7716
++#define M44 16
++
++#define N 20
++
++void foo (unsigned int *__restrict__ pInput,
++ unsigned int *__restrict__ pOutput,
++ unsigned int *__restrict__ pInput2,
++ unsigned int *__restrict__ pOutput2)
++{
++ unsigned int i, a, b, c, d, e;
++
++ for (i = 0; i < N / 5; i++)
++ {
++ a = *pInput++;
++ b = *pInput++;
++ c = *pInput++;
++ d = *pInput++;
++ e = *pInput++;
++
++ *pOutput++ = M00 * a + M01 * b + M02 * c + M03 * d + M04 * e;
++ *pOutput++ = M10 * a + M11 * b + M12 * c + M13 * d + M14 * e;
++ *pOutput++ = M20 * a + M21 * b + M22 * c + M23 * d + M24 * e;
++ *pOutput++ = M30 * a + M31 * b + M32 * c + M33 * d + M34 * e;
++ *pOutput++ = M40 * a + M41 * b + M42 * c + M43 * d + M44 * e;
++
++
++ a = *pInput2++;
++ b = *pInput2++;
++ c = *pInput2++;
++ d = *pInput2++;
++ e = *pInput2++;
++
++ *pOutput2++ = M00 * a + M01 * b + M02 * c + M03 * d + M04 * e;
++ *pOutput2++ = M10 * a + M11 * b + M12 * c + M13 * d + M14 * e;
++ *pOutput2++ = M20 * a + M21 * b + M22 * c + M23 * d + M24 * e;
++ *pOutput2++ = M30 * a + M31 * b + M32 * c + M33 * d + M34 * e;
++ *pOutput2++ = M40 * a + M41 * b + M42 * c + M43 * d + M44 * e;
++
++ }
++}
++
++int main (int argc, const char* argv[])
++{
++ unsigned int input[N], output[N], i, input2[N], output2[N];
++ unsigned int check_results[N]
++ = {3208, 1334, 28764, 35679, 2789, 13028, 4754, 168364, 91254, 12399,
++ 22848, 8174, 307964, 146829, 22009, 32668, 11594, 447564, 202404, 31619 };
++ unsigned int check_results2[N]
++ = {7136, 2702, 84604, 57909, 6633, 16956, 6122, 224204, 113484, 16243,
++ 26776, 9542, 363804, 169059, 25853, 36596, 12962, 503404, 224634, 35463 };
++
++ for (i = 0; i < N; i++)
++ {
++ input[i] = i%256;
++ input2[i] = i + 2;
++ output[i] = 0;
++ output2[i] = 0;
++ __asm__ volatile ("");
++ }
++
++ foo (input, output, input2, output2);
++
++ for (i = 0; i < N; i++)
++ if (output[i] != check_results[i]
++ || output2[i] != check_results2[i])
++ abort ();
++
++ return 0;
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/signbit-1.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/signbit-1.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/signbit-1.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/signbit-1.c 2016-07-12 19:51:09.000000000 +0000
+@@ -0,0 +1,16 @@
++/* { dg-do compile { target { powerpc*-*-* && lp64 } } } */
++/* { dg-skip-if "" { powerpc*-*-darwin* } } */
++/* { dg-require-effective-target powerpc_p8vector_ok } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power8" } } */
++/* { dg-options "-mcpu=power8 -O2 -mfloat128" } */
++
++int do_signbit_kf (__float128 a) { return __builtin_signbit (a); }
++int do_signbit_if (__ibm128 a) { return __builtin_signbit (a); }
++int do_signbit_tf (long double a) { return __builtin_signbit (a); }
++
++/* { dg-final { scan-assembler-not "stxvd2x" } } */
++/* { dg-final { scan-assembler-not "stxvw4x" } } */
++/* { dg-final { scan-assembler-not "stxsd" } } */
++/* { dg-final { scan-assembler-not "stxsdx" } } */
++/* { dg-final { scan-assembler-times "mfvsrd" 3 } } */
++/* { dg-final { scan-assembler-times "srdi" 3 } } */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/signbit-2.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/signbit-2.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/signbit-2.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/signbit-2.c 2016-07-12 19:51:09.000000000 +0000
+@@ -0,0 +1,18 @@
++/* { dg-do compile { target { powerpc*-*-* && lp64 } } } */
++/* { dg-skip-if "" { powerpc*-*-darwin* } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-options "-mcpu=power9 -O2 -mfloat128" } */
++
++int do_signbit_kf (__float128 *a) { return __builtin_signbit (*a); }
++
++/* { dg-final { scan-assembler-not "stxvd2x" } } */
++/* { dg-final { scan-assembler-not "stxvw4x" } } */
++/* { dg-final { scan-assembler-not "stxsd" } } */
++/* { dg-final { scan-assembler-not "stxsdx" } } */
++/* { dg-final { scan-assembler-not "lxvd2x" } } */
++/* { dg-final { scan-assembler-not "lxvw4x" } } */
++/* { dg-final { scan-assembler-not "lxsd" } } */
++/* { dg-final { scan-assembler-not "lxsdx" } } */
++/* { dg-final { scan-assembler-times "ld" 1 } } */
++/* { dg-final { scan-assembler-times "srdi" 1 } } */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/signbit-3.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/signbit-3.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/signbit-3.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/signbit-3.c 2016-07-12 19:51:09.000000000 +0000
+@@ -0,0 +1,172 @@
++/* { dg-do run { target { powerpc*-*-linux* } } } */
++/* { dg-require-effective-target ppc_float128_sw } */
++/* { dg-options "-mcpu=power7 -O2 -mfloat128 -lm" } */
++
++#ifdef DEBUG
++#include <stdio.h>
++#endif
++
++#include <stddef.h>
++#include <stdint.h>
++#include <inttypes.h>
++#include <stdlib.h>
++#include <math.h>
++
++#if defined(__BIG_ENDIAN__)
++struct ieee128 {
++ uint64_t upper;
++ uint64_t lower;
++};
++
++#elif defined(__LITTLE_ENDIAN__)
++struct ieee128 {
++ uint64_t lower;
++ uint64_t upper;
++};
++
++#else
++#error "Unknown system"
++#endif
++
++union ieee_union {
++ __float128 f128;
++ struct ieee128 st128;
++};
++
++#ifdef DEBUG
++static int num_errors = 0;
++
++__attribute__((__noinline__))
++static void
++failure (int expected, int got, __float128 x)
++{
++ unsigned sign;
++ unsigned exponent;
++ uint64_t mantissa1;
++ uint64_t mantissa2;
++ uint64_t upper;
++ uint64_t lower;
++
++ union ieee_union u;
++
++ u.f128 = x;
++ upper = u.st128.upper;
++ lower = u.st128.lower;
++
++ sign = (unsigned)((upper >> 63) & 1);
++ exponent = (unsigned)((upper >> 48) & ((((uint64_t)1) << 16) - 1));
++ mantissa1 = (upper & ((((uint64_t)1) << 48) - 1));
++ mantissa2 = lower;
++
++ printf ("Expected %d, got %d, %c 0x%.4x 0x%.12" PRIx64 " 0x%.16" PRIx64,
++ expected, got,
++ sign ? '-' : '+',
++ exponent,
++ mantissa1,
++ mantissa2);
++
++ num_errors++;
++}
++
++#else
++
++#define failure(E, G, F) abort ()
++#endif
++
++__attribute__((__noinline__))
++static void
++test_signbit_arg (__float128 f128, int expected)
++{
++ int sign = __builtin_signbit (f128);
++
++ if ((expected != 0 && sign == 0)
++ || (expected == 0 && sign != 0))
++ failure (f128, expected, sign);
++}
++
++__attribute__((__noinline__))
++static void
++test_signbit_mem (__float128 *ptr, int expected)
++{
++ int sign = __builtin_signbit (*ptr);
++
++ if ((expected != 0 && sign == 0)
++ || (expected == 0 && sign != 0))
++ failure (*ptr, expected, sign);
++}
++
++__attribute__((__noinline__))
++static void
++test_signbit_gpr (__float128 *ptr, int expected)
++{
++ __float128 f128 = *ptr;
++ int sign;
++
++ __asm__ (" # %0" : "+r" (f128));
++
++ sign = __builtin_signbit (f128);
++ if ((expected != 0 && sign == 0)
++ || (expected == 0 && sign != 0))
++ failure (f128, expected, sign);
++}
++
++__attribute__((__noinline__))
++static void
++test_signbit (__float128 f128, int expected)
++{
++#ifdef DEBUG
++ union ieee_union u;
++ u.f128 = f128;
++ printf ("Expecting %d, trying %-5g "
++ "(0x%.16" PRIx64 " 0x%.16" PRIx64 ")\n",
++ expected, (double)f128,
++ u.st128.upper, u.st128.lower);
++#endif
++
++ test_signbit_arg (f128, expected);
++ test_signbit_mem (&f128, expected);
++ test_signbit_gpr (&f128, expected);
++}
++
++int
++main (void)
++{
++ union ieee_union u;
++
++ test_signbit (+0.0q, 0);
++ test_signbit (+1.0q, 0);
++
++ test_signbit (-0.0q, 1);
++ test_signbit (-1.0q, 1);
++
++ test_signbit (__builtin_copysign (__builtin_infq (), +1.0q), 0);
++ test_signbit (__builtin_copysign (__builtin_infq (), -1.0q), 1);
++
++ test_signbit (__builtin_copysign (__builtin_nanq (""), +1.0q), 0);
++ test_signbit (__builtin_copysign (__builtin_nanq (""), -1.0q), 1);
++
++ /* force the bottom double word to have specific bits in the 'sign' bit to
++ make sure we are picking the right word. */
++ u.f128 = 1.0q;
++ u.st128.lower = 0ULL;
++ test_signbit (u.f128, 0);
++
++ u.st128.lower = ~0ULL;
++ test_signbit (u.f128, 0);
++
++ u.f128 = -1.0q;
++ u.st128.lower = 0ULL;
++ test_signbit (u.f128, 1);
++
++ u.st128.lower = ~0ULL;
++ test_signbit (u.f128, 1);
++
++#ifdef DEBUG
++ printf ("%d error(s) were found\n", num_errors);
++ if (num_errors)
++ return num_errors;
++#endif
++
++ return 0;
++}
++
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/vadsdu-0.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/vadsdu-0.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/vadsdu-0.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/vadsdu-0.c 2016-06-30 17:07:42.000000000 +0000
+@@ -0,0 +1,24 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power9" } */
++
++/* This test should succeed on both 32- and 64-bit configurations. */
++#include <altivec.h>
++
++__vector unsigned int
++doAbsoluteDifferenceUnsignedInt (__vector unsigned int *p,
++ __vector unsigned int *q)
++{
++ __vector unsigned int source_1, source_2;
++ __vector unsigned int result;
++
++ source_1 = *p;
++ source_2 = *q;
++
++ result = __builtin_vec_vadu (source_1, source_2);
++ return result;
++}
++
++/* { dg-final { scan-assembler "vabsduw" } } */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/vadsdu-1.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/vadsdu-1.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/vadsdu-1.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/vadsdu-1.c 2016-06-30 17:07:42.000000000 +0000
+@@ -0,0 +1,23 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power9" } */
++
++/* This test should succeed on both 32- and 64-bit configurations. */
++#include <altivec.h>
++
++__vector unsigned int
++doAbsoluteDifferenceUnsignedIntMacro (__vector unsigned int *p,
++ __vector unsigned int *q)
++{
++ __vector unsigned int result, source_1, source_2;
++
++ source_1 = *p;
++ source_2 = *q;
++
++ result = vec_absd (source_1, source_2);
++ return result;
++}
++
++/* { dg-final { scan-assembler "vabsduw" } } */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/vadsdu-2.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/vadsdu-2.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/vadsdu-2.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/vadsdu-2.c 2016-06-30 17:07:42.000000000 +0000
+@@ -0,0 +1,24 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power9" } */
++
++/* This test should succeed on both 32- and 64-bit configurations. */
++#include <altivec.h>
++
++__vector unsigned short
++doAbsoluteDifferenceUnsignedShort (__vector unsigned short *p,
++ __vector unsigned short *q)
++{
++ __vector unsigned short source_1, source_2;
++ __vector unsigned short result;
++
++ source_1 = *p;
++ source_2 = *q;
++
++ result = __builtin_vec_vadu (source_1, source_2);
++ return result;
++}
++
++/* { dg-final { scan-assembler "vabsduh" } } */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/vadsdu-3.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/vadsdu-3.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/vadsdu-3.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/vadsdu-3.c 2016-06-30 17:07:42.000000000 +0000
+@@ -0,0 +1,23 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power9" } */
++
++/* This test should succeed on both 32- and 64-bit configurations. */
++#include <altivec.h>
++
++__vector unsigned short
++doAbsoluteDifferenceUnsignedShortMacro (__vector unsigned short *p,
++ __vector unsigned short *q)
++{
++ __vector unsigned short result, source_1, source_2;
++
++ source_1 = *p;
++ source_2 = *q;
++
++ result = vec_absd (source_1, source_2);
++ return result;
++}
++
++/* { dg-final { scan-assembler "vabsduh" } } */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/vadsdu-4.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/vadsdu-4.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/vadsdu-4.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/vadsdu-4.c 2016-06-30 17:07:42.000000000 +0000
+@@ -0,0 +1,24 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power9" } */
++
++/* This test should succeed on both 32- and 64-bit configurations. */
++#include <altivec.h>
++
++__vector unsigned char
++doAbsoluteDifferenceUnsignedChar (__vector unsigned char *p,
++ __vector unsigned char *q)
++{
++ __vector unsigned char source_1, source_2;
++ __vector unsigned char result;
++
++ source_1 = *p;
++ source_2 = *q;
++
++ result = __builtin_vec_vadu (source_1, source_2);
++ return result;
++}
++
++/* { dg-final { scan-assembler "vabsdub" } } */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/vadsdu-5.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/vadsdu-5.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/vadsdu-5.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/vadsdu-5.c 2016-06-30 17:07:42.000000000 +0000
+@@ -0,0 +1,23 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power9" } */
++
++/* This test should succeed on both 32- and 64-bit configurations. */
++#include <altivec.h>
++
++__vector unsigned char
++doAbsoluteDifferenceUnsignedCharMacro (__vector unsigned char *p,
++ __vector unsigned char *q)
++{
++ __vector unsigned char result, source_1, source_2;
++
++ source_1 = *p;
++ source_2 = *q;
++
++ result = vec_absd (source_1, source_2);
++ return result;
++}
++
++/* { dg-final { scan-assembler "vabsdub" } } */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/vadsdub-1.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/vadsdub-1.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/vadsdub-1.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/vadsdub-1.c 2016-06-30 17:07:42.000000000 +0000
+@@ -0,0 +1,24 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power9" } */
++
++/* This test should succeed on both 32- and 64-bit configurations. */
++#include <altivec.h>
++
++__vector unsigned char
++doAbsoluteDifferenceUnsigned (__vector unsigned char *p,
++ __vector unsigned char *q)
++{
++ __vector unsigned char source_1, source_2;
++ __vector unsigned char uc_result;
++
++ source_1 = *p;
++ source_2 = *q;
++
++ uc_result = __builtin_vec_vadub (source_1, source_2);
++ return uc_result;
++}
++
++/* { dg-final { scan-assembler "vabsdub" } } */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/vadsdub-2.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/vadsdub-2.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/vadsdub-2.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/vadsdub-2.c 2016-06-30 17:07:42.000000000 +0000
+@@ -0,0 +1,24 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power9" } */
++
++/* This test should succeed on both 32- and 64-bit configurations. */
++#include <altivec.h>
++
++__vector unsigned char
++doAbsoluteDifferenceUnsigned (__vector unsigned char *p,
++ __vector unsigned char *q)
++{
++ __vector unsigned char source_1, source_2;
++ __vector unsigned char uc_result;
++
++ source_1 = *p;
++ source_2 = *q;
++
++ uc_result = vec_absdb (source_1, source_2);
++ return uc_result;
++}
++
++/* { dg-final { scan-assembler "vabsdub" } } */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/vadsduh-1.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/vadsduh-1.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/vadsduh-1.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/vadsduh-1.c 2016-06-30 17:07:42.000000000 +0000
+@@ -0,0 +1,24 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power9" } */
++
++/* This test should succeed on both 32- and 64-bit configurations. */
++#include <altivec.h>
++
++__vector unsigned short
++doAbsoluteDifferenceUnsigned (__vector unsigned short *p,
++ __vector unsigned short *q)
++{
++ __vector unsigned short source_1, source_2;
++ __vector unsigned short us_result;
++
++ source_1 = *p;
++ source_2 = *q;
++
++ us_result = __builtin_vec_vaduh (source_1, source_2);
++ return us_result;
++}
++
++/* { dg-final { scan-assembler "vabsduh" } } */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/vadsduh-2.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/vadsduh-2.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/vadsduh-2.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/vadsduh-2.c 2016-06-30 17:07:42.000000000 +0000
+@@ -0,0 +1,23 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power9" } */
++
++/* This test should succeed on both 32- and 64-bit configurations. */
++#include <altivec.h>
++
++__vector unsigned short
++doAbsoluteDifferenceUnsignedMacro (__vector unsigned short *p,
++ __vector unsigned short *q)
++{
++ __vector unsigned short result, source_1, source_2;
++
++ source_1 = *p;
++ source_2 = *q;
++
++ result = vec_absdh (source_1, source_2);
++ return result;
++}
++
++/* { dg-final { scan-assembler "vabsduh" } } */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/vadsduw-1.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/vadsduw-1.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/vadsduw-1.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/vadsduw-1.c 2016-06-30 17:07:42.000000000 +0000
+@@ -0,0 +1,24 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power9" } */
++
++/* This test should succeed on both 32- and 64-bit configurations. */
++#include <altivec.h>
++
++__vector unsigned int
++doAbsoluteDifferenceUnsigned (__vector unsigned int *p,
++ __vector unsigned int *q)
++{
++ __vector unsigned int source_1, source_2;
++ __vector unsigned int ui_result;
++
++ source_1 = *p;
++ source_2 = *q;
++
++ ui_result = __builtin_vec_vaduw (source_1, source_2);
++ return ui_result;
++}
++
++/* { dg-final { scan-assembler "vabsduw" } } */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/vadsduw-2.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/vadsduw-2.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/vadsduw-2.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/vadsduw-2.c 2016-06-30 17:07:42.000000000 +0000
+@@ -0,0 +1,23 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power9" } */
++
++/* This test should succeed on both 32- and 64-bit configurations. */
++#include <altivec.h>
++
++__vector unsigned int
++doAbsoluteDifferenceUnsignedMacro (__vector unsigned int *p,
++ __vector unsigned int *q)
++{
++ __vector unsigned int result, source_1, source_2;
++
++ source_1 = *p;
++ source_2 = *q;
++
++ result = vec_absdw (source_1, source_2);
++ return result;
++}
++
++/* { dg-final { scan-assembler "vabsduw" } } */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/vslv-0.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/vslv-0.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/vslv-0.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/vslv-0.c 2016-07-01 20:09:06.000000000 +0000
+@@ -0,0 +1,17 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power9" } */
++
++#include <altivec.h>
++
++__vector unsigned char
++doCharShiftLeft (__vector unsigned char *p, __vector unsigned char *q)
++{
++ __vector unsigned char result, input, shift_distance;
++ result = __builtin_vec_vslv (input, shift_distance);
++ return result;
++}
++
++/* { dg-final { scan-assembler "vslv" } } */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/vslv-1.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/vslv-1.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/vslv-1.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/vslv-1.c 2016-07-01 20:09:06.000000000 +0000
+@@ -0,0 +1,17 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power9" } */
++
++#include <altivec.h>
++
++__vector unsigned char
++doCharShiftLeft (__vector unsigned char *p, __vector unsigned char *q)
++{
++ __vector unsigned char result, input, shift_distance;
++ result = vec_slv (input, shift_distance);
++ return result;
++}
++
++/* { dg-final { scan-assembler "vslv" } } */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/vsrv-0.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/vsrv-0.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/vsrv-0.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/vsrv-0.c 2016-07-01 20:09:06.000000000 +0000
+@@ -0,0 +1,17 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power9" } */
++
++#include <altivec.h>
++
++__vector unsigned char
++doCharShiftLeft (__vector unsigned char *p, __vector unsigned char *q)
++{
++ __vector unsigned char result, input, shift_distance;
++ result = __builtin_vec_vsrv (input, shift_distance);
++ return result;
++}
++
++/* { dg-final { scan-assembler "vsrv" } } */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/vsrv-1.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/vsrv-1.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/vsrv-1.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/vsrv-1.c 2016-07-01 20:09:06.000000000 +0000
+@@ -0,0 +1,17 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } } */
++/* { dg-options "-mcpu=power9" } */
++
++#include <altivec.h>
++
++__vector unsigned char
++doCharShiftLeft (__vector unsigned char *p, __vector unsigned char *q)
++{
++ __vector unsigned char result, input, shift_distance;
++ result = vec_srv (input, shift_distance);
++ return result;
++}
++
++/* { dg-final { scan-assembler "vsrv" } } */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/vsx-elemrev-1.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/vsx-elemrev-1.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/vsx-elemrev-1.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/vsx-elemrev-1.c 2016-05-30 17:09:22.000000000 +0000
+@@ -0,0 +1,143 @@
++/* { dg-do compile { target { powerpc64le*-*-* } } } */
++/* { dg-skip-if "do not override mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power8" } } */
++/* { dg-options "-mcpu=power8 -O0" } */
++/* { dg-final { scan-assembler-times "lxvd2x" 18 } } */
++/* { dg-final { scan-assembler-times "lxvw4x" 6 } } */
++/* { dg-final { scan-assembler-times "stxvd2x" 18 } } */
++/* { dg-final { scan-assembler-times "stxvw4x" 6 } } */
++/* { dg-final { scan-assembler-times "xxpermdi" 24 } } */
++
++#include <altivec.h>
++
++extern vector double vd, *vdp;
++extern vector signed long long vsll, *vsllp;
++extern vector unsigned long long vull, *vullp;
++extern vector float vf, *vfp;
++extern vector signed int vsi, *vsip;
++extern vector unsigned int vui, *vuip;
++extern double *dp;
++extern signed long long *sllp;
++extern unsigned long long *ullp;
++extern float *fp;
++extern signed int *sip;
++extern unsigned int *uip;
++
++void foo0 (void)
++{
++ vd = vec_xl (0, vdp);
++}
++
++void foo1 (void)
++{
++ vsll = vec_xl (0, vsllp);
++}
++
++void foo2 (void)
++{
++ vull = vec_xl (0, vullp);
++}
++
++void foo3 (void)
++{
++ vf = vec_xl (0, vfp);
++}
++
++void foo4 (void)
++{
++ vsi = vec_xl (0, vsip);
++}
++
++void foo5 (void)
++{
++ vui = vec_xl (0, vuip);
++}
++
++void foo6 (void)
++{
++ vec_xst (vd, 0, vdp);
++}
++
++void foo7 (void)
++{
++ vec_xst (vsll, 0, vsllp);
++}
++
++void foo8 (void)
++{
++ vec_xst (vull, 0, vullp);
++}
++
++void foo9 (void)
++{
++ vec_xst (vf, 0, vfp);
++}
++
++void foo10 (void)
++{
++ vec_xst (vsi, 0, vsip);
++}
++
++void foo11 (void)
++{
++ vec_xst (vui, 0, vuip);
++}
++
++void foo20 (void)
++{
++ vd = vec_xl (0, dp);
++}
++
++void foo21 (void)
++{
++ vsll = vec_xl (0, sllp);
++}
++
++void foo22 (void)
++{
++ vull = vec_xl (0, ullp);
++}
++
++void foo23 (void)
++{
++ vf = vec_xl (0, fp);
++}
++
++void foo24 (void)
++{
++ vsi = vec_xl (0, sip);
++}
++
++void foo25 (void)
++{
++ vui = vec_xl (0, uip);
++}
++
++void foo26 (void)
++{
++ vec_xst (vd, 0, dp);
++}
++
++void foo27 (void)
++{
++ vec_xst (vsll, 0, sllp);
++}
++
++void foo28 (void)
++{
++ vec_xst (vull, 0, ullp);
++}
++
++void foo29 (void)
++{
++ vec_xst (vf, 0, fp);
++}
++
++void foo30 (void)
++{
++ vec_xst (vsi, 0, sip);
++}
++
++void foo31 (void)
++{
++ vec_xst (vui, 0, uip);
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/vsx-elemrev-2.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/vsx-elemrev-2.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/vsx-elemrev-2.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/vsx-elemrev-2.c 2016-06-16 16:27:24.000000000 +0000
+@@ -0,0 +1,236 @@
++/* { dg-do compile { target { powerpc64le*-*-* } } } */
++/* { dg-skip-if "do not override mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-options "-mcpu=power9 -O0" } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } { "*" } { "" } } */
++/* { dg-final { scan-assembler-times "lxvd2x" 6 } } */
++/* { dg-final { scan-assembler-times "lxvw4x" 6 } } */
++/* { dg-final { scan-assembler-times "lxvh8x" 4 } } */
++/* { dg-final { scan-assembler-times "lxvb16x" 4 } } */
++/* { dg-final { scan-assembler-times "stxvd2x" 6 } } */
++/* { dg-final { scan-assembler-times "stxvw4x" 6 } } */
++/* { dg-final { scan-assembler-times "stxvh8x" 4 } } */
++/* { dg-final { scan-assembler-times "stxvb16x" 4 } } */
++
++#include <altivec.h>
++
++extern vector double vd, *vdp;
++extern vector signed long long vsll, *vsllp;
++extern vector unsigned long long vull, *vullp;
++extern vector float vf, *vfp;
++extern vector signed int vsi, *vsip;
++extern vector unsigned int vui, *vuip;
++extern vector signed short vss, *vssp;
++extern vector unsigned short vus, *vusp;
++extern vector signed char vsc, *vscp;
++extern vector unsigned char vuc, *vucp;
++extern double *dp;
++extern signed long long *sllp;
++extern unsigned long long *ullp;
++extern float *fp;
++extern signed int *sip;
++extern unsigned int *uip;
++extern signed short *ssp;
++extern unsigned short *usp;
++extern signed char *scp;
++extern unsigned char *ucp;
++
++void foo0 (void)
++{
++ vd = vec_xl (0, vdp);
++}
++
++void foo1 (void)
++{
++ vsll = vec_xl (0, vsllp);
++}
++
++void foo2 (void)
++{
++ vull = vec_xl (0, vullp);
++}
++
++void foo3 (void)
++{
++ vf = vec_xl (0, vfp);
++}
++
++void foo4 (void)
++{
++ vsi = vec_xl (0, vsip);
++}
++
++void foo5 (void)
++{
++ vui = vec_xl (0, vuip);
++}
++
++void foo6 (void)
++{
++ vss = vec_xl (0, vssp);
++}
++
++void foo7 (void)
++{
++ vus = vec_xl (0, vusp);
++}
++
++void foo8 (void)
++{
++ vsc = vec_xl (0, vscp);
++}
++
++void foo9 (void)
++{
++ vuc = vec_xl (0, vucp);
++}
++
++void foo10 (void)
++{
++ vec_xst (vd, 0, vdp);
++}
++
++void foo11 (void)
++{
++ vec_xst (vsll, 0, vsllp);
++}
++
++void foo12 (void)
++{
++ vec_xst (vull, 0, vullp);
++}
++
++void foo13 (void)
++{
++ vec_xst (vf, 0, vfp);
++}
++
++void foo14 (void)
++{
++ vec_xst (vsi, 0, vsip);
++}
++
++void foo15 (void)
++{
++ vec_xst (vui, 0, vuip);
++}
++
++void foo16 (void)
++{
++ vec_xst (vss, 0, vssp);
++}
++
++void foo17 (void)
++{
++ vec_xst (vus, 0, vusp);
++}
++
++void foo18 (void)
++{
++ vec_xst (vsc, 0, vscp);
++}
++
++void foo19 (void)
++{
++ vec_xst (vuc, 0, vucp);
++}
++
++void foo20 (void)
++{
++ vd = vec_xl (0, dp);
++}
++
++void foo21 (void)
++{
++ vsll = vec_xl (0, sllp);
++}
++
++void foo22 (void)
++{
++ vull = vec_xl (0, ullp);
++}
++
++void foo23 (void)
++{
++ vf = vec_xl (0, fp);
++}
++
++void foo24 (void)
++{
++ vsi = vec_xl (0, sip);
++}
++
++void foo25 (void)
++{
++ vui = vec_xl (0, uip);
++}
++
++void foo26 (void)
++{
++ vss = vec_xl (0, ssp);
++}
++
++void foo27 (void)
++{
++ vus = vec_xl (0, usp);
++}
++
++void foo28 (void)
++{
++ vsc = vec_xl (0, scp);
++}
++
++void foo29 (void)
++{
++ vuc = vec_xl (0, ucp);
++}
++
++void foo30 (void)
++{
++ vec_xst (vd, 0, dp);
++}
++
++void foo31 (void)
++{
++ vec_xst (vsll, 0, sllp);
++}
++
++void foo32 (void)
++{
++ vec_xst (vull, 0, ullp);
++}
++
++void foo33 (void)
++{
++ vec_xst (vf, 0, fp);
++}
++
++void foo34 (void)
++{
++ vec_xst (vsi, 0, sip);
++}
++
++void foo35 (void)
++{
++ vec_xst (vui, 0, uip);
++}
++
++void foo36 (void)
++{
++ vec_xst (vss, 0, ssp);
++}
++
++void foo37 (void)
++{
++ vec_xst (vus, 0, usp);
++}
++
++void foo38 (void)
++{
++ vec_xst (vsc, 0, scp);
++}
++
++void foo39 (void)
++{
++ vec_xst (vuc, 0, ucp);
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/vsx-elemrev-3.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/vsx-elemrev-3.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/vsx-elemrev-3.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/vsx-elemrev-3.c 2016-05-30 17:09:22.000000000 +0000
+@@ -0,0 +1,142 @@
++/* { dg-do compile { target { powerpc64-*-* } } } */
++/* { dg-skip-if "do not override mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power8" } } */
++/* { dg-options "-mcpu=power8 -O0" } */
++/* { dg-final { scan-assembler-times "lxvd2x" 16 } } */
++/* { dg-final { scan-assembler-times "lxvw4x" 8 } } */
++/* { dg-final { scan-assembler-times "stxvd2x" 16 } } */
++/* { dg-final { scan-assembler-times "stxvw4x" 8 } } */
++
++#include <altivec.h>
++
++extern vector double vd, *vdp;
++extern vector signed long long vsll, *vsllp;
++extern vector unsigned long long vull, *vullp;
++extern vector float vf, *vfp;
++extern vector signed int vsi, *vsip;
++extern vector unsigned int vui, *vuip;
++extern double *dp;
++extern signed long long *sllp;
++extern unsigned long long *ullp;
++extern float *fp;
++extern signed int *sip;
++extern unsigned int *uip;
++
++void foo0 (void)
++{
++ vd = vec_xl (0, vdp);
++}
++
++void foo1 (void)
++{
++ vsll = vec_xl (0, vsllp);
++}
++
++void foo2 (void)
++{
++ vull = vec_xl (0, vullp);
++}
++
++void foo3 (void)
++{
++ vf = vec_xl (0, vfp);
++}
++
++void foo4 (void)
++{
++ vsi = vec_xl (0, vsip);
++}
++
++void foo5 (void)
++{
++ vui = vec_xl (0, vuip);
++}
++
++void foo6 (void)
++{
++ vec_xst (vd, 0, vdp);
++}
++
++void foo7 (void)
++{
++ vec_xst (vsll, 0, vsllp);
++}
++
++void foo8 (void)
++{
++ vec_xst (vull, 0, vullp);
++}
++
++void foo9 (void)
++{
++ vec_xst (vf, 0, vfp);
++}
++
++void foo10 (void)
++{
++ vec_xst (vsi, 0, vsip);
++}
++
++void foo11 (void)
++{
++ vec_xst (vui, 0, vuip);
++}
++
++void foo20 (void)
++{
++ vd = vec_xl (0, dp);
++}
++
++void foo21 (void)
++{
++ vsll = vec_xl (0, sllp);
++}
++
++void foo22 (void)
++{
++ vull = vec_xl (0, ullp);
++}
++
++void foo23 (void)
++{
++ vf = vec_xl (0, fp);
++}
++
++void foo24 (void)
++{
++ vsi = vec_xl (0, sip);
++}
++
++void foo25 (void)
++{
++ vui = vec_xl (0, uip);
++}
++
++void foo26 (void)
++{
++ vec_xst (vd, 0, dp);
++}
++
++void foo27 (void)
++{
++ vec_xst (vsll, 0, sllp);
++}
++
++void foo28 (void)
++{
++ vec_xst (vull, 0, ullp);
++}
++
++void foo29 (void)
++{
++ vec_xst (vf, 0, fp);
++}
++
++void foo30 (void)
++{
++ vec_xst (vsi, 0, sip);
++}
++
++void foo31 (void)
++{
++ vec_xst (vui, 0, uip);
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/vsx-elemrev-4.c gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/vsx-elemrev-4.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/powerpc/vsx-elemrev-4.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/powerpc/vsx-elemrev-4.c 2016-06-16 16:27:24.000000000 +0000
+@@ -0,0 +1,230 @@
++/* { dg-do compile { target { powerpc64-*-* } } } */
++/* { dg-skip-if "do not override mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
++/* { dg-options "-mcpu=power9 -O0" } */
++/* { dg-require-effective-target powerpc_p9vector_ok } */
++/* { dg-skip-if "" { powerpc*-*-aix* } { "*" } { "" } } */
++/* { dg-final { scan-assembler-times "lxvx" 40 } } */
++/* { dg-final { scan-assembler-times "stxvx" 40 } } */
++
++#include <altivec.h>
++
++extern vector double vd, *vdp;
++extern vector signed long long vsll, *vsllp;
++extern vector unsigned long long vull, *vullp;
++extern vector float vf, *vfp;
++extern vector signed int vsi, *vsip;
++extern vector unsigned int vui, *vuip;
++extern vector signed short vss, *vssp;
++extern vector unsigned short vus, *vusp;
++extern vector signed char vsc, *vscp;
++extern vector unsigned char vuc, *vucp;
++extern double *dp;
++extern signed long long *sllp;
++extern unsigned long long *ullp;
++extern float *fp;
++extern signed int *sip;
++extern unsigned int *uip;
++extern signed short *ssp;
++extern unsigned short *usp;
++extern signed char *scp;
++extern unsigned char *ucp;
++
++void foo0 (void)
++{
++ vd = vec_xl (0, vdp);
++}
++
++void foo1 (void)
++{
++ vsll = vec_xl (0, vsllp);
++}
++
++void foo2 (void)
++{
++ vull = vec_xl (0, vullp);
++}
++
++void foo3 (void)
++{
++ vf = vec_xl (0, vfp);
++}
++
++void foo4 (void)
++{
++ vsi = vec_xl (0, vsip);
++}
++
++void foo5 (void)
++{
++ vui = vec_xl (0, vuip);
++}
++
++void foo6 (void)
++{
++ vss = vec_xl (0, vssp);
++}
++
++void foo7 (void)
++{
++ vus = vec_xl (0, vusp);
++}
++
++void foo8 (void)
++{
++ vsc = vec_xl (0, vscp);
++}
++
++void foo9 (void)
++{
++ vuc = vec_xl (0, vucp);
++}
++
++void foo10 (void)
++{
++ vec_xst (vd, 0, vdp);
++}
++
++void foo11 (void)
++{
++ vec_xst (vsll, 0, vsllp);
++}
++
++void foo12 (void)
++{
++ vec_xst (vull, 0, vullp);
++}
++
++void foo13 (void)
++{
++ vec_xst (vf, 0, vfp);
++}
++
++void foo14 (void)
++{
++ vec_xst (vsi, 0, vsip);
++}
++
++void foo15 (void)
++{
++ vec_xst (vui, 0, vuip);
++}
++
++void foo16 (void)
++{
++ vec_xst (vss, 0, vssp);
++}
++
++void foo17 (void)
++{
++ vec_xst (vus, 0, vusp);
++}
++
++void foo18 (void)
++{
++ vec_xst (vsc, 0, vscp);
++}
++
++void foo19 (void)
++{
++ vec_xst (vuc, 0, vucp);
++}
++
++void foo20 (void)
++{
++ vd = vec_xl (0, dp);
++}
++
++void foo21 (void)
++{
++ vsll = vec_xl (0, sllp);
++}
++
++void foo22 (void)
++{
++ vull = vec_xl (0, ullp);
++}
++
++void foo23 (void)
++{
++ vf = vec_xl (0, fp);
++}
++
++void foo24 (void)
++{
++ vsi = vec_xl (0, sip);
++}
++
++void foo25 (void)
++{
++ vui = vec_xl (0, uip);
++}
++
++void foo26 (void)
++{
++ vss = vec_xl (0, ssp);
++}
++
++void foo27 (void)
++{
++ vus = vec_xl (0, usp);
++}
++
++void foo28 (void)
++{
++ vsc = vec_xl (0, scp);
++}
++
++void foo29 (void)
++{
++ vuc = vec_xl (0, ucp);
++}
++
++void foo30 (void)
++{
++ vec_xst (vd, 0, dp);
++}
++
++void foo31 (void)
++{
++ vec_xst (vsll, 0, sllp);
++}
++
++void foo32 (void)
++{
++ vec_xst (vull, 0, ullp);
++}
++
++void foo33 (void)
++{
++ vec_xst (vf, 0, fp);
++}
++
++void foo34 (void)
++{
++ vec_xst (vsi, 0, sip);
++}
++
++void foo35 (void)
++{
++ vec_xst (vui, 0, uip);
++}
++
++void foo36 (void)
++{
++ vec_xst (vss, 0, ssp);
++}
++
++void foo37 (void)
++{
++ vec_xst (vus, 0, usp);
++}
++
++void foo38 (void)
++{
++ vec_xst (vsc, 0, scp);
++}
++
++void foo39 (void)
++{
++ vec_xst (vuc, 0, ucp);
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/s390/nolrl-1.c gcc-6-20160721/gcc/testsuite/gcc.target/s390/nolrl-1.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/s390/nolrl-1.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/s390/nolrl-1.c 2016-07-18 10:52:23.000000000 +0000
+@@ -0,0 +1,19 @@
++/* Make sure the compiler does not try to use a relative long
++ instruction to load the string since it might not meet the
++ alignment requirements of the instruction. */
++
++/* { dg-do compile } */
++/* { dg-options "-march=z10 -O3 -mzarch" } */
++
++extern void foo (char*);
++
++void
++bar ()
++{
++ unsigned char z[32];
++
++ __builtin_memcpy (z, "\001\000\000\000", 4);
++ foo (z);
++}
++
++/* { dg-final { scan-assembler-not "lrl" } } */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/sparc/fpcmp.c gcc-6-20160721/gcc/testsuite/gcc.target/sparc/fpcmp.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/sparc/fpcmp.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/sparc/fpcmp.c 2016-06-08 13:34:25.000000000 +0000
+@@ -0,0 +1,18 @@
++/* { dg-do compile } */
++/* { dg-options "-mvis4" } */
++
++typedef unsigned char vec8 __attribute__((vector_size(8)));
++
++long test_fpcmple8 (vec8 a, vec8 b)
++{
++ return __builtin_vis_fpcmple8 (a, b);
++}
++
++long test_fpcmpgt8 (vec8 a, vec8 b)
++{
++ return __builtin_vis_fpcmpgt8 (a, b);
++}
++
++/* { dg-final { scan-assembler "fpcmple8\t%" } } */
++/* { dg-final { scan-assembler "fpcmpgt8\t%" } } */
++
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/sparc/fpcmpu.c gcc-6-20160721/gcc/testsuite/gcc.target/sparc/fpcmpu.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/sparc/fpcmpu.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/sparc/fpcmpu.c 2016-06-08 13:34:25.000000000 +0000
+@@ -0,0 +1,31 @@
++/* { dg-do compile } */
++/* { dg-options "-mvis4" } */
++
++
++typedef short vec16 __attribute__((vector_size(8)));
++typedef int vec32 __attribute__((vector_size(8)));
++
++long test_fpcmpule16 (vec16 a, vec16 b)
++{
++ return __builtin_vis_fpcmpule16 (a, b);
++}
++
++long test_fpcmpugt16 (vec16 a, vec16 b)
++{
++ return __builtin_vis_fpcmpugt16 (a, b);
++}
++
++long test_fpcmpule32 (vec32 a, vec32 b)
++{
++ return __builtin_vis_fpcmpule32 (a, b);
++}
++
++long test_fpcmpugt32 (vec32 a, vec32 b)
++{
++ return __builtin_vis_fpcmpugt32 (a, b);
++}
++
++/* { dg-final { scan-assembler "fpcmpule16\t%" } } */
++/* { dg-final { scan-assembler "fpcmpugt16\t%" } } */
++/* { dg-final { scan-assembler "fpcmpule32\t%" } } */
++/* { dg-final { scan-assembler "fpcmpugt32\t%" } } */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gcc.target/sparc/vis4misc.c gcc-6-20160721/gcc/testsuite/gcc.target/sparc/vis4misc.c
+--- gcc-6.1.0/gcc/testsuite/gcc.target/sparc/vis4misc.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gcc.target/sparc/vis4misc.c 2016-06-08 13:34:25.000000000 +0000
+@@ -0,0 +1,126 @@
++/* { dg-do compile } */
++/* { dg-options "-mvis4" } */
++typedef int __v2si __attribute__((vector_size(8)));
++typedef short __v4hi __attribute__((vector_size(8)));
++typedef unsigned char __v8qi __attribute__((vector_size(8)));
++
++__v8qi test_fpadd8 (__v8qi x, __v8qi y)
++{
++ return __builtin_vis_fpadd8 (x, y);
++}
++
++__v8qi test_fpadds8 (__v8qi x, __v8qi y)
++{
++ return __builtin_vis_fpadds8 (x, y);
++}
++
++__v8qi test_fpaddus8 (__v8qi x, __v8qi y)
++{
++ return __builtin_vis_fpaddus8 (x, y);
++}
++
++__v4hi test_fpaddus16 (__v4hi x, __v4hi y)
++{
++ return __builtin_vis_fpaddus16 (x, y);
++}
++
++__v8qi test_fpsub8 (__v8qi x, __v8qi y)
++{
++ return __builtin_vis_fpsub8 (x, y);
++}
++
++__v8qi test_fpsubs8 (__v8qi x, __v8qi y)
++{
++ return __builtin_vis_fpsubs8 (x, y);
++}
++
++__v8qi test_fpsubus8 (__v8qi x, __v8qi y)
++{
++ return __builtin_vis_fpsubus8 (x, y);
++}
++
++__v4hi test_fpsubus16 (__v4hi x, __v4hi y)
++{
++ return __builtin_vis_fpsubus16 (x, y);
++}
++
++__v8qi test_fpmax8 (__v8qi x, __v8qi y)
++{
++ return __builtin_vis_fpmax8 (x, y);
++}
++
++__v4hi test_fpmax16 (__v4hi x, __v4hi y)
++{
++ return __builtin_vis_fpmax16 (x, y);
++}
++
++__v2si test_fpmax32 (__v2si x, __v2si y)
++{
++ return __builtin_vis_fpmax32 (x, y);
++}
++
++__v8qi test_fpmaxu8 (__v8qi x, __v8qi y)
++{
++ return __builtin_vis_fpmaxu8 (x, y);
++}
++
++__v4hi test_fpmaxu16 (__v4hi x, __v4hi y)
++{
++ return __builtin_vis_fpmaxu16 (x, y);
++}
++
++__v2si test_fpmaxu32 (__v2si x, __v2si y)
++{
++ return __builtin_vis_fpmaxu32 (x, y);
++}
++
++__v8qi test_fpmin8 (__v8qi x, __v8qi y)
++{
++ return __builtin_vis_fpmin8 (x, y);
++}
++
++__v4hi test_fpmin16 (__v4hi x, __v4hi y)
++{
++ return __builtin_vis_fpmin16 (x, y);
++}
++
++__v2si test_fpmin32 (__v2si x, __v2si y)
++{
++ return __builtin_vis_fpmin32 (x, y);
++}
++
++__v8qi test_fpminu8 (__v8qi x, __v8qi y)
++{
++ return __builtin_vis_fpminu8 (x, y);
++}
++
++__v4hi test_fpminu16 (__v4hi x, __v4hi y)
++{
++ return __builtin_vis_fpminu16 (x, y);
++}
++
++__v2si test_fpminu32 (__v2si x, __v2si y)
++{
++ return __builtin_vis_fpminu32 (x, y);
++}
++
++/* { dg-final { scan-assembler "fpadd8\t%" } } */
++/* { dg-final { scan-assembler "fpadds8\t%" } } */
++/* { dg-final { scan-assembler "fpaddus8\t%" } } */
++/* { dg-final { scan-assembler "fpaddus16\t%" } } */
++/* { dg-final { scan-assembler "fpsub8\t%" } } */
++/* { dg-final { scan-assembler "fpsubs8\t%" } } */
++/* { dg-final { scan-assembler "fpsubus8\t%" } } */
++/* { dg-final { scan-assembler "fpsubus16\t%" } } */
++/* { dg-final { scan-assembler "fpmax8\t%" } } */
++/* { dg-final { scan-assembler "fpmax16\t%" } } */
++/* { dg-final { scan-assembler "fpmax32\t%" } } */
++/* { dg-final { scan-assembler "fpmaxu8\t%" } } */
++/* { dg-final { scan-assembler "fpmaxu16\t%" } } */
++/* { dg-final { scan-assembler "fpmaxu32\t%" } } */
++/* { dg-final { scan-assembler "fpmin8\t%" } } */
++/* { dg-final { scan-assembler "fpmin16\t%" } } */
++/* { dg-final { scan-assembler "fpmin32\t%" } } */
++/* { dg-final { scan-assembler "fpminu8\t%" } } */
++/* { dg-final { scan-assembler "fpminu16\t%" } } */
++/* { dg-final { scan-assembler "fpminu32\t%" } } */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gfortran.dg/array_constructor_49.f90 gcc-6-20160721/gcc/testsuite/gfortran.dg/array_constructor_49.f90
+--- gcc-6.1.0/gcc/testsuite/gfortran.dg/array_constructor_49.f90 2015-05-29 08:20:29.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gfortran.dg/array_constructor_49.f90 2016-06-12 14:04:08.000000000 +0000
+@@ -6,7 +6,7 @@
+ program t
+ integer :: ndim=2, ndfp=4, i
+ character (len=8) :: line
+- write (unit=line,fmt='(4I2)'), (/ ( i, i = 1, ndfp ) /) + ndim
++ write (unit=line,fmt='(4I2)') (/ ( i, i = 1, ndfp ) /) + ndim
+ if (line /= ' 3 4 5 6') call abort
+ end program t
+ ! { dg-final { scan-tree-dump-times "__var" 3 "original" } }
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gfortran.dg/class_array_22.f03 gcc-6-20160721/gcc/testsuite/gfortran.dg/class_array_22.f03
+--- gcc-6.1.0/gcc/testsuite/gfortran.dg/class_array_22.f03 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gfortran.dg/class_array_22.f03 2016-06-05 18:09:27.000000000 +0000
+@@ -0,0 +1,25 @@
++! { dg-do compile }
++! { dg-options "-frepack-arrays " }
++!
++! Original class_array_11.f03 but with -frepack-arrays a new
++! ICE was produced reported in
++! PR fortran/69659
++!
++! Original testcase by Ian Harvey <ian_harvey@bigpond.com>
++! Reduced by Janus Weil <Janus@gcc.gnu.org>
++
++ IMPLICIT NONE
++
++ TYPE :: ParentVector
++ INTEGER :: a
++ END TYPE ParentVector
++
++CONTAINS
++
++ SUBROUTINE vector_operation(pvec)
++ CLASS(ParentVector), INTENT(INOUT) :: pvec(:)
++ print *,pvec(1)%a
++ END SUBROUTINE
++
++END
++
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gfortran.dg/comma_IO_extension_1.f90 gcc-6-20160721/gcc/testsuite/gfortran.dg/comma_IO_extension_1.f90
+--- gcc-6.1.0/gcc/testsuite/gfortran.dg/comma_IO_extension_1.f90 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gfortran.dg/comma_IO_extension_1.f90 2016-06-12 14:04:08.000000000 +0000
+@@ -0,0 +1,8 @@
++! { dg-do compile }
++! PR 60751
++! Contributed by Walter Spector <w6ws@earthlink.net>
++program extracomma
++ implicit none
++
++ write (*,*), 1, 2, 3 ! { dg-warning "Legacy Extension: Comma before i/o item list" }
++end program
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gfortran.dg/comma_IO_extension_2.f90 gcc-6-20160721/gcc/testsuite/gfortran.dg/comma_IO_extension_2.f90
+--- gcc-6.1.0/gcc/testsuite/gfortran.dg/comma_IO_extension_2.f90 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gfortran.dg/comma_IO_extension_2.f90 2016-06-12 14:04:08.000000000 +0000
+@@ -0,0 +1,9 @@
++! { dg-do compile }
++! { dg-options "-std=legacy" }
++! PR 60751
++! Contributed by Walter Spector <w6ws@earthlink.net>
++program extracomma
++ implicit none
++
++ write (*,*), 1, 2, 3
++end program
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gfortran.dg/dec_structure_1.f90 gcc-6-20160721/gcc/testsuite/gfortran.dg/dec_structure_1.f90
+--- gcc-6.1.0/gcc/testsuite/gfortran.dg/dec_structure_1.f90 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gfortran.dg/dec_structure_1.f90 2016-05-14 19:52:46.000000000 +0000
+@@ -0,0 +1,56 @@
++! { dg-do run }
++! { dg-options "-fdec-structure" }
++!
++! Basic STRUCTURE test.
++!
++
++subroutine aborts (s)
++ character(*), intent(in) :: s
++ print *, s
++ call abort()
++end subroutine
++
++! Basic structure
++structure /s1/ ! type s1
++ integer i1
++ logical l1
++ real r1
++ character c1
++end structure ! end type s1
++
++record /s1/ r1 ! type (s1) r1
++record /s1/ r1_a(3) ! type (s1) r1_a(3)
++
++! Basic records
++r1.i1 = 13579 ! r1%i1 = ...
++r1.l1 = .true.
++r1.r1 = 13.579
++r1.c1 = 'F'
++r1_a(2) = r1
++r1_a(3).r1 = 135.79
++
++if (r1.i1 .ne. 13579) then
++ call aborts("r1.i1")
++endif
++
++if (r1.l1 .neqv. .true.) then
++ call aborts("r1.l1")
++endif
++
++if (r1.r1 .ne. 13.579) then
++ call aborts("r1.r1")
++endif
++
++if (r1.c1 .ne. 'F') then
++ call aborts("r1.c1")
++endif
++
++if (r1_a(2).i1 .ne. 13579) then
++ call aborts("r1_a(2).i1")
++endif
++
++if (r1_a(3).r1 .ne. 135.79) then
++ call aborts("r1_a(3).r1")
++endif
++
++end
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gfortran.dg/dec_structure_10.f90 gcc-6-20160721/gcc/testsuite/gfortran.dg/dec_structure_10.f90
+--- gcc-6.1.0/gcc/testsuite/gfortran.dg/dec_structure_10.f90 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gfortran.dg/dec_structure_10.f90 2016-05-14 19:52:46.000000000 +0000
+@@ -0,0 +1,119 @@
++! { dg-do run }
++! { dg-options "-fdec-structure" }
++!
++! Runtime tests for rules governing dot ('.') as a member accessor, including
++! voodoo with aliased user-defined vs. intrinsic operators and nested members.
++! See gcc/fortran/match.c (gfc_match_member_sep).
++!
++
++module dec_structure_10
++ ! Operator overload tests with .ne. and constant member
++ structure /s1/
++ integer i
++ integer ne
++ logical b
++ end structure
++
++ ! Operator overload tests with .eq., .test. and nested members
++ structure /s2/
++ record /s1/ eq
++ record /s1/ test
++ record /s1/ and
++ integer i
++ end structure
++
++ ! Deep nested access tests
++ structure /s3/
++ record /s2/ r2
++ end structure
++ structure /s4/
++ record /s3/ r3
++ end structure
++ structure /s5/
++ record /s4/ r4
++ end structure
++ structure /s6/
++ record /s5/ r5
++ end structure
++ structure /s7/
++ record /s6/ r6
++ end structure
++
++ ! Operator overloads to mess with nested member accesses
++ interface operator (.ne.)
++ module procedure ne_func
++ end interface operator (.ne.)
++ interface operator (.eq.)
++ module procedure eq_func
++ end interface operator (.eq.)
++ interface operator (.test.)
++ module procedure tstfunc
++ end interface operator (.test.)
++ contains
++ ! ne_func will be called on (x) .ne. (y)
++ function ne_func (r, i)
++ integer, intent(in) :: i
++ type(s1), intent(in) :: r
++ integer ne_func
++ ne_func = r%i + i
++ end function
++ ! eq_func will be called on (x) .eq. (y)
++ function eq_func (r, i)
++ integer, intent(in) :: i
++ type(s2), intent(in) :: r
++ integer eq_func
++ eq_func = r%eq%i + i
++ end function eq_func
++ ! tstfunc will be called on (x) .test. (y)
++ function tstfunc (r, i)
++ integer, intent(in) :: i
++ type(s2), intent(in) :: r
++ integer tstfunc
++ tstfunc = r%i + i
++ end function tstfunc
++end module
++
++use dec_structure_10
++
++record /s1/ r
++record /s2/ struct
++record /s7/ r7
++integer i, j
++logical l
++struct%eq%i = 5
++i = -5
++
++! Nested access: struct has a member and which has a member b
++l = struct .and. b ! struct%and%b
++l = struct .and. b .or. .false. ! (struct%and%b) .or. (.false.)
++
++! Intrinsic op: r has no member 'ne'
++j = r .ne. i ! <intrinsic> ne(r, i)
++j = (r) .ne. i ! <intrinsic> ne(r, i)
++
++! Intrinsic op; r has a member 'ne' but it is not a record
++j = r .ne. i ! <intrinsic> ne(r, i)
++j = (r) .ne. i ! <intrinsic> ne(r, i)
++
++! Nested access: struct has a member eq which has a member i
++j = struct .eq. i ! struct%eq%i
++if ( j .ne. struct%eq%i ) call abort()
++
++! User op: struct is compared to i with eq_func
++j = (struct) .eq. i ! eq_func(struct, i) -> struct%eq%i + i
++if ( j .ne. struct%eq%i + i ) call abort()
++
++! User op: struct has a member test which has a member i, but test is a uop
++j = struct .test. i ! tstfunc(struct, i) -> struct%i + i
++if ( j .ne. struct%i + i ) call abort()
++
++! User op: struct is compared to i with eq_func
++j = (struct) .test. i ! tstfunc(struct, i) -> struct%i + i
++if ( j .ne. struct%i + i ) call abort()
++
++! Deep nested access tests
++r7.r6.r5.r4.r3.r2.i = 1337
++j = r7.r6.r5.r4.r3.r2.i
++if ( j .ne. 1337 ) call abort()
++
++end
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gfortran.dg/dec_structure_11.f90 gcc-6-20160721/gcc/testsuite/gfortran.dg/dec_structure_11.f90
+--- gcc-6.1.0/gcc/testsuite/gfortran.dg/dec_structure_11.f90 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gfortran.dg/dec_structure_11.f90 2016-05-14 19:52:46.000000000 +0000
+@@ -0,0 +1,20 @@
++! { dg-do compile }
++! { dg-options "-fdec-structure" }
++!
++! Tests for what CAN'T be done with dot ('.') as a member accessor.
++!
++
++structure /s1/
++ integer eq
++end structure
++
++record /s1/ r
++integer i, j, k
++
++j = i.j ! { dg-error "nonderived-type variable" }
++j = r .eq. i ! { dg-error "Operands of comparison" }
++j = r.i ! { dg-error "is not a member of" }
++j = r. ! { dg-error "Expected structure component or operator name" }
++j = .i ! { dg-error "Invalid character in name" }
++
++end
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gfortran.dg/dec_structure_2.f90 gcc-6-20160721/gcc/testsuite/gfortran.dg/dec_structure_2.f90
+--- gcc-6.1.0/gcc/testsuite/gfortran.dg/dec_structure_2.f90 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gfortran.dg/dec_structure_2.f90 2016-05-14 19:52:46.000000000 +0000
+@@ -0,0 +1,41 @@
++! { dg-do run }
++! { dg-options "-fdec-structure" }
++!
++! Test STRUCTUREs containin other STRUCTUREs.
++!
++
++subroutine aborts (s)
++ character(*), intent(in) :: s
++ print *, s
++ call abort()
++end subroutine
++
++! Basic structure
++structure /s1/
++ integer i1
++ logical l1
++ real r1
++ character c1
++end structure
++
++structure /s2/
++ integer i
++ record /s1/ r1
++endstructure
++
++record /s1/ r1
++record /s2/ r2, r2_a(10)
++
++! Nested and array records
++r2.r1.r1 = 135.79
++r2_a(3).r1.i1 = -13579
++
++if (r2.r1.r1 .ne. 135.79) then
++ call aborts("r1.r1.r1")
++endif
++
++if (r2_a(3).r1.i1 .ne. -13579) then
++ call aborts("r2_a(3).r1.i1")
++endif
++
++end
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gfortran.dg/dec_structure_3.f90 gcc-6-20160721/gcc/testsuite/gfortran.dg/dec_structure_3.f90
+--- gcc-6.1.0/gcc/testsuite/gfortran.dg/dec_structure_3.f90 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gfortran.dg/dec_structure_3.f90 2016-05-14 19:52:46.000000000 +0000
+@@ -0,0 +1,52 @@
++! { dg-do run }
++! { dg-options "-fdec-structure" }
++!
++! Test nested STRUCTURE definitions.
++!
++
++subroutine aborts (s)
++ character(*), intent(in) :: s
++ print *, s
++ call abort()
++end subroutine
++
++structure /s3/
++ real p
++ structure /s4/ recrd, recrd_a(3)
++ integer i, j
++ end structure
++ real q
++end structure
++
++record /s3/ r3
++record /s4/ r4
++
++r3.p = 1.3579
++r4.i = 0
++r4.j = 1
++r3.recrd = r4
++r3.recrd_a(1) = r3.recrd
++r3.recrd_a(2).i = 1
++r3.recrd_a(2).j = 0
++
++if (r3.p .ne. 1.3579) then
++ call aborts("r3.p")
++endif
++
++if (r4.i .ne. 0) then
++ call aborts("r4.i")
++endif
++
++if (r4.j .ne. 1) then
++ call aborts("r4.j")
++endif
++
++if (r3.recrd.i .ne. 0 .or. r3.recrd.j .ne. 1) then
++ call aborts("r3.recrd")
++endif
++
++if (r3.recrd_a(2).i .ne. 1 .or. r3.recrd_a(2).j .ne. 0) then
++ call aborts("r3.recrd_a(2)")
++endif
++
++end
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gfortran.dg/dec_structure_4.f90 gcc-6-20160721/gcc/testsuite/gfortran.dg/dec_structure_4.f90
+--- gcc-6.1.0/gcc/testsuite/gfortran.dg/dec_structure_4.f90 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gfortran.dg/dec_structure_4.f90 2016-05-14 19:52:46.000000000 +0000
+@@ -0,0 +1,43 @@
++! { dg-do run }
++! { dg-options "-fdec-structure" }
++!
++! Test anonymous STRUCTURE definitions.
++!
++
++subroutine aborts (s)
++ character(*), intent(in) :: s
++ print *, s
++ call abort()
++end subroutine
++
++structure /s5/
++ structure recrd, recrd_a(3)
++ real x, y
++ end structure
++end structure
++
++record /s5/ r5
++
++r5.recrd.x = 1.3
++r5.recrd.y = 5.7
++r5.recrd_a(1) = r5.recrd
++r5.recrd_a(2).x = 5.7
++r5.recrd_a(2).y = 1.3
++
++if (r5.recrd.x .ne. 1.3) then
++ call aborts("r5.recrd.x")
++endif
++
++if (r5.recrd.y .ne. 5.7) then
++ call aborts("r5.recrd.y")
++endif
++
++if (r5.recrd_a(1).x .ne. 1.3 .or. r5.recrd_a(1).y .ne. 5.7) then
++ call aborts("r5.recrd_a(1)")
++endif
++
++if (r5.recrd_a(2).x .ne. 5.7 .or. r5.recrd_a(2).y .ne. 1.3) then
++ call aborts("r5.recrd_a(2)")
++endif
++
++end
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gfortran.dg/dec_structure_5.f90 gcc-6-20160721/gcc/testsuite/gfortran.dg/dec_structure_5.f90
+--- gcc-6.1.0/gcc/testsuite/gfortran.dg/dec_structure_5.f90 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gfortran.dg/dec_structure_5.f90 2016-05-14 19:52:46.000000000 +0000
+@@ -0,0 +1,49 @@
++! { dg-do run }
++! { dg-options "-fdec-structure" }
++!
++! Test STRUCTUREs which share names with variables.
++!
++
++subroutine aborts (s)
++ character(*), intent(in) :: s
++ print *, s
++ call abort()
++end subroutine
++
++! Special regression where shared names within a module caused an ICE
++! from gfc_get_module_backend_decl
++module dec_structure_5m
++ structure /s6/
++ integer i
++ end structure
++
++ record /s6/ s6
++end module
++
++program dec_structure_5
++ use dec_structure_5m
++
++ structure /s7/
++ real r
++ end structure
++
++ record /s7/ s7(3)
++
++ s6.i = 0
++ s7(1).r = 1.0
++ s7(2).r = 2.0
++ s7(3).r = 3.0
++
++ if (s6.i .ne. 0) then
++ call aborts("s6.i")
++ endif
++
++ if (s7(1).r .ne. 1.0) then
++ call aborts("s7(1).r")
++ endif
++
++ if (s7(2).r .ne. 2.0) then
++ call aborts("s7(2).r")
++ endif
++
++end
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gfortran.dg/dec_structure_6.f90 gcc-6-20160721/gcc/testsuite/gfortran.dg/dec_structure_6.f90
+--- gcc-6.1.0/gcc/testsuite/gfortran.dg/dec_structure_6.f90 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gfortran.dg/dec_structure_6.f90 2016-05-14 19:52:46.000000000 +0000
+@@ -0,0 +1,46 @@
++! { dg-do run }
++! { dg-options "-fdec-structure" }
++!
++! Test old-style CLIST initializers in STRUCTURE.
++!
++
++subroutine aborts (s)
++ character(*), intent(in) :: s
++ print *, s
++ call abort()
++end subroutine
++
++integer, parameter :: as = 3
++structure /s8/
++ character*20 c /"HELLO"/ ! ok
++ integer*2 j /300_4/ ! ok, converted
++ integer k /65536_8/ ! ok, implicit
++ integer*4 l /200000/ ! ok, types match
++ integer m(5) /5,4,3,2,1/! ok
++ integer n(5) /1,3*2,1/ ! ok, with repeat spec (/1,2,2,2,1/)
++ integer o(as) /as*9/ ! ok, parameter array spec
++ integer p(2,2) /1,2,3,4/! ok
++ real q(3) /1_2,3.5,2.4E-12_8/ ! ok, with some implicit conversions
++ integer :: canary = z'3D3D3D3D'
++end structure
++
++record /s8/ r8
++
++! Old-style (clist) initializers in structures
++if ( r8.c /= "HELLO" ) call aborts ("r8.c")
++if ( r8.j /= 300 ) call aborts ("r8.j")
++if ( r8.k /= 65536 ) call aborts ("r8.k")
++if ( r8.l /= 200000 ) call aborts ("r8.l")
++if ( r8.m(1) /= 5 .or. r8.m(2) /= 4 .or. r8.m(3) /= 3 &
++ .or. r8.m(4) /= 2 .or. r8.m(5) /= 1) &
++ call aborts ("r8.m")
++if ( r8.n(1) /= 1 .or. r8.n(2) /= 2 .or. r8.n(3) /= 2 .or. r8.n(4) /= 2 &
++ .or. r8.n(5) /= 1) &
++ call aborts ("r8.n")
++if ( r8.o(1) /= 9 .or. r8.o(2) /= 9 .or. r8.o(3) /= 9 ) call aborts ("r8.o")
++if ( r8.p(1,1) /= 1 .or. r8.p(2,1) /= 2 .or. r8.p(1,2) /= 3 &
++ .or. r8.p(2,2) /= 4) &
++ call aborts ("r8.p")
++if ( r8.canary /= z'3D3D3D3D' ) call aborts ("r8.canary")
++
++end
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gfortran.dg/dec_structure_7.f90 gcc-6-20160721/gcc/testsuite/gfortran.dg/dec_structure_7.f90
+--- gcc-6.1.0/gcc/testsuite/gfortran.dg/dec_structure_7.f90 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gfortran.dg/dec_structure_7.f90 2016-05-14 19:52:46.000000000 +0000
+@@ -0,0 +1,75 @@
++! { dg-do run }
++! { dg-options "-fdec-structure" }
++!
++! Test passing STRUCTUREs through functions and subroutines.
++!
++
++subroutine aborts (s)
++ character(*), intent(in) :: s
++ print *, s
++ call abort()
++end subroutine
++
++module dec_structure_7m
++ structure /s1/
++ integer i1
++ logical l1
++ real r1
++ character c1
++ end structure
++
++ structure /s2/
++ integer i
++ record /s1/ r1
++ endstructure
++
++contains
++ ! Pass structure through subroutine
++ subroutine sub (rec1, i)
++ implicit none
++ integer, intent(in) :: i
++ record /s1/ rec1
++ rec1.i1 = i
++ end subroutine
++
++ ! Pass structure through function
++ function func (rec2, r)
++ implicit none
++ real, intent(in) :: r
++ record /s2/ rec2
++ real func
++ rec2.r1.r1 = r
++ func = rec2.r1.r1
++ return
++ end function
++end module
++
++program dec_structure_7
++ use dec_structure_7m
++
++ implicit none
++ record /s1/ r1
++ record /s2/ r2
++ real junk
++
++ ! Passing through functions and subroutines
++ r1.i1 = 0
++ call sub (r1, 10)
++
++ r2.r1.r1 = 0.0
++ junk = func (r2, -20.14)
++
++ if (r1.i1 .ne. 10) then
++ call aborts("sub(r1, 10)")
++ endif
++
++ if (r2.r1.r1 .ne. -20.14) then
++ call aborts("func(r2, -20.14)")
++ endif
++
++ if (junk .ne. -20.14) then
++ print *, junk
++ call aborts("junk = func()")
++ endif
++
++end program
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gfortran.dg/dec_structure_8.f90 gcc-6-20160721/gcc/testsuite/gfortran.dg/dec_structure_8.f90
+--- gcc-6.1.0/gcc/testsuite/gfortran.dg/dec_structure_8.f90 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gfortran.dg/dec_structure_8.f90 2016-05-14 19:52:46.000000000 +0000
+@@ -0,0 +1,60 @@
++! { dg-do compile }
++! { dg-options "-fdec-structure -fmax-errors=0" }
++!
++! Comprehensive compile tests for what structures CAN'T do.
++!
++
++! Old-style (clist) initialization
++integer,parameter :: as = 3
++structure /t1/
++ integer*1 a /300_2/ ! { dg-error "Arithmetic overflow" }
++ integer b // ! { dg-error "Empty old style initializer list" }
++ integer c /2*3/ ! { dg-error "Repeat spec invalid in scalar" }
++ integer d /1,2,3/ ! { dg-error "End of scalar initializer expected" }
++ integer e /"HI"/ ! { dg-error "Can't convert" }
++ integer f(as) /4*9/ ! { dg-error "Too many elements" }
++ integer g(3) /1,3/ ! { dg-error "Not enough elements" }
++ integer h(3) /1,3,5,7/ ! { dg-error "Too many elements" }
++ integer i(3) /2*1/ ! { dg-error "Not enough elements" }
++ integer j(3) /10*1/ ! { dg-error "Too many elements" }
++ integer k(3) /2.5*3/ ! { dg-error "Repeat spec must be an integer" }
++ integer l(2) /2*/ ! { dg-error "Expected data constant" }
++ integer m(1) / ! { dg-error "Syntax error in old style" }
++ integer n(2) /1 ! { dg-error "Syntax error in old style" }
++ integer o(2) /1, ! { dg-error "Syntax error in old style" }
++ integer p(1) /x/ ! { dg-error "must be a PARAMETER" }
++end structure
++
++structure ! { dg-error "Structure name expected" }
++structure / ! { dg-error "Structure name expected" }
++structure // ! { dg-error "Structure name expected" }
++structure /.or./ ! { dg-error "Structure name expected" }
++structure /integer/ ! { dg-error "Structure name.*cannot be the same" }
++structure /foo/ bar ! { dg-error "Junk after" }
++structure /t1/ ! { dg-error "Type definition.*T1" }
++
++record ! { dg-error "Structure name expected" }
++record bar ! { dg-error "Structure name expected" }
++record / bar ! { dg-error "Structure name expected" }
++record // bar ! { dg-error "Structure name expected" }
++record foo/ bar ! { dg-error "Structure name expected" }
++record /foo bar ! { dg-error "Structure name expected" }
++record /foo/ bar ! { dg-error "used before it is defined" }
++record /t1/ ! { dg-error "Invalid character in name" }
++
++structure /t2/
++ ENTRY here ! { dg-error "ENTRY statement.*cannot appear" }
++ integer a
++ integer a ! { dg-error "Component.*already declared" }
++ structure $z ! { dg-error "Invalid character in name" }
++ structure // ! { dg-error "Invalid character in name" }
++ structure // x ! { dg-error "Invalid character in name" }
++ structure /t3/ ! { dg-error "Invalid character in name" }
++ structure /t3/ x,$y ! { dg-error "Invalid character in name" }
++ structure /t4/ y
++ integer i, j, k
++ end structure
++ structure /t4/ z ! { dg-error "Type definition.*T4" }
++end structure
++
++end
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gfortran.dg/dec_structure_9.f90 gcc-6-20160721/gcc/testsuite/gfortran.dg/dec_structure_9.f90
+--- gcc-6.1.0/gcc/testsuite/gfortran.dg/dec_structure_9.f90 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gfortran.dg/dec_structure_9.f90 2016-05-14 19:52:46.000000000 +0000
+@@ -0,0 +1,42 @@
++! { dg-do compile }
++! { dg-options "-fdec-structure" }
++!
++! Basic compile tests for what CAN be done with dot ('.') as a member accessor.
++!
++
++logical :: l, l2 = .true., l3 = .false., and
++integer i
++character(5) s
++real r
++
++structure /s1/
++ integer i
++ character(5) s
++ real r
++end structure
++
++record /s1/ r1
++
++! Basic
++l = l .and. l2 .or. l3
++l = and .and. and .and. and
++l = l2 .eqv. l3
++l = (l2) .eqv. l3
++
++! Integers
++l = .not. (i .eq. 0)
++l = .not. (0 .eq. i)
++l = .not. (r1.i .eq. 0)
++l = .not. (0 .eq. r1.i)
++! Characters
++l = .not. (s .eq. "hello")
++l = .not. ("hello" .eq. s)
++l = .not. (r1.s .eq. "hello")
++l = .not. ("hello" .eq. r1.s)
++! Reals
++l = .not. (r .eq. 3.14)
++l = .not. (3.14 .eq. r)
++l = .not. (r1.r .eq. 3.14)
++l = .not. (3.14 .eq. r1.r)
++
++end
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gfortran.dg/dec_union_1.f90 gcc-6-20160721/gcc/testsuite/gfortran.dg/dec_union_1.f90
+--- gcc-6.1.0/gcc/testsuite/gfortran.dg/dec_union_1.f90 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gfortran.dg/dec_union_1.f90 2016-05-14 19:52:46.000000000 +0000
+@@ -0,0 +1,66 @@
++! { dg-do run }
++! { dg-options "-fdec-structure" }
++!
++! Test whether union backend declarations are corrently _not_ copied when they
++! are not in fact equal. The structure defined in sub() is seen later, but
++! where siz has a different value.
++!
++
++subroutine aborts (s)
++ character(*), intent(in) :: s
++ print *, s
++ call abort()
++end subroutine
++
++subroutine sub ()
++ integer, parameter :: siz = 1024
++ structure /s6/
++ union ! U0
++ map ! M0
++ integer ibuf(siz)
++ end map
++ map ! M1
++ character(8) cbuf(siz)
++ end map
++ map ! M2
++ real rbuf(siz)
++ end map
++ end union
++ end structure
++ record /s6/ r6
++ r6.ibuf(1) = z'badbeef'
++ r6.ibuf(2) = z'badbeef'
++end subroutine
++
++! Repeat definition from subroutine sub with different size parameter.
++! If the structure definition is copied here the stack may get messed up.
++integer, parameter :: siz = 65536
++structure /s6/
++ union ! U12
++ map
++ integer ibuf(siz)
++ end map
++ map
++ character(8) cbuf(siz)
++ end map
++ map
++ real rbuf(siz)
++ end map
++ end union
++end structure
++
++record /s6/ r6
++integer :: r6_canary = 0
++
++! Copied type declaration - this should not cause problems
++i = 1
++do while (i < siz)
++ r6.ibuf(i) = z'badbeef'
++ i = i + 1
++end do
++
++if ( r6_canary .ne. 0 ) then
++ call aborts ('copied decls: overflow')
++endif
++
++end
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gfortran.dg/dec_union_2.f90 gcc-6-20160721/gcc/testsuite/gfortran.dg/dec_union_2.f90
+--- gcc-6.1.0/gcc/testsuite/gfortran.dg/dec_union_2.f90 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gfortran.dg/dec_union_2.f90 2016-05-14 19:52:46.000000000 +0000
+@@ -0,0 +1,60 @@
++! { dg-do run }
++! { dg-options "-fdec-structure" }
++!
++! Test basic UNION implementation.
++!
++
++subroutine aborts (s)
++ character(*), intent(in) :: s
++ print *, s
++ call abort()
++end subroutine
++
++! Empty union
++structure /s0/
++ union ! U0
++ map ! M0
++ end map
++ map ! M1
++ end map
++ end union
++end structure
++
++! Basic unions
++structure /s1/
++ union ! U1
++ map ! M2
++ integer(4) a
++ end map
++ map ! M3
++ real(4) b
++ end map
++ end union
++end structure
++structure /s2/
++ union ! U2
++ map ! M4
++ integer(2) w1, w2
++ end map
++ map ! M5
++ integer(4) long
++ end map
++ end union
++end structure
++
++record /s1/ r1
++record /s2/ r2
++
++! Basic unions
++r1.a = 0
++r1.b = 1.33e7
++if ( r1.a .eq. 0 ) call aborts ("basic union 1")
++
++! Endian-agnostic runtime check
++r2.long = z'12345678'
++if (.not. ( (r2.w1 .eq. z'1234' .and. r2.w2 .eq. z'5678') &
++ .or. (r2.w1 .eq. z'5678' .and. r2.w2 .eq. z'1234')) ) then
++ call aborts ("basic union 2")
++endif
++
++end
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gfortran.dg/dec_union_3.f90 gcc-6-20160721/gcc/testsuite/gfortran.dg/dec_union_3.f90
+--- gcc-6.1.0/gcc/testsuite/gfortran.dg/dec_union_3.f90 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gfortran.dg/dec_union_3.f90 2016-05-14 19:52:46.000000000 +0000
+@@ -0,0 +1,35 @@
++! { dg-do run }
++! { dg-options "-fdec-structure" }
++!
++! Test UNIONs with initializations.
++!
++
++subroutine aborts (s)
++ character(*), intent(in) :: s
++ print *, s
++ call abort()
++end subroutine
++
++! Initialization expressions
++structure /s3/
++ integer(4) :: i = 8
++ union ! U7
++ map
++ integer(4) :: x = 1600
++ integer(4) :: y = 1800
++ end map
++ map
++ integer(2) a, b, c
++ end map
++ end union
++end structure
++
++record /s3/ r3
++
++! Initialized unions
++if ( r3.x .ne. 1600 .or. r3.y .ne. 1800) then
++ r3.x = r3.y ! If r3 isn't used the initializations are optimized out
++ call aborts ("union initialization")
++endif
++
++end
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gfortran.dg/dec_union_4.f90 gcc-6-20160721/gcc/testsuite/gfortran.dg/dec_union_4.f90
+--- gcc-6.1.0/gcc/testsuite/gfortran.dg/dec_union_4.f90 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gfortran.dg/dec_union_4.f90 2016-05-14 19:52:46.000000000 +0000
+@@ -0,0 +1,63 @@
++! { dg-do run }
++! { dg-options "-fdec-structure" }
++!
++! Test nested UNIONs.
++!
++
++subroutine aborts (s)
++ character(*), intent(in) :: s
++ print *, s
++ call abort()
++end subroutine
++
++! Nested unions
++structure /s4/
++ union ! U0 ! rax
++ map
++ character(16) rx
++ end map
++ map
++ character(8) rh ! rah
++ union ! U1
++ map
++ character(8) rl ! ral
++ end map
++ map
++ character(8) ex ! eax
++ end map
++ map
++ character(4) eh ! eah
++ union ! U2
++ map
++ character(4) el ! eal
++ end map
++ map
++ character(4) x ! ax
++ end map
++ map
++ character(2) h ! ah
++ character(2) l ! al
++ end map
++ end union
++ end map
++ end union
++ end map
++ end union
++end structure
++record /s4/ r4
++
++
++! Nested unions
++r4.rx = 'AAAAAAAA.BBB.C.D'
++
++if ( r4.rx .ne. 'AAAAAAAA.BBB.C.D' ) call aborts ("rax")
++if ( r4.rh .ne. 'AAAAAAAA' ) call aborts ("rah")
++if ( r4.rl .ne. '.BBB.C.D' ) call aborts ("ral")
++if ( r4.ex .ne. '.BBB.C.D' ) call aborts ("eax")
++if ( r4.eh .ne. '.BBB' ) call aborts ("eah")
++if ( r4.el .ne. '.C.D' ) call aborts ("eal")
++if ( r4.x .ne. '.C.D' ) call aborts ("ax")
++if ( r4.h .ne. '.C' ) call aborts ("ah")
++if ( r4.l .ne. '.D' ) call aborts ("al")
++
++end
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gfortran.dg/dec_union_5.f90 gcc-6-20160721/gcc/testsuite/gfortran.dg/dec_union_5.f90
+--- gcc-6.1.0/gcc/testsuite/gfortran.dg/dec_union_5.f90 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gfortran.dg/dec_union_5.f90 2016-05-14 19:52:46.000000000 +0000
+@@ -0,0 +1,41 @@
++! { dg-do run }
++! { dg-options "-fdec-structure" }
++!
++! Test UNIONs with array components.
++!
++
++subroutine aborts (s)
++ character(*), intent(in) :: s
++ print *, s
++ call abort()
++end subroutine
++
++! Unions with arrays
++structure /s5/
++ union
++ map
++ character :: s(5)
++ end map
++ map
++ integer(1) :: a(5)
++ end map
++ end union
++end structure
++
++record /s5/ r5
++
++! Unions with arrays
++r5.a(1) = z'41'
++r5.a(2) = z'42'
++r5.a(3) = z'43'
++r5.a(4) = z'44'
++r5.a(5) = z'45'
++if ( r5.s(1) .ne. 'A' &
++ .or. r5.s(2) .ne. 'B' &
++ .or. r5.s(3) .ne. 'C' &
++ .or. r5.s(4) .ne. 'D' &
++ .or. r5.s(5) .ne. 'E') then
++ call aborts ("arrays")
++endif
++
++end
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gfortran.dg/dec_union_6.f90 gcc-6-20160721/gcc/testsuite/gfortran.dg/dec_union_6.f90
+--- gcc-6.1.0/gcc/testsuite/gfortran.dg/dec_union_6.f90 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gfortran.dg/dec_union_6.f90 2016-05-14 19:52:46.000000000 +0000
+@@ -0,0 +1,59 @@
++! { dg-do run }
++! { dg-options "-fdec-structure" }
++!
++! sub0 and sub1 test a regression where calling gfc_use_derived from
++! gfc_find_component on the structure type symbol being parsed caused the
++! symbol to be freed and swapped for the previously seen type symbol, leaving
++! dangling pointers and causing all sorts of mayhem.
++!
++
++subroutine sub0 (u)
++ structure /s/
++ union ! U0
++ map ! M0
++ integer i
++ end map
++ end union
++ end structure
++ record /s/ u
++ u.i = 0
++end subroutine sub0
++
++subroutine sub1 ()
++ structure /s/
++ union ! U1
++ map ! M1
++ integer i
++ end map
++ end union
++ end structure
++ record /s/ u
++ interface ! matches the declaration of sub0 above
++ subroutine sub0 (u)
++ structure /s/
++ union ! U2
++ map ! M2
++ integer i ! gfc_find_component should not call gfc_use_derived
++ end map ! here, otherwise this structure's type symbol is freed
++ end union ! out from under it
++ end structure
++ record /s/ u
++ end subroutine sub0
++ end interface
++ call sub0(u)
++end subroutine
++
++! If sub0 and sub1 aren't used they may be omitted
++structure /s/
++ union ! U1
++ map ! M3
++ integer i
++ end map
++ end union
++end structure
++record /s/ u
++
++call sub0(u)
++call sub1()
++
++end
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gfortran.dg/dec_union_7.f90 gcc-6-20160721/gcc/testsuite/gfortran.dg/dec_union_7.f90
+--- gcc-6.1.0/gcc/testsuite/gfortran.dg/dec_union_7.f90 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gfortran.dg/dec_union_7.f90 2016-05-14 19:52:46.000000000 +0000
+@@ -0,0 +1,38 @@
++! { dg-do compile }
++! { dg-options "-fdec-structure" }
++!
++! Comprehensive compile tests for what unions CAN'T do.
++!
++
++! Syntax errors
++structure /s0/
++ union a b c ! { dg-error "Junk after UNION" }
++ union
++ map a b c ! { dg-error "Junk after MAP" }
++ integer x ! { dg-error "Unexpected" }
++ structure /s2/ ! { dg-error "Unexpected" }
++ map
++ map ! { dg-error "Unexpected" }
++ end map
++ end union
++end structure
++
++! Initialization expressions
++structure /s1/
++ union
++ map
++ integer(4) :: x = 1600 ! { dg-error "Conflicting initializers" }
++ integer(4) :: y = 1800
++ end map
++ map
++ integer(2) a, b, c, d
++ integer :: e = 0 ! { dg-error "Conflicting initializers" }
++ end map
++ map
++ real :: p = 1.3, q = 3.7 ! { dg-error "Conflicting initializers" }
++ end map
++ end union
++end structure
++record /s1/ r1
++
++end
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gfortran.dg/deferred_character_17.f90 gcc-6-20160721/gcc/testsuite/gfortran.dg/deferred_character_17.f90
+--- gcc-6.1.0/gcc/testsuite/gfortran.dg/deferred_character_17.f90 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gfortran.dg/deferred_character_17.f90 2016-07-13 16:09:57.000000000 +0000
+@@ -0,0 +1,13 @@
++!{ dg-do run }
++
++! Check fix for PR fortran/71623
++
++program allocatemvce
++ implicit none
++ character(len=:), allocatable :: string
++ integer, dimension(4), target :: array = [1,2,3,4]
++ integer, dimension(:), pointer :: array_ptr
++ array_ptr => array
++ ! The allocate used to segfault
++ allocate(character(len=size(array_ptr))::string)
++end program allocatemvce
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gfortran.dg/dependency_46.f90 gcc-6-20160721/gcc/testsuite/gfortran.dg/dependency_46.f90
+--- gcc-6.1.0/gcc/testsuite/gfortran.dg/dependency_46.f90 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gfortran.dg/dependency_46.f90 2016-07-10 21:26:28.000000000 +0000
+@@ -0,0 +1,11 @@
++! { dg-do compile }
++! PR 71783 - this used to ICE due to a missing charlen for the temporary.
++! Test case by Toon Moene.
++
++SUBROUTINE prtdata(ilen)
++ INTEGER :: ilen
++ character(len=ilen), allocatable :: cline(:)
++ allocate(cline(2))
++ cline(1) = 'a'
++ cline(2) = cline(1)
++END SUBROUTINE prtdata
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gfortran.dg/goacc/asyncwait-2.f95 gcc-6-20160721/gcc/testsuite/gfortran.dg/goacc/asyncwait-2.f95
+--- gcc-6.1.0/gcc/testsuite/gfortran.dg/goacc/asyncwait-2.f95 2015-01-15 20:11:12.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gfortran.dg/goacc/asyncwait-2.f95 2016-06-29 16:08:13.000000000 +0000
+@@ -83,6 +83,18 @@
+ end do
+ !$acc end parallel ! { dg-error "Unexpected \\\!\\\$ACC END PARALLEL" }
+
++ !$acc parallel copyin (a(1:N)) copy (b(1:N)) waitasync ! { dg-error "Unclassifiable OpenACC directive" }
++ do i = 1, N
++ b(i) = a(i)
++ end do
++ !$acc end parallel ! { dg-error "Unexpected \\\!\\\$ACC END PARALLEL" }
++
++ !$acc parallel copyin (a(1:N)) copy (b(1:N)) asyncwait ! { dg-error "Unclassifiable OpenACC directive" }
++ do i = 1, N
++ b(i) = a(i)
++ end do
++ !$acc end parallel ! { dg-error "Unexpected \\\!\\\$ACC END PARALLEL" }
++
+ !$acc parallel copyin (a(1:N)) copy (b(1:N)) wait
+ do i = 1, N
+ b(i) = a(i)
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gfortran.dg/goacc/asyncwait-3.f95 gcc-6-20160721/gcc/testsuite/gfortran.dg/goacc/asyncwait-3.f95
+--- gcc-6.1.0/gcc/testsuite/gfortran.dg/goacc/asyncwait-3.f95 2015-01-15 20:11:12.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gfortran.dg/goacc/asyncwait-3.f95 2016-06-29 16:08:13.000000000 +0000
+@@ -11,17 +11,17 @@
+ a(:) = 3.0
+ b(:) = 0.0
+
+- !$acc wait (1 2) ! { dg-error "Unexpected junk in \\\!\\\$ACC WAIT at" }
++ !$acc wait (1 2) ! { dg-error "Syntax error in OpenACC expression list at" }
+
+- !$acc wait (1,) ! { dg-error "Unexpected junk in \\\!\\\$ACC WAIT at" }
++ !$acc wait (1,) ! { dg-error "Syntax error in OpenACC expression list at" }
+
+- !$acc wait (,1) ! { dg-error "Unexpected junk in \\\!\\\$ACC WAIT at" }
++ !$acc wait (,1) ! { dg-error "Syntax error in OpenACC expression list at" }
+
+- !$acc wait (1, 2, ) ! { dg-error "Unexpected junk in \\\!\\\$ACC WAIT at" }
++ !$acc wait (1, 2, ) ! { dg-error "Syntax error in OpenACC expression list at" }
+
+- !$acc wait (1, 2, ,) ! { dg-error "Unexpected junk in \\\!\\\$ACC WAIT at" }
++ !$acc wait (1, 2, ,) ! { dg-error "Syntax error in OpenACC expression list at" }
+
+- !$acc wait (1 ! { dg-error "Unexpected junk in \\\!\\\$ACC WAIT at" }
++ !$acc wait (1 ! { dg-error "Syntax error in OpenACC expression list at" }
+
+ !$acc wait (1, *) ! { dg-error "Invalid argument to \\\$\\\!ACC WAIT" }
+
+@@ -33,9 +33,9 @@
+
+ !$acc wait (1.0) ! { dg-error "WAIT clause at \\\(1\\\) requires a scalar INTEGER expression" }
+
+- !$acc wait 1 ! { dg-error "Unexpected junk in \\\!\\\$ACC WAIT at" }
++ !$acc wait 1 ! { dg-error "Unclassifiable OpenACC directive" }
+
+- !$acc wait N ! { dg-error "Unexpected junk in \\\!\\\$ACC WAIT at" }
++ !$acc wait N ! { dg-error "Unclassifiable OpenACC directive" }
+
+ !$acc wait (1)
+ end program asyncwait
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gfortran.dg/goacc/asyncwait-4.f95 gcc-6-20160721/gcc/testsuite/gfortran.dg/goacc/asyncwait-4.f95
+--- gcc-6.1.0/gcc/testsuite/gfortran.dg/goacc/asyncwait-4.f95 2015-01-15 20:11:12.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gfortran.dg/goacc/asyncwait-4.f95 2016-06-29 16:08:13.000000000 +0000
+@@ -11,21 +11,21 @@
+ a(:) = 3.0
+ b(:) = 0.0
+
+- !$acc wait async (1 2) ! { dg-error "Unexpected junk in \\\!\\\$ACC WAIT at" }
++ !$acc wait async (1 2) ! { dg-error "Unclassifiable OpenACC directive" }
+
+- !$acc wait async (1,) ! { dg-error "Unexpected junk in \\\!\\\$ACC WAIT at" }
++ !$acc wait async (1,) ! { dg-error "Unclassifiable OpenACC directive" }
+
+- !$acc wait async (,1) ! { dg-error "Unexpected junk in \\\!\\\$ACC WAIT at" }
++ !$acc wait async (,1) ! { dg-error "Invalid character in name" }
+
+- !$acc wait async (1, 2, ) ! { dg-error "Unexpected junk in \\\!\\\$ACC WAIT at" }
++ !$acc wait async (1, 2, ) ! { dg-error "Unclassifiable OpenACC directive" }
+
+- !$acc wait async (1, 2, ,) ! { dg-error "Unexpected junk in \\\!\\\$ACC WAIT at" }
++ !$acc wait async (1, 2, ,) ! { dg-error "Unclassifiable OpenACC directive" }
+
+- !$acc wait async (1 ! { dg-error "Unexpected junk in \\\!\\\$ACC WAIT at" }
++ !$acc wait async (1 ! { dg-error "Unclassifiable OpenACC directive" }
+
+- !$acc wait async (1, *) ! { dg-error "Unexpected junk in \\\!\\\$ACC WAIT at" }
++ !$acc wait async (1, *) ! { dg-error "Unclassifiable OpenACC directive" }
+
+- !$acc wait async (1, a) ! { dg-error "Unexpected junk in \\\!\\\$ACC WAIT at" }
++ !$acc wait async (1, a) ! { dg-error "Unclassifiable OpenACC directive" }
+
+ !$acc wait async (a) ! { dg-error "ASYNC clause at \\\(1\\\) requires a scalar INTEGER expression" }
+
+@@ -33,5 +33,9 @@
+
+ !$acc wait async (1.0) ! { dg-error "ASYNC clause at \\\(1\\\) requires a scalar INTEGER expression" }
+
+- !$acc wait async 1 ! { dg-error "Unexpected junk in \\\!\\\$ACC WAIT at" }
++ !$acc wait async 1 ! { dg-error "Unclassifiable OpenACC directive" }
++
++ !$acc waitasync ! { dg-error "Unclassifiable OpenACC directive" }
++
++ !$acc wait,async ! { dg-error "Unclassifiable OpenACC directive" }
+ end program asyncwait
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gfortran.dg/goacc/cache-1.f95 gcc-6-20160721/gcc/testsuite/gfortran.dg/goacc/cache-1.f95
+--- gcc-6.1.0/gcc/testsuite/gfortran.dg/goacc/cache-1.f95 2015-10-27 16:54:52.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gfortran.dg/goacc/cache-1.f95 2016-06-10 09:46:04.000000000 +0000
+@@ -1,4 +1,6 @@
+-! { dg-do compile }
++! OpenACC cache directive: valid usage.
++! For execution testing, this file is "#include"d from
++! libgomp/testsuite/libgomp.oacc-fortran/cache-1.f95.
+ ! { dg-additional-options "-std=f2008" }
+
+ program test
+@@ -6,11 +8,8 @@
+ integer :: i, d(10), e(5,13)
+
+ do concurrent (i=1:5)
+- !$acc cache (d)
+ !$acc cache (d(1:3))
+ !$acc cache (d(i:i+2))
+-
+- !$acc cache (e)
+ !$acc cache (e(1:3,2:4))
+ !$acc cache (e(i:i+2,i+1:i+3))
+ enddo
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gfortran.dg/goacc/cache-2.f95 gcc-6-20160721/gcc/testsuite/gfortran.dg/goacc/cache-2.f95
+--- gcc-6.1.0/gcc/testsuite/gfortran.dg/goacc/cache-2.f95 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gfortran.dg/goacc/cache-2.f95 2016-06-10 09:46:04.000000000 +0000
+@@ -0,0 +1,12 @@
++! OpenACC cache directive: invalid usage.
++! { dg-additional-options "-std=f2008" }
++
++program test
++ implicit none
++ integer :: i, d(10), e(5,13)
++
++ do concurrent (i=1:5)
++ !$acc cache (d) ! { dg-error "" "TODO" { xfail *-*-* } }
++ !$acc cache (e) ! { dg-error "" "TODO" { xfail *-*-* } }
++ enddo
++end
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gfortran.dg/goacc/coarray.f95 gcc-6-20160721/gcc/testsuite/gfortran.dg/goacc/coarray.f95
+--- gcc-6.1.0/gcc/testsuite/gfortran.dg/goacc/coarray.f95 2015-12-02 19:59:27.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gfortran.dg/goacc/coarray.f95 2016-06-10 09:46:04.000000000 +0000
+@@ -24,7 +24,7 @@
+ !$acc end parallel loop
+ !$acc parallel loop
+ do i = 1,5
+- !$acc cache (a)
++ !$acc cache (a) ! { dg-error "" "TODO" { xfail *-*-* } }
+ enddo
+ !$acc end parallel loop
+ !$acc update device (a)
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gfortran.dg/goacc/combined-directives.f90 gcc-6-20160721/gcc/testsuite/gfortran.dg/goacc/combined-directives.f90
+--- gcc-6.1.0/gcc/testsuite/gfortran.dg/goacc/combined-directives.f90 2016-03-30 15:08:47.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gfortran.dg/goacc/combined-directives.f90 2016-06-10 09:46:18.000000000 +0000
+@@ -143,7 +143,8 @@
+ ! { dg-final { scan-tree-dump-times "acc loop private.i. private.j. vector" 2 "gimple" } }
+ ! { dg-final { scan-tree-dump-times "acc loop private.i. private.j. seq" 2 "gimple" } }
+ ! { dg-final { scan-tree-dump-times "acc loop private.i. private.j. auto" 2 "gimple" } }
+-! { dg-final { scan-tree-dump-times "acc loop private.i. private.j. tile.2, 3" 2 "gimple" } }
++! XFAILed: OpenACC tile clauses are discarded during gimplification.
++! { dg-final { scan-tree-dump-times "acc loop private.i. private.j. tile.2, 3" 2 "gimple" { xfail *-*-* } } }
+ ! { dg-final { scan-tree-dump-times "acc loop private.i. independent" 2 "gimple" } }
+ ! { dg-final { scan-tree-dump-times "private.z" 2 "gimple" } }
+ ! { dg-final { scan-tree-dump-times "omp target oacc_\[^ \]+ map.force_tofrom:y" 2 "gimple" } }
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gfortran.dg/goacc/cray-2.f95 gcc-6-20160721/gcc/testsuite/gfortran.dg/goacc/cray-2.f95
+--- gcc-6.1.0/gcc/testsuite/gfortran.dg/goacc/cray-2.f95 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gfortran.dg/goacc/cray-2.f95 2016-06-10 09:46:18.000000000 +0000
+@@ -0,0 +1,56 @@
++! { dg-additional-options "-fcray-pointer" }
++! See also cray.f95.
++
++program test
++ call oacc1
++contains
++ subroutine oacc1
++ implicit none
++ integer :: i
++ real :: pointee
++ pointer (ptr, pointee)
++ !$acc declare device_resident (pointee)
++ !$acc declare device_resident (ptr)
++ !$acc data copy (pointee) ! { dg-error "Cray pointee" }
++ !$acc end data
++ !$acc data deviceptr (pointee) ! { dg-error "Cray pointee" }
++ !$acc end data
++ !$acc parallel private (pointee) ! { dg-error "Cray pointee" }
++ !$acc end parallel
++ !$acc host_data use_device (pointee) ! { dg-error "Cray pointee" }
++ !$acc end host_data
++ !$acc parallel loop reduction(+:pointee) ! { dg-error "Cray pointee" }
++ do i = 1,5
++ enddo
++ !$acc end parallel loop
++ !$acc parallel loop
++ do i = 1,5
++ !$acc cache (pointee) ! { dg-error "Cray pointee" }
++ enddo
++ !$acc end parallel loop
++ !$acc update device (pointee) ! { dg-error "Cray pointee" }
++ !$acc update host (pointee) ! { dg-error "Cray pointee" }
++ !$acc update self (pointee) ! { dg-error "Cray pointee" }
++ !$acc data copy (ptr)
++ !$acc end data
++ !$acc data deviceptr (ptr) ! { dg-error "Cray pointer" }
++ !$acc end data
++ !$acc parallel private (ptr)
++ !$acc end parallel
++ !$acc host_data use_device (ptr) ! { dg-error "Cray pointer" }
++ !$acc end host_data
++ !$acc parallel loop reduction(+:ptr) ! { dg-error "Cray pointer" }
++ do i = 1,5
++ enddo
++ !$acc end parallel loop
++ !$acc parallel loop
++ do i = 1,5
++ !TODO: This must fail, as in openacc-1_0-branch.
++ !$acc cache (ptr) ! { dg-error "" "TODO" { xfail *-*-* } }
++ enddo
++ !$acc end parallel loop
++ !$acc update device (ptr)
++ !$acc update host (ptr)
++ !$acc update self (ptr)
++ end subroutine oacc1
++end program test
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gfortran.dg/goacc/cray.f95 gcc-6-20160721/gcc/testsuite/gfortran.dg/goacc/cray.f95
+--- gcc-6.1.0/gcc/testsuite/gfortran.dg/goacc/cray.f95 2015-10-27 16:54:52.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gfortran.dg/goacc/cray.f95 2016-06-10 09:46:18.000000000 +0000
+@@ -1,5 +1,5 @@
+-! { dg-do compile }
+ ! { dg-additional-options "-fcray-pointer" }
++! See also cray-2.f95.
+
+ module test
+ contains
+@@ -8,8 +8,8 @@
+ integer :: i
+ real :: pointee
+ pointer (ptr, pointee)
+- !$acc declare device_resident (pointee)
+- !$acc declare device_resident (ptr)
++ !$acc declare device_resident (pointee)
++ !$acc declare device_resident (ptr)
+ !$acc data copy (pointee) ! { dg-error "Cray pointee" }
+ !$acc end data
+ !$acc data deviceptr (pointee) ! { dg-error "Cray pointee" }
+@@ -44,7 +44,8 @@
+ !$acc end parallel loop
+ !$acc parallel loop
+ do i = 1,5
+- !$acc cache (ptr) ! TODO: This must fail, as in openacc-1_0-branch
++ !TODO: This must fail, as in openacc-1_0-branch.
++ !$acc cache (ptr) ! { dg-error "" "TODO" { xfail *-*-* } }
+ enddo
+ !$acc end parallel loop
+ !$acc update device (ptr)
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gfortran.dg/goacc/loop-1-2.f95 gcc-6-20160721/gcc/testsuite/gfortran.dg/goacc/loop-1-2.f95
+--- gcc-6.1.0/gcc/testsuite/gfortran.dg/goacc/loop-1-2.f95 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gfortran.dg/goacc/loop-1-2.f95 2016-06-10 09:46:18.000000000 +0000
+@@ -0,0 +1,176 @@
++! See also loop-1.f95.
++
++program test
++ call test1
++contains
++
++subroutine test1
++ integer :: i, j, k, b(10)
++ integer, dimension (30) :: a
++ double precision :: d
++ real :: r
++ i = 0
++ !$acc loop
++ do 100 ! { dg-error "cannot be a DO WHILE or DO without loop control" }
++ if (i .gt. 0) exit ! { dg-error "EXIT statement" }
++ 100 i = i + 1
++ i = 0
++ !$acc loop
++ do ! { dg-error "cannot be a DO WHILE or DO without loop control" }
++ if (i .gt. 0) exit ! { dg-error "EXIT statement" }
++ i = i + 1
++ end do
++ i = 0
++ !$acc loop
++ do 200 while (i .lt. 4) ! { dg-error "cannot be a DO WHILE or DO without loop control" }
++ 200 i = i + 1
++ !$acc loop
++ do while (i .lt. 8) ! { dg-error "cannot be a DO WHILE or DO without loop control" }
++ i = i + 1
++ end do
++ !$acc loop
++ do 300 d = 1, 30, 6
++ i = d
++ 300 a(i) = 1
++ ! { dg-warning "Deleted feature: Loop variable at .1. must be integer" "" { target *-*-* } 32 }
++ ! { dg-error "ACC LOOP iteration variable must be of type integer" "" { target *-*-* } 32 }
++ !$acc loop
++ do d = 1, 30, 5
++ i = d
++ a(i) = 2
++ end do
++ ! { dg-warning "Deleted feature: Loop variable at .1. must be integer" "" { target *-*-* } 38 }
++ ! { dg-error "ACC LOOP iteration variable must be of type integer" "" { target *-*-* } 38 }
++ !$acc loop
++ do i = 1, 30
++ if (i .eq. 16) exit ! { dg-error "EXIT statement" }
++ end do
++ !$acc loop
++ outer: do i = 1, 30
++ do j = 5, 10
++ if (i .eq. 6 .and. j .eq. 7) exit outer ! { dg-error "EXIT statement" }
++ end do
++ end do outer
++ last: do i = 1, 30
++ end do last
++
++ ! different types of loop are allowed
++ !$acc loop
++ do i = 1,10
++ end do
++ !$acc loop
++ do 400, i = 1,10
++400 a(i) = i
++
++ ! after loop directive must be loop
++ !$acc loop
++ a(1) = 1 ! { dg-error "Expected DO loop" }
++ do i = 1,10
++ enddo
++
++ ! combined directives may be used with/without end
++ !$acc parallel loop
++ do i = 1,10
++ enddo
++ !$acc parallel loop
++ do i = 1,10
++ enddo
++ !$acc end parallel loop
++ !$acc kernels loop
++ do i = 1,10
++ enddo
++ !$acc kernels loop
++ do i = 1,10
++ enddo
++ !$acc end kernels loop
++
++ !$acc kernels loop reduction(max:i)
++ do i = 1,10
++ enddo
++ !$acc kernels
++ !$acc loop reduction(max:i)
++ do i = 1,10
++ enddo
++ !$acc end kernels
++
++ !$acc parallel loop collapse(0) ! { dg-error "constant positive integer" }
++ do i = 1,10
++ enddo
++
++ !$acc parallel loop collapse(-1) ! { dg-error "constant positive integer" }
++ do i = 1,10
++ enddo
++
++ !$acc parallel loop collapse(i) ! { dg-error "Constant expression required" }
++ do i = 1,10
++ enddo
++
++ !$acc parallel loop collapse(4) ! { dg-error "not enough DO loops for collapsed" }
++ do i = 1, 3
++ do j = 4, 6
++ do k = 5, 7
++ a(i+j-k) = i + j + k
++ end do
++ end do
++ end do
++ !$acc parallel loop collapse(2)
++ do i = 1, 5, 2
++ do j = i + 1, 7, i ! { dg-error "collapsed loops don.t form rectangular iteration space" }
++ end do
++ end do
++ !$acc parallel loop collapse(2)
++ do i = 1, 3
++ do j = 4, 6
++ end do
++ end do
++ !$acc parallel loop collapse(2)
++ do i = 1, 3
++ do j = 4, 6
++ end do
++ k = 4
++ end do
++ !$acc parallel loop collapse(3-1)
++ do i = 1, 3
++ do j = 4, 6
++ end do
++ k = 4
++ end do
++ !$acc parallel loop collapse(1+1)
++ do i = 1, 3
++ do j = 4, 6
++ end do
++ k = 4
++ end do
++ !$acc parallel loop collapse(2)
++ do i = 1, 3
++ do ! { dg-error "cannot be a DO WHILE or DO without loop control" }
++ end do
++ end do
++ !$acc parallel loop collapse(2)
++ do i = 1, 3
++ do r = 4, 6
++ end do
++ ! { dg-warning "Deleted feature: Loop variable at .1. must be integer" "" { target *-*-* } 151 }
++ ! { dg-error "ACC LOOP iteration variable must be of type integer" "" { target *-*-* } 151 }
++ end do
++
++ ! Both seq and independent are not allowed
++ !$acc loop independent seq ! { dg-error "SEQ conflicts with INDEPENDENT" }
++ do i = 1,10
++ enddo
++
++
++ !$acc cache (a(1:10)) ! { dg-error "ACC CACHE directive must be inside of loop" }
++
++ do i = 1,10
++ !$acc cache(a(i:i+1))
++ enddo
++
++ do i = 1,10
++ !$acc cache(a(i:i+1))
++ a(i) = i
++ !$acc cache(a(i+2:i+2+1))
++ enddo
++
++end subroutine test1
++end program test
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gfortran.dg/goacc/loop-1.f95 gcc-6-20160721/gcc/testsuite/gfortran.dg/goacc/loop-1.f95
+--- gcc-6.1.0/gcc/testsuite/gfortran.dg/goacc/loop-1.f95 2016-03-30 15:08:47.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gfortran.dg/goacc/loop-1.f95 2016-06-10 09:46:18.000000000 +0000
+@@ -1,8 +1,10 @@
++! See also loop-1-2.f95.
++
+ module test
+ implicit none
+ contains
+
+-subroutine test1
++subroutine test1
+ integer :: i, j, k, b(10)
+ integer, dimension (30) :: a
+ double precision :: d
+@@ -30,15 +32,15 @@
+ do 300 d = 1, 30, 6
+ i = d
+ 300 a(i) = 1
+- ! { dg-warning "Deleted feature: Loop variable at .1. must be integer" "" { target *-*-* } 30 }
+- ! { dg-error "ACC LOOP iteration variable must be of type integer" "" { target *-*-* } 30 }
++ ! { dg-warning "Deleted feature: Loop variable at .1. must be integer" "" { target *-*-* } 32 }
++ ! { dg-error "ACC LOOP iteration variable must be of type integer" "" { target *-*-* } 32 }
+ !$acc loop
+ do d = 1, 30, 5
+ i = d
+ a(i) = 2
+ end do
+- ! { dg-warning "Deleted feature: Loop variable at .1. must be integer" "" { target *-*-* } 36 }
+- ! { dg-error "ACC LOOP iteration variable must be of type integer" "" { target *-*-* } 36 }
++ ! { dg-warning "Deleted feature: Loop variable at .1. must be integer" "" { target *-*-* } 38 }
++ ! { dg-error "ACC LOOP iteration variable must be of type integer" "" { target *-*-* } 38 }
+ !$acc loop
+ do i = 1, 30
+ if (i .eq. 16) exit ! { dg-error "EXIT statement" }
+@@ -53,7 +55,7 @@
+ end do last
+
+ ! different types of loop are allowed
+- !$acc loop
++ !$acc loop
+ do i = 1,10
+ end do
+ !$acc loop
+@@ -65,8 +67,8 @@
+ a(1) = 1 ! { dg-error "Expected DO loop" }
+ do i = 1,10
+ enddo
+-
+- ! combined directives may be used with/without end
++
++ ! combined directives may be used with/without end
+ !$acc parallel loop
+ do i = 1,10
+ enddo
+@@ -82,11 +84,11 @@
+ enddo
+ !$acc end kernels loop
+
+- !$acc kernels loop reduction(max:i)
++ !$acc kernels loop reduction(max:i)
+ do i = 1,10
+ enddo
+- !$acc kernels
+- !$acc loop reduction(max:i)
++ !$acc kernels
++ !$acc loop reduction(max:i)
+ do i = 1,10
+ enddo
+ !$acc end kernels
+@@ -118,7 +120,7 @@
+ end do
+ !$acc parallel loop collapse(2)
+ do i = 1, 3
+- do j = 4, 6
++ do j = 4, 6
+ end do
+ end do
+ !$acc parallel loop collapse(2)
+@@ -148,8 +150,8 @@
+ do i = 1, 3
+ do r = 4, 6
+ end do
+- ! { dg-warning "Deleted feature: Loop variable at .1. must be integer" "" { target *-*-* } 149 }
+- ! { dg-error "ACC LOOP iteration variable must be of type integer" "" { target *-*-* } 149 }
++ ! { dg-warning "Deleted feature: Loop variable at .1. must be integer" "" { target *-*-* } 151 }
++ ! { dg-error "ACC LOOP iteration variable must be of type integer" "" { target *-*-* } 151 }
+ end do
+
+ ! Both seq and independent are not allowed
+@@ -158,15 +160,16 @@
+ enddo
+
+
+- !$acc cache (a) ! { dg-error "inside of loop" }
++ !$acc cache (a(1:10)) ! { dg-error "ACC CACHE directive must be inside of loop" }
+
+ do i = 1,10
+- !$acc cache(a)
++ !$acc cache(a(i:i+1))
+ enddo
+
+ do i = 1,10
++ !$acc cache(a(i:i+1))
+ a(i) = i
+- !$acc cache(a)
++ !$acc cache(a(i+2:i+2+1))
+ enddo
+
+ end subroutine test1
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gfortran.dg/goacc/loop-3-2.f95 gcc-6-20160721/gcc/testsuite/gfortran.dg/goacc/loop-3-2.f95
+--- gcc-6.1.0/gcc/testsuite/gfortran.dg/goacc/loop-3-2.f95 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gfortran.dg/goacc/loop-3-2.f95 2016-06-10 09:46:18.000000000 +0000
+@@ -0,0 +1,58 @@
++! { dg-additional-options "-std=f2008" }
++! See also loop-3.f95.
++
++program test
++ call test1
++contains
++subroutine test1
++ implicit none
++ integer :: i, j
++
++ ! !$acc end loop not required by spec
++ !$acc loop
++ do i = 1,5
++ enddo
++ !$acc end loop ! { dg-warning "Redundant" }
++
++ !$acc loop
++ do i = 1,5
++ enddo
++ j = 1
++ !$acc end loop ! { dg-error "Unexpected" }
++
++ !$acc parallel
++ !$acc loop
++ do i = 1,5
++ enddo
++ !$acc end parallel
++ !$acc end loop ! { dg-error "Unexpected" }
++
++ ! OpenACC supports Fortran 2008 do concurrent statement
++ !$acc loop
++ do concurrent (i = 1:5)
++ end do
++
++ !$acc loop
++ outer_loop: do i = 1, 5
++ inner_loop: do j = 1,5
++ if (i .eq. j) cycle outer_loop
++ if (i .ne. j) exit outer_loop ! { dg-error "EXIT statement" }
++ end do inner_loop
++ end do outer_loop
++
++ outer_loop1: do i = 1, 5
++ !$acc loop
++ inner_loop1: do j = 1,5
++ if (i .eq. j) cycle outer_loop1 ! { dg-error "CYCLE statement" }
++ end do inner_loop1
++ end do outer_loop1
++
++ !$acc loop collapse(2)
++ outer_loop2: do i = 1, 5
++ inner_loop2: do j = 1,5
++ if (i .eq. j) cycle outer_loop2 ! { dg-error "CYCLE statement" }
++ if (i .ne. j) exit outer_loop2 ! { dg-error "EXIT statement" }
++ end do inner_loop2
++ end do outer_loop2
++end subroutine test1
++end program test
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gfortran.dg/goacc/loop-3.f95 gcc-6-20160721/gcc/testsuite/gfortran.dg/goacc/loop-3.f95
+--- gcc-6.1.0/gcc/testsuite/gfortran.dg/goacc/loop-3.f95 2015-01-15 20:11:12.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gfortran.dg/goacc/loop-3.f95 2016-06-10 09:46:18.000000000 +0000
+@@ -1,10 +1,10 @@
+-! { dg-do compile }
+ ! { dg-additional-options "-std=f2008" }
++! See also loop-3-2.f95.
+
+ subroutine test1
+ implicit none
+ integer :: i, j
+-
++
+ ! !$acc end loop not required by spec
+ !$acc loop
+ do i = 1,5
+@@ -23,7 +23,7 @@
+ enddo
+ !$acc end parallel
+ !$acc end loop ! { dg-error "Unexpected" }
+-
++
+ ! OpenACC supports Fortran 2008 do concurrent statement
+ !$acc loop
+ do concurrent (i = 1:5)
+@@ -35,7 +35,7 @@
+ if (i .eq. j) cycle outer_loop
+ if (i .ne. j) exit outer_loop ! { dg-error "EXIT statement" }
+ end do inner_loop
+- end do outer_loop
++ end do outer_loop
+
+ outer_loop1: do i = 1, 5
+ !$acc loop
+@@ -50,6 +50,5 @@
+ if (i .eq. j) cycle outer_loop2 ! { dg-error "CYCLE statement" }
+ if (i .ne. j) exit outer_loop2 ! { dg-error "EXIT statement" }
+ end do inner_loop2
+- end do outer_loop2
++ end do outer_loop2
+ end subroutine test1
+-
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gfortran.dg/goacc/nested-function-1.f90 gcc-6-20160721/gcc/testsuite/gfortran.dg/goacc/nested-function-1.f90
+--- gcc-6.1.0/gcc/testsuite/gfortran.dg/goacc/nested-function-1.f90 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gfortran.dg/goacc/nested-function-1.f90 2016-06-10 09:46:18.000000000 +0000
+@@ -0,0 +1,93 @@
++! Exercise nested function decomposition, gcc/tree-nested.c.
++! See gcc/testsuite/gcc.dg/goacc/nested-function-1.c for the C version.
++
++program main
++ integer, parameter :: N = 100
++ integer :: nonlocal_arg
++ integer :: nonlocal_a(N)
++ integer :: nonlocal_i
++ integer :: nonlocal_j
++
++ nonlocal_a (:) = 5
++ nonlocal_arg = 5
++
++ call local ()
++ call nonlocal ()
++
++contains
++
++ subroutine local ()
++ integer :: local_i
++ integer :: local_arg
++ integer :: local_a(N)
++ integer :: local_j
++
++ local_a (:) = 5
++ local_arg = 5
++
++ !$acc kernels loop &
++ !$acc gang(num:local_arg) worker(local_arg) vector(local_arg) &
++ !$acc wait async(local_arg)
++ do local_i = 1, N
++ !$acc cache (local_a(local_i:local_i + 5))
++ local_a(local_i) = 100
++ !$acc loop seq tile(*)
++ do local_j = 1, N
++ enddo
++ !$acc loop auto independent tile(1)
++ do local_j = 1, N
++ enddo
++ enddo
++ !$acc end kernels loop
++
++ !$acc kernels loop &
++ !$acc gang(static:local_arg) worker(local_arg) vector(local_arg) &
++ !$acc wait(local_arg, local_arg + 1, local_arg + 2) async
++ do local_i = 1, N
++ !$acc cache (local_a(local_i:local_i + 4))
++ local_a(local_i) = 100
++ !$acc loop seq tile(1)
++ do local_j = 1, N
++ enddo
++ !$acc loop auto independent tile(*)
++ do local_j = 1, N
++ enddo
++ enddo
++ !$acc end kernels loop
++ end subroutine local
++
++ subroutine nonlocal ()
++ nonlocal_a (:) = 5
++ nonlocal_arg = 5
++
++ !$acc kernels loop &
++ !$acc gang(num:nonlocal_arg) worker(nonlocal_arg) vector(nonlocal_arg) &
++ !$acc wait async(nonlocal_arg)
++ do nonlocal_i = 1, N
++ !$acc cache (nonlocal_a(nonlocal_i:nonlocal_i + 3))
++ nonlocal_a(nonlocal_i) = 100
++ !$acc loop seq tile(2)
++ do nonlocal_j = 1, N
++ enddo
++ !$acc loop auto independent tile(3)
++ do nonlocal_j = 1, N
++ enddo
++ enddo
++ !$acc end kernels loop
++
++ !$acc kernels loop &
++ !$acc gang(static:nonlocal_arg) worker(nonlocal_arg) vector(nonlocal_arg) &
++ !$acc wait(nonlocal_arg, nonlocal_arg + 1, nonlocal_arg + 2) async
++ do nonlocal_i = 1, N
++ !$acc cache (nonlocal_a(nonlocal_i:nonlocal_i + 2))
++ nonlocal_a(nonlocal_i) = 100
++ !$acc loop seq tile(*)
++ do nonlocal_j = 1, N
++ enddo
++ !$acc loop auto independent tile(*)
++ do nonlocal_j = 1, N
++ enddo
++ enddo
++ !$acc end kernels loop
++ end subroutine nonlocal
++end program main
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gfortran.dg/goacc/pr71704.f90 gcc-6-20160721/gcc/testsuite/gfortran.dg/goacc/pr71704.f90
+--- gcc-6.1.0/gcc/testsuite/gfortran.dg/goacc/pr71704.f90 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gfortran.dg/goacc/pr71704.f90 2016-07-08 21:27:22.000000000 +0000
+@@ -0,0 +1,60 @@
++! PR fortran/71704
++! { dg-do compile }
++
++real function f1 ()
++!$acc routine (f1)
++ f1 = 1
++end
++
++real function f2 (a)
++ integer a
++ !$acc enter data copyin(a)
++ f2 = 1
++end
++
++real function f3 (a)
++ integer a
++!$acc enter data copyin(a)
++ f3 = 1
++end
++
++real function f4 ()
++!$acc wait
++ f4 = 1
++end
++
++real function f5 (a)
++ integer a
++!$acc update device(a)
++ f5 = 1
++end
++
++real function f6 ()
++!$acc parallel
++!$acc end parallel
++ f6 = 1
++end
++
++real function f7 ()
++!$acc kernels
++!$acc end kernels
++ f7 = 1
++end
++
++real function f8 ()
++!$acc data
++!$acc end data
++ f8 = 1
++end
++
++real function f9 ()
++!$acc host_data
++!$acc end host_data
++ f8 = 1
++end
++
++real function f10 (a)
++ integer a
++!$acc declare present (a)
++ f8 = 1
++end
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gfortran.dg/goacc/reduction-2.f95 gcc-6-20160721/gcc/testsuite/gfortran.dg/goacc/reduction-2.f95
+--- gcc-6.1.0/gcc/testsuite/gfortran.dg/goacc/reduction-2.f95 2015-12-02 19:59:27.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gfortran.dg/goacc/reduction-2.f95 2016-04-29 17:37:55.000000000 +0000
+@@ -15,7 +15,7 @@
+ !$acc end kernels loop
+ end subroutine
+
+-! { dg-final { scan-tree-dump-times "target oacc_parallel firstprivate.a." 1 "gimple" } }
++! { dg-final { scan-tree-dump-times "target oacc_parallel reduction..:a. map.tofrom.a." 1 "gimple" } }
+ ! { dg-final { scan-tree-dump-times "acc loop private.p. reduction..:a." 1 "gimple" } }
+ ! { dg-final { scan-tree-dump-times "target oacc_kernels map.force_tofrom:a .len: 4.." 1 "gimple" } }
+ ! { dg-final { scan-tree-dump-times "acc loop private.k. reduction..:a." 1 "gimple" } }
+Only in gcc-6.1.0/gcc/testsuite/gfortran.dg/goacc: subroutines.f90
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gfortran.dg/gomp/order-1.f90 gcc-6-20160721/gcc/testsuite/gfortran.dg/gomp/order-1.f90
+--- gcc-6.1.0/gcc/testsuite/gfortran.dg/gomp/order-1.f90 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gfortran.dg/gomp/order-1.f90 2016-06-01 12:22:54.000000000 +0000
+@@ -0,0 +1,92 @@
++! { dg-do compile }
++
++module m
++ integer :: i
++end module m
++subroutine f1
++ type t
++ integer :: i
++ end type t
++ interface
++ integer function f3 (a, b)
++ !$omp declare simd (f3) uniform (a)
++ use m
++ import :: t
++ implicit none
++ type (t) :: a
++ integer :: b
++ end function f3
++ end interface
++ interface
++ integer function f4 (a, b)
++ use m
++ !$omp declare simd (f4) uniform (a)
++ import :: t
++ implicit none
++ type (t) :: a
++ integer :: b
++ end function f4
++ end interface
++ interface
++ integer function f5 (a, b)
++ use m
++ import :: t
++ !$omp declare simd (f5) uniform (a)
++ implicit none
++ type (t) :: a
++ integer :: b
++ end function f5
++ end interface
++ interface
++ integer function f6 (a, b)
++ use m
++ import :: t
++ implicit none
++ !$omp declare simd (f6) uniform (a)
++ type (t) :: a
++ integer :: b
++ end function f6
++ end interface
++ interface
++ integer function f7 (a, b)
++ use m
++ import :: t
++ implicit none
++ type (t) :: a
++ !$omp declare simd (f7) uniform (a)
++ integer :: b
++ end function f7
++ end interface
++ call f2
++contains
++ subroutine f2
++ !$omp threadprivate (t1)
++ use m
++ !$omp threadprivate (t2)
++ implicit none
++ !$omp threadprivate (t3)
++ integer, save :: t1, t2, t3, t4
++ !$omp threadprivate (t4)
++ t1 = 1; t2 = 2; t3 = 3; t4 = 4
++ end subroutine f2
++ subroutine f8
++ !$omp declare reduction (f8_1:real:omp_out = omp_out + omp_in)
++ use m
++ !$omp declare reduction (f8_2:real:omp_out = omp_out + omp_in)
++ implicit none
++ !$omp declare reduction (f8_3:real:omp_out = omp_out + omp_in)
++ integer :: j
++ !$omp declare reduction (f8_4:real:omp_out = omp_out + omp_in)
++ end subroutine f8
++ subroutine f9
++ !$omp declare target (f9_1)
++ use m
++ !$omp declare target (f9_2)
++ implicit none
++ !$omp declare target (f9_3)
++ !$omp declare target
++ integer, save :: f9_1, f9_2, f9_3, f9_4
++ !$omp declare target (f9_4)
++ f9_1 = 1; f9_2 = 2; f9_3 = 3; f9_4 = 4
++ end subroutine f9
++end subroutine f1
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gfortran.dg/gomp/order-2.f90 gcc-6-20160721/gcc/testsuite/gfortran.dg/gomp/order-2.f90
+--- gcc-6.1.0/gcc/testsuite/gfortran.dg/gomp/order-2.f90 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gfortran.dg/gomp/order-2.f90 2016-06-01 12:22:54.000000000 +0000
+@@ -0,0 +1,37 @@
++! { dg-do compile }
++
++module m
++ integer :: i
++end module m
++subroutine f1
++ call f2
++contains
++ subroutine f2
++ use m
++ implicit none
++ integer, save :: t
++ t = 1
++ !$omp threadprivate (t1) ! { dg-error "Unexpected" }
++ end subroutine f2
++ subroutine f3
++ use m
++ implicit none
++ integer :: j
++ j = 1
++ !$omp declare reduction (foo:real:omp_out = omp_out + omp_in) ! { dg-error "Unexpected" }
++ end subroutine f3
++ subroutine f4
++ use m
++ implicit none
++ !$omp declare target
++ integer, save :: f4_1
++ f4_1 = 1
++ !$omp declare target (f4_1) ! { dg-error "Unexpected" }
++ !$omp declare target ! { dg-error "Unexpected" }
++ end subroutine f4
++ integer function f5 (a, b)
++ integer :: a, b
++ a = 1; b = 2
++ !$omp declare simd (f5) notinbranch ! { dg-error "Unexpected" }
++ end function f5
++end subroutine f1
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gfortran.dg/gomp/pr70855.f90 gcc-6-20160721/gcc/testsuite/gfortran.dg/gomp/pr70855.f90
+--- gcc-6.1.0/gcc/testsuite/gfortran.dg/gomp/pr70855.f90 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gfortran.dg/gomp/pr70855.f90 2016-05-11 13:18:05.000000000 +0000
+@@ -0,0 +1,18 @@
++! PR fortran/70855
++! { dg-do compile }
++! { dg-additional-options "-O2" }
++
++program pr70855
++ integer, parameter :: m = 4
++ integer, parameter :: n = 2
++ real :: a(m,n)
++ real :: x(n)
++ real :: y(m)
++ a = 1.0
++ x = 1.0
++!$omp parallel
++!$omp workshare
++ y(1:m) = matmul ( a(1:m,1:n), x(1:n) )
++!$omp end workshare
++!$omp end parallel
++end program pr70855
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gfortran.dg/gomp/pr71687.f90 gcc-6-20160721/gcc/testsuite/gfortran.dg/gomp/pr71687.f90
+--- gcc-6.1.0/gcc/testsuite/gfortran.dg/gomp/pr71687.f90 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gfortran.dg/gomp/pr71687.f90 2016-07-02 10:25:52.000000000 +0000
+@@ -0,0 +1,11 @@
++! PR fortran/71687
++! { dg-do compile }
++! { dg-additional-options "-fstack-arrays -O2" }
++
++subroutine s (n, x)
++ integer :: n
++ real :: x(n)
++!$omp parallel
++ x(1:n) = x(n:1:-1)
++!$omp end parallel
++end
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gfortran.dg/gomp/pr71704.f90 gcc-6-20160721/gcc/testsuite/gfortran.dg/gomp/pr71704.f90
+--- gcc-6.1.0/gcc/testsuite/gfortran.dg/gomp/pr71704.f90 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gfortran.dg/gomp/pr71704.f90 2016-07-02 10:23:45.000000000 +0000
+@@ -0,0 +1,58 @@
++! PR fortran/71704
++! { dg-do compile }
++
++real function f0 ()
++!$omp declare simd (f0)
++ f0 = 1
++end
++
++real function f1 ()
++!$omp declare target (f1)
++ f1 = 1
++end
++
++real function f2 ()
++!$omp declare reduction (foo : integer : omp_out = omp_out + omp_in) &
++!$omp & initializer (omp_priv = 0)
++ f2 = 1
++end
++
++real function f3 ()
++ real, save :: t
++!$omp threadprivate (t)
++ f3 = 1
++end
++
++real function f4 ()
++!$omp taskwait
++ f4 = 1
++end
++
++real function f5 ()
++!$omp barrier
++ f5 = 1
++end
++
++real function f6 ()
++!$omp parallel
++!$omp end parallel
++ f6 = 1
++end
++
++real function f7 ()
++!$omp single
++!$omp end single
++ f7 = 1
++end
++
++real function f8 ()
++!$omp critical
++!$omp end critical
++ f8 = 1
++end
++
++real function f9 ()
++!$omp critical
++!$omp end critical
++ f9 = 1
++end
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gfortran.dg/gomp/pr71705.f90 gcc-6-20160721/gcc/testsuite/gfortran.dg/gomp/pr71705.f90
+--- gcc-6.1.0/gcc/testsuite/gfortran.dg/gomp/pr71705.f90 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gfortran.dg/gomp/pr71705.f90 2016-07-02 10:22:48.000000000 +0000
+@@ -0,0 +1,7 @@
++! PR fortran/71705
++! { dg-do compile }
++
++ real :: x
++ x = 0.0
++ !$omp target update to(x)
++end
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gfortran.dg/gomp/pr71758.f90 gcc-6-20160721/gcc/testsuite/gfortran.dg/gomp/pr71758.f90
+--- gcc-6.1.0/gcc/testsuite/gfortran.dg/gomp/pr71758.f90 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gfortran.dg/gomp/pr71758.f90 2016-07-11 20:43:11.000000000 +0000
+@@ -0,0 +1,10 @@
++! PR middle-end/71758
++
++subroutine pr71758 (p)
++ integer(8) :: i
++ integer :: p(20)
++ i = 0
++ !$omp target device(i)
++ !$omp end target
++ !$omp target update to(p(1:1)) device(i)
++end subroutine
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gfortran.dg/graphite/pr38083.f90 gcc-6-20160721/gcc/testsuite/gfortran.dg/graphite/pr38083.f90
+--- gcc-6.1.0/gcc/testsuite/gfortran.dg/graphite/pr38083.f90 2009-07-31 02:45:54.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gfortran.dg/graphite/pr38083.f90 2016-06-12 14:04:08.000000000 +0000
+@@ -8,7 +8,7 @@
+ 10 IF (IL .GE. IH) GO TO 80
+ 20 NSEGS = (IH + IL) / 2
+ IF (NSEGS .GT. MAXSGS) THEN
+- WRITE (IOUNIT),MAXSGS
++ WRITE (IOUNIT) MAXSGS
+ ENDIF
+ 80 NSEGS = NSEGS - 1
+ 90 IF (IH - IL .GE. 11) GO TO 20
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gfortran.dg/guality/pr41558.f90 gcc-6-20160721/gcc/testsuite/gfortran.dg/guality/pr41558.f90
+--- gcc-6.1.0/gcc/testsuite/gfortran.dg/guality/pr41558.f90 2012-02-07 22:28:18.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gfortran.dg/guality/pr41558.f90 2016-06-12 14:04:08.000000000 +0000
+@@ -5,7 +5,7 @@
+
+ subroutine f (s)
+ character(len=3) :: s
+- write (*,*), s ! { dg-final { gdb-test 7 "s" "'foo'" } }
++ write (*,*) s ! { dg-final { gdb-test 7 "s" "'foo'" } }
+ end
+ call f ('foo')
+ end
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gfortran.dg/integer_exponentiation_6.F90 gcc-6-20160721/gcc/testsuite/gfortran.dg/integer_exponentiation_6.F90
+--- gcc-6.1.0/gcc/testsuite/gfortran.dg/integer_exponentiation_6.F90 2015-02-23 23:02:50.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gfortran.dg/integer_exponentiation_6.F90 2016-06-12 14:04:08.000000000 +0000
+@@ -1,4 +1,4 @@
+ ! { dg-options "-fno-range-check" }
+ program test
+- write (*), (2_8 ** 64009999_8) / 2
++ write (*,*) (2_8 ** 64009999_8) / 2
+ end program test
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gfortran.dg/pr69603.f90 gcc-6-20160721/gcc/testsuite/gfortran.dg/pr69603.f90
+--- gcc-6.1.0/gcc/testsuite/gfortran.dg/pr69603.f90 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gfortran.dg/pr69603.f90 2016-05-15 18:48:40.000000000 +0000
+@@ -0,0 +1,16 @@
++! { dg-do compile }
++! { dg-options "-fimplicit-none" }
++! PR fortran/69603 - segfault with -fimplicit-none and proc_ptr_comp_24.f90
++! Based on reduced testcase by Dominique d'Humieres
++PROGRAM prog
++ implicit none
++ TYPE object
++ PROCEDURE(), POINTER, NOPASS :: f
++ END TYPE object
++ TYPE (object) :: o1
++ CALL set_func(o1%f)
++CONTAINS
++ SUBROUTINE set_func(f)
++ PROCEDURE(), POINTER :: f
++ END SUBROUTINE set_func
++END PROGRAM prog
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gfortran.dg/pr70673.f90 gcc-6-20160721/gcc/testsuite/gfortran.dg/pr70673.f90
+--- gcc-6.1.0/gcc/testsuite/gfortran.dg/pr70673.f90 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gfortran.dg/pr70673.f90 2016-06-27 19:18:21.000000000 +0000
+@@ -0,0 +1,25 @@
++! { dg-do run }
++!
++! Test the fix for PR70673
++!
++! Contributed by David Kinniburgh <davidgkinniburgh@yahoo.co.uk>
++!
++module m
++contains
++ subroutine s(inp)
++ character(*), intent(in) :: inp
++ character(:), allocatable :: a
++ a = a ! This used to ICE.
++ a = inp
++ a = a ! This used to ICE too
++ if ((len (a) .ne. 5) .or. (a .ne. "hello")) call abort
++ a = a(2:3) ! Make sure that temporary creation is not broken.
++ if ((len (a) .ne. 2) .or. (a .ne. "el")) call abort
++ deallocate (a)
++ a = a ! This would ICE too.
++ end subroutine s
++end module m
++
++ use m
++ call s("hello")
++end
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gfortran.dg/pr70931.f90 gcc-6-20160721/gcc/testsuite/gfortran.dg/pr70931.f90
+--- gcc-6.1.0/gcc/testsuite/gfortran.dg/pr70931.f90 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gfortran.dg/pr70931.f90 2016-05-13 13:22:42.000000000 +0000
+@@ -0,0 +1,10 @@
++! { dg-do compile }
++! { dg-options "-g" }
++program p
++ type t
++ integer :: a
++ integer :: b(0)
++ end type
++ type(t), parameter :: z = t(1, [2])
++ print *, z
++end
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gfortran.dg/pr71047.f08 gcc-6-20160721/gcc/testsuite/gfortran.dg/pr71047.f08
+--- gcc-6.1.0/gcc/testsuite/gfortran.dg/pr71047.f08 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gfortran.dg/pr71047.f08 2016-05-14 19:52:46.000000000 +0000
+@@ -0,0 +1,48 @@
++! { dg-do compile }
++! { dg-options "-fdump-tree-original" }
++!
++! Fortran/PR71047
++!
++
++module m
++ implicit none
++
++ type, abstract :: c_abstr
++ integer :: i = 0
++ end type c_abstr
++
++ type, extends(c_abstr) :: t_a
++ class(c_abstr), allocatable :: f
++ end type t_a
++
++ type, extends(c_abstr) :: t_b
++ end type t_b
++
++contains
++
++ subroutine set(y,x)
++ class(c_abstr), intent(in) :: x
++ type(t_a), intent(out) :: y
++ allocate( y%f , source=x )
++ end subroutine set
++
++end module m
++
++
++program p
++ use m
++ implicit none
++
++ type(t_a) :: res
++ type(t_b) :: var
++
++ call set( res , var )
++ write(*,*) res%i
++
++end program p
++
++!
++! Check to ensure the vtable is actually initialized.
++!
++! { dg-final { scan-tree-dump "t_a\\.\\d+\\.f\\._vptr =" "original" } }
++!
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gfortran.dg/pr71204.f90 gcc-6-20160721/gcc/testsuite/gfortran.dg/pr71204.f90
+--- gcc-6.1.0/gcc/testsuite/gfortran.dg/pr71204.f90 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gfortran.dg/pr71204.f90 2016-05-20 18:52:38.000000000 +0000
+@@ -0,0 +1,17 @@
++! PR fortran/71204
++! { dg-do compile }
++! { dg-options "-O0" }
++
++module pr71204
++ character(10), allocatable :: z(:)
++end module
++
++subroutine s1
++ use pr71204
++ z(2) = z(1)
++end
++
++subroutine s2
++ use pr71204
++ z(2) = z(1)
++end
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gfortran.dg/pr71688.f90 gcc-6-20160721/gcc/testsuite/gfortran.dg/pr71688.f90
+--- gcc-6.1.0/gcc/testsuite/gfortran.dg/pr71688.f90 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gfortran.dg/pr71688.f90 2016-07-20 13:24:19.000000000 +0000
+@@ -0,0 +1,13 @@
++! { dg-do compile }
++! { dg-options "-fcoarray=lib" }
++
++program p
++ call s
++contains
++ subroutine s
++ real :: x[*] = 1
++ block
++ end block
++ x = 2
++ end
++end
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gfortran.dg/pr71764.f90 gcc-6-20160721/gcc/testsuite/gfortran.dg/pr71764.f90
+--- gcc-6.1.0/gcc/testsuite/gfortran.dg/pr71764.f90 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gfortran.dg/pr71764.f90 2016-07-16 03:54:12.000000000 +0000
+@@ -0,0 +1,34 @@
++! { dg-do run }
++! PR71764
++program p
++ use iso_c_binding, only: c_ptr, c_null_ptr, c_ptr, c_associated, c_loc
++ logical, target :: rls
++ real, target :: t = 3.14
++ type(c_ptr) :: nullptr,c
++ real, pointer :: k
++ nullptr = c_null_ptr
++ c = nullptr
++ rls = c_associated(c)
++ if (rls) call abort
++ if (c_associated(c)) call abort
++ c = c_loc(rls)
++ if (.not. c_associated(c)) call abort
++ c = nullptr
++ if (c_associated(c)) call abort
++ c = c_loc(t)
++ k => t
++ call association_test(k, c)
++contains
++ subroutine association_test(a,b)
++ use iso_c_binding, only: c_associated, c_loc, c_ptr
++ implicit none
++ real, pointer :: a
++ type(c_ptr) :: b
++ if(c_associated(b, c_loc(a))) then
++ return
++ else
++ call abort
++ end if
++ end subroutine association_test
++end
++
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gfortran.dg/submodule_14.f08 gcc-6-20160721/gcc/testsuite/gfortran.dg/submodule_14.f08
+--- gcc-6.1.0/gcc/testsuite/gfortran.dg/submodule_14.f08 2016-03-12 13:59:10.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gfortran.dg/submodule_14.f08 2016-06-01 18:46:11.000000000 +0000
+@@ -27,7 +27,7 @@
+ Call sub1 (x)
+ End If
+ End Procedure sub1
+- module function fcn1 (x) result(res)
++ recursive module function fcn1 (x) result(res)
+ integer, intent (inout) :: x
+ integer :: res
+ res = x - 1
+@@ -46,4 +46,4 @@
+ x = 10
+ if (fcn1 (x) .ne. 0) call abort
+ end
+-
++! { dg-final { cleanup-submodules "test@testson" } }
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gfortran.dg/submodule_15.f08 gcc-6-20160721/gcc/testsuite/gfortran.dg/submodule_15.f08
+--- gcc-6.1.0/gcc/testsuite/gfortran.dg/submodule_15.f08 2016-03-12 13:59:10.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gfortran.dg/submodule_15.f08 2016-04-27 16:58:19.000000000 +0000
+@@ -56,3 +56,4 @@
+ incr = 1
+ if (a3(i) .ne. 11) call abort
+ end
++! { dg-final { cleanup-submodules "a@a_son" } }
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gfortran.dg/submodule_16.f08 gcc-6-20160721/gcc/testsuite/gfortran.dg/submodule_16.f08
+--- gcc-6.1.0/gcc/testsuite/gfortran.dg/submodule_16.f08 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gfortran.dg/submodule_16.f08 2016-06-01 18:46:11.000000000 +0000
+@@ -0,0 +1,53 @@
++! { dg-do compile }
++!
++! Tests the fix for PR71156 in which the valid code (f7, f8 and f9 below)
++! triggered an error, while the invalid code (f1 to f6) compiled.
++!
++! Contributed by Damian Rousn <damian@sourceryinstitute.org>
++!
++module my_interface
++ implicit none
++ interface
++ module subroutine f1
++ end subroutine
++ module subroutine f2
++ end subroutine
++ module subroutine f3
++ end subroutine
++ elemental module subroutine f4
++ end subroutine
++ pure module subroutine f5
++ end subroutine
++ recursive module subroutine f6
++ end subroutine
++ elemental module subroutine f7
++ end subroutine
++ pure module subroutine f8
++ end subroutine
++ recursive module subroutine f9
++ end subroutine
++ end interface
++end module
++
++submodule(my_interface) my_implementation
++ implicit none
++contains
++ elemental module subroutine f1 ! { dg-error "Mismatch in ELEMENTAL attribute" }
++ end subroutine
++ pure module subroutine f2 ! { dg-error "Mismatch in PURE attribute" }
++ end subroutine
++ recursive module subroutine f3 ! { dg-error "Mismatch in RECURSIVE attribute" }
++ end subroutine
++ module subroutine f4 ! { dg-error "ELEMENTAL prefix" }
++ end subroutine
++ module subroutine f5 ! { dg-error "PURE prefix" }
++ end subroutine
++ module subroutine f6 ! { dg-error "RECURSIVE prefix" }
++ end subroutine
++ elemental module subroutine f7
++ end subroutine
++ pure module subroutine f8
++ end subroutine
++ recursive module subroutine f9
++ end subroutine
++end submodule
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gfortran.dg/unexpected_eof.f gcc-6-20160721/gcc/testsuite/gfortran.dg/unexpected_eof.f
+--- gcc-6.1.0/gcc/testsuite/gfortran.dg/unexpected_eof.f 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gfortran.dg/unexpected_eof.f 2016-05-27 01:05:21.000000000 +0000
+@@ -0,0 +1,8 @@
++! { dg-do compile }
++! PR66461 ICE on missing end program in fixed source
++ program p
++ integer x(2)
++ x = -1
++ if ( x(1) < 0 .or.
++ & x(2) < 0 ) print *, x
++! { dg-error "Unexpected end of file" "" { target *-*-* } 0 }
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gnat.dg/case_character.adb gcc-6-20160721/gcc/testsuite/gnat.dg/case_character.adb
+--- gcc-6.1.0/gcc/testsuite/gnat.dg/case_character.adb 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gnat.dg/case_character.adb 2016-06-11 11:55:51.000000000 +0000
+@@ -0,0 +1,19 @@
++-- { dg-do run }
++
++procedure Case_Character is
++
++ function Test (C : Character) return Integer is
++ begin
++ case C is
++ when ASCII.HT | ' ' .. Character'Last => return 1;
++ when others => return 0;
++ end case;
++ end;
++
++begin
++
++ if Test ('A') /= 1 then
++ raise Program_Error;
++ end if;
++
++end;
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gnat.dg/debug5.adb gcc-6-20160721/gcc/testsuite/gnat.dg/debug5.adb
+--- gcc-6.1.0/gcc/testsuite/gnat.dg/debug5.adb 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gnat.dg/debug5.adb 2016-05-03 16:20:47.000000000 +0000
+@@ -0,0 +1,22 @@
++-- { dg-do compile }
++-- { dg-options "-g" }
++
++procedure Debug5 is
++
++ type Record_Type (L1, L2 : Natural) is record
++ S1 : String (1 .. L1);
++ case L2 is
++ when 0 => null;
++ when others => S2 : String (L1 .. L2);
++ end case;
++ end record;
++
++ procedure Discard (R : Record_Type) is
++ begin
++ null;
++ end Discard;
++
++ R : constant Record_Type := (0, 0, others => <>);
++begin
++ Discard (R);
++end Debug5;
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gnat.dg/opt56.adb gcc-6-20160721/gcc/testsuite/gnat.dg/opt56.adb
+--- gcc-6.1.0/gcc/testsuite/gnat.dg/opt56.adb 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gnat.dg/opt56.adb 2016-06-01 10:38:35.000000000 +0000
+@@ -0,0 +1,15 @@
++-- { dg-do compile }
++-- { dg-options "-O3" }
++
++package body Opt56 is
++
++ function F (Values : Vector) return Boolean is
++ Result : Boolean := True;
++ begin
++ for I in Values'Range loop
++ Result := Result and Values (I) >= 0.0;
++ end loop;
++ return Result;
++ end;
++
++end Opt56;
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gnat.dg/opt56.ads gcc-6-20160721/gcc/testsuite/gnat.dg/opt56.ads
+--- gcc-6.1.0/gcc/testsuite/gnat.dg/opt56.ads 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gnat.dg/opt56.ads 2016-06-01 10:38:35.000000000 +0000
+@@ -0,0 +1,7 @@
++package Opt56 is
++
++ type Vector is array (Positive range <>) of Float;
++
++ function F (Values : Vector) return Boolean;
++
++end Opt56;
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gnat.dg/renaming10.adb gcc-6-20160721/gcc/testsuite/gnat.dg/renaming10.adb
+--- gcc-6.1.0/gcc/testsuite/gnat.dg/renaming10.adb 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gnat.dg/renaming10.adb 2016-06-13 08:02:10.000000000 +0000
+@@ -0,0 +1,12 @@
++-- { dg-do compile }
++
++package body Renaming10 is
++
++ function F (Input : Rec) return Natural is
++ Position : Natural renames Input.Position;
++ Index : Natural renames Natural'Succ(Position);
++ begin
++ return Index;
++ end;
++
++end Renaming10;
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/gnat.dg/renaming10.ads gcc-6-20160721/gcc/testsuite/gnat.dg/renaming10.ads
+--- gcc-6.1.0/gcc/testsuite/gnat.dg/renaming10.ads 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/gnat.dg/renaming10.ads 2016-06-13 08:02:10.000000000 +0000
+@@ -0,0 +1,9 @@
++package Renaming10 is
++
++ type Rec is record
++ Position : Natural;
++ end record;
++
++ function F (Input : Rec) return Natural;
++
++end Renaming10;
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/lib/target-supports.exp gcc-6-20160721/gcc/testsuite/lib/target-supports.exp
+--- gcc-6.1.0/gcc/testsuite/lib/target-supports.exp 2016-04-11 19:45:35.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/lib/target-supports.exp 2016-07-05 17:54:02.000000000 +0000
+@@ -2300,6 +2300,40 @@
+ float dummy = 1.0q;
+ } "$opts"]
+ }
++
++# Return 1 if the target supports __float128,
++# 0 otherwise.
++
++proc check_effective_target___float128 { } {
++ if { [istarget powerpc*-*-*] } {
++ return [check_ppc_float128_sw_available]
++ }
++ if { [istarget ia64-*-*]
++ || [istarget i?86-*-*]
++ || [istarget x86_64-*-*] } {
++ return 1
++ }
++ return 0
++}
++
++proc add_options_for___float128 { flags } {
++ if { [istarget powerpc*-*-*] } {
++ return "$flags -mfloat128 -mvsx"
++ }
++ return "$flags"
++}
++
++# Return 1 if the target supports any special run-time requirements
++# for __float128 or _Float128,
++# 0 otherwise.
++
++proc check_effective_target_base_quadfloat_support { } {
++ if { [istarget powerpc*-*-*] } {
++ return [check_vsx_hw_available]
++ }
++ return 1
++}
++
+ # Return 1 if the target supports compiling fixed-point,
+ # 0 otherwise.
+
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/opt55.adb gcc-6-20160721/gcc/testsuite/opt55.adb
+--- gcc-6.1.0/gcc/testsuite/opt55.adb 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/opt55.adb 2016-05-25 20:44:21.000000000 +0000
+@@ -0,0 +1,20 @@
++-- { dg-do compile }
++-- { dg-options "-O" }
++
++package body Opt55 is
++
++ function Cond (B : Boolean; If_True, If_False : Date) return Date is
++ begin
++ if B then
++ return If_True;
++ else
++ return If_False;
++ end if;
++ end;
++
++ function F (C : Rec2; B : Boolean) return Date is
++ begin
++ return Cond (B, C.D1, C.D2);
++ end;
++
++end Opt55;
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/testsuite/opt55.ads gcc-6-20160721/gcc/testsuite/opt55.ads
+--- gcc-6.1.0/gcc/testsuite/opt55.ads 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/gcc/testsuite/opt55.ads 2016-05-25 20:44:21.000000000 +0000
+@@ -0,0 +1,22 @@
++package Opt55 is
++
++ type Date is record
++ D : Float;
++ end record;
++
++ type Rec1 (Kind : Boolean := False) is record
++ case Kind is
++ when True => N : Natural;
++ when False => null;
++ end case;
++ end record;
++
++ type Rec2 (D : Positive) is record
++ R : Rec1;
++ D1 : Date;
++ D2 : Date;
++ end record;
++
++ function F (C : Rec2; B : Boolean) return Date;
++
++end Opt55;
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/timevar.def gcc-6-20160721/gcc/timevar.def
+--- gcc-6.1.0/gcc/timevar.def 2016-02-10 11:22:29.000000000 +0000
++++ gcc-6-20160721/gcc/timevar.def 2016-07-21 06:18:06.000000000 +0000
+@@ -137,6 +137,8 @@
+ DEFTIMEVAR (TV_PARSE_INLINE , "parser inl. func. body")
+ DEFTIMEVAR (TV_PARSE_INMETH , "parser inl. meth. body")
+ DEFTIMEVAR (TV_TEMPLATE_INST , "template instantiation")
++DEFTIMEVAR (TV_CONSTRAINT_SAT , "constraint satisfaction")
++DEFTIMEVAR (TV_CONSTRAINT_SUB , "constraint subsumption")
+ DEFTIMEVAR (TV_FLATTEN_INLINING , "flatten inlining")
+ DEFTIMEVAR (TV_EARLY_INLINING , "early inlining heuristics")
+ DEFTIMEVAR (TV_INLINE_PARAMETERS , "inline parameters")
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/timevar.h gcc-6-20160721/gcc/timevar.h
+--- gcc-6.1.0/gcc/timevar.h 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/gcc/timevar.h 2016-07-21 06:18:06.000000000 +0000
+@@ -229,6 +229,14 @@
+ m_timer->push (m_tv);
+ }
+
++ explicit auto_timevar (timevar_id_t tv)
++ : m_timer (g_timer)
++ , m_tv (tv)
++ {
++ if (m_timer)
++ m_timer->push (m_tv);
++ }
++
+ ~auto_timevar ()
+ {
+ if (m_timer)
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/tree-chkp.c gcc-6-20160721/gcc/tree-chkp.c
+--- gcc-6.1.0/gcc/tree-chkp.c 2016-02-21 11:25:31.000000000 +0000
++++ gcc-6-20160721/gcc/tree-chkp.c 2016-05-11 09:55:55.000000000 +0000
+@@ -1853,7 +1853,9 @@
+
+ /* If function decl is available then use it for
+ formal arguments list. Otherwise use function type. */
+- if (fndecl && DECL_ARGUMENTS (fndecl))
++ if (fndecl
++ && DECL_ARGUMENTS (fndecl)
++ && gimple_call_fntype (call) == TREE_TYPE (fndecl))
+ first_formal_arg = DECL_ARGUMENTS (fndecl);
+ else
+ {
+@@ -1929,7 +1931,16 @@
+ {
+ tree new_decl = chkp_maybe_create_clone (fndecl)->decl;
+ gimple_call_set_fndecl (new_call, new_decl);
+- gimple_call_set_fntype (new_call, TREE_TYPE (new_decl));
++ /* In case of a type cast we should modify used function
++ type instead of using type of new fndecl. */
++ if (gimple_call_fntype (call) != TREE_TYPE (fndecl))
++ {
++ tree type = gimple_call_fntype (call);
++ type = chkp_copy_function_type_adding_bounds (type);
++ gimple_call_set_fntype (new_call, type);
++ }
++ else
++ gimple_call_set_fntype (new_call, TREE_TYPE (new_decl));
+ }
+ /* For indirect call we should fix function pointer type if
+ pass some bounds. */
+@@ -3646,6 +3657,7 @@
+ break;
+
+ case ADDR_EXPR:
++ case WITH_SIZE_EXPR:
+ bounds = chkp_make_addressed_object_bounds (TREE_OPERAND (ptr_src, 0), iter);
+ break;
+
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/tree-inline.c gcc-6-20160721/gcc/tree-inline.c
+--- gcc-6.1.0/gcc/tree-inline.c 2016-04-04 15:42:19.000000000 +0000
++++ gcc-6-20160721/gcc/tree-inline.c 2016-05-12 14:34:18.000000000 +0000
+@@ -840,7 +840,7 @@
+ static unsigned short
+ remap_dependence_clique (copy_body_data *id, unsigned short clique)
+ {
+- if (clique == 0)
++ if (clique == 0 || processing_debug_stmt)
+ return 0;
+ if (!id->dependence_map)
+ id->dependence_map = new hash_map<dependence_hash, unsigned short>;
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/tree-nested.c gcc-6-20160721/gcc/tree-nested.c
+--- gcc-6.1.0/gcc/tree-nested.c 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/gcc/tree-nested.c 2016-06-14 14:45:23.000000000 +0000
+@@ -1114,6 +1114,8 @@
+ case OMP_CLAUSE_GANG:
+ case OMP_CLAUSE_WORKER:
+ case OMP_CLAUSE_VECTOR:
++ case OMP_CLAUSE_ASYNC:
++ case OMP_CLAUSE_WAIT:
+ /* Several OpenACC clauses have optional arguments. Check if they
+ are present. */
+ if (OMP_CLAUSE_OPERAND (clause, 0))
+@@ -1197,8 +1199,22 @@
+ case OMP_CLAUSE_SIMD:
+ case OMP_CLAUSE_DEFAULTMAP:
+ case OMP_CLAUSE_SEQ:
++ case OMP_CLAUSE_INDEPENDENT:
++ case OMP_CLAUSE_AUTO:
+ break;
+
++ case OMP_CLAUSE_TILE:
++ /* OpenACC tile clauses are discarded during gimplification, so we
++ don't expect to see anything here. */
++ gcc_unreachable ();
++
++ case OMP_CLAUSE__CACHE_:
++ /* These clauses belong to the OpenACC cache directive, which is
++ discarded during gimplification, so we don't expect to see
++ anything here. */
++ gcc_unreachable ();
++
++ case OMP_CLAUSE_DEVICE_RESIDENT:
+ default:
+ gcc_unreachable ();
+ }
+@@ -1332,7 +1348,7 @@
+ {
+ wi->val_only = true;
+ wi->is_lhs = false;
+- *handled_ops_p = true;
++ *handled_ops_p = false;
+ return NULL_TREE;
+ }
+ break;
+@@ -1790,6 +1806,8 @@
+ case OMP_CLAUSE_GANG:
+ case OMP_CLAUSE_WORKER:
+ case OMP_CLAUSE_VECTOR:
++ case OMP_CLAUSE_ASYNC:
++ case OMP_CLAUSE_WAIT:
+ /* Several OpenACC clauses have optional arguments. Check if they
+ are present. */
+ if (OMP_CLAUSE_OPERAND (clause, 0))
+@@ -1878,8 +1896,22 @@
+ case OMP_CLAUSE_SIMD:
+ case OMP_CLAUSE_DEFAULTMAP:
+ case OMP_CLAUSE_SEQ:
++ case OMP_CLAUSE_INDEPENDENT:
++ case OMP_CLAUSE_AUTO:
+ break;
+
++ case OMP_CLAUSE_TILE:
++ /* OpenACC tile clauses are discarded during gimplification, so we
++ don't expect to see anything here. */
++ gcc_unreachable ();
++
++ case OMP_CLAUSE__CACHE_:
++ /* These clauses belong to the OpenACC cache directive, which is
++ discarded during gimplification, so we don't expect to see
++ anything here. */
++ gcc_unreachable ();
++
++ case OMP_CLAUSE_DEVICE_RESIDENT:
+ default:
+ gcc_unreachable ();
+ }
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/tree-object-size.c gcc-6-20160721/gcc/tree-object-size.c
+--- gcc-6.1.0/gcc/tree-object-size.c 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/gcc/tree-object-size.c 2016-07-21 07:49:15.000000000 +0000
+@@ -43,7 +43,12 @@
+ unsigned int *stack, *tos;
+ };
+
+-static const unsigned HOST_WIDE_INT unknown[4] = { -1, -1, 0, 0 };
++static const unsigned HOST_WIDE_INT unknown[4] = {
++ HOST_WIDE_INT_M1U,
++ HOST_WIDE_INT_M1U,
++ 0,
++ 0
++};
+
+ static tree compute_object_offset (const_tree, const_tree);
+ static unsigned HOST_WIDE_INT addr_object_size (struct object_size_info *,
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/tree-sra.c gcc-6-20160721/gcc/tree-sra.c
+--- gcc-6.1.0/gcc/tree-sra.c 2016-04-13 20:35:59.000000000 +0000
++++ gcc-6-20160721/gcc/tree-sra.c 2016-05-23 11:27:14.000000000 +0000
+@@ -2074,7 +2074,8 @@
+ access->grp_scalar_write = grp_scalar_write;
+ access->grp_assignment_read = grp_assignment_read;
+ access->grp_assignment_write = grp_assignment_write;
+- access->grp_hint = multiple_scalar_reads || total_scalarization;
++ access->grp_hint = total_scalarization
++ || (multiple_scalar_reads && !constant_decl_p (var));
+ access->grp_total_scalarization = total_scalarization;
+ access->grp_partial_lhs = grp_partial_lhs;
+ access->grp_unscalarizable_region = unscalarizable_region;
+@@ -3559,32 +3560,31 @@
+ unsigned i;
+
+ EXECUTE_IF_SET_IN_BITMAP (candidate_bitmap, 0, i, bi)
+- if (bitmap_bit_p (should_scalarize_away_bitmap, i)
+- && !bitmap_bit_p (cannot_scalarize_away_bitmap, i))
+- {
+- tree var = candidate (i);
+- if (!constant_decl_p (var))
+- continue;
+- vec<access_p> *access_vec = get_base_access_vector (var);
+- if (!access_vec)
+- continue;
+- for (unsigned i = 0; i < access_vec->length (); i++)
+- {
+- struct access *access = (*access_vec)[i];
+- if (!access->replacement_decl)
+- continue;
+- gassign *stmt = gimple_build_assign (
+- get_access_replacement (access), unshare_expr (access->expr));
+- if (dump_file && (dump_flags & TDF_DETAILS))
+- {
+- fprintf (dump_file, "Generating constant initializer: ");
+- print_gimple_stmt (dump_file, stmt, 0, 1);
+- fprintf (dump_file, "\n");
+- }
+- gsi_insert_after (&gsi, stmt, GSI_NEW_STMT);
+- update_stmt (stmt);
+- }
+- }
++ {
++ tree var = candidate (i);
++ if (!constant_decl_p (var))
++ continue;
++ vec<access_p> *access_vec = get_base_access_vector (var);
++ if (!access_vec)
++ continue;
++ for (unsigned i = 0; i < access_vec->length (); i++)
++ {
++ struct access *access = (*access_vec)[i];
++ if (!access->replacement_decl)
++ continue;
++ gassign *stmt
++ = gimple_build_assign (get_access_replacement (access),
++ unshare_expr (access->expr));
++ if (dump_file && (dump_flags & TDF_DETAILS))
++ {
++ fprintf (dump_file, "Generating constant initializer: ");
++ print_gimple_stmt (dump_file, stmt, 0, 1);
++ fprintf (dump_file, "\n");
++ }
++ gsi_insert_after (&gsi, stmt, GSI_NEW_STMT);
++ update_stmt (stmt);
++ }
++ }
+
+ seq = gsi_seq (gsi);
+ if (seq)
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/tree-ssa-coalesce.c gcc-6-20160721/gcc/tree-ssa-coalesce.c
+--- gcc-6.1.0/gcc/tree-ssa-coalesce.c 2016-04-08 17:28:20.000000000 +0000
++++ gcc-6-20160721/gcc/tree-ssa-coalesce.c 2016-05-04 20:25:10.000000000 +0000
+@@ -1505,7 +1505,8 @@
+ /* Given SSA_NAMEs NAME1 and NAME2, return true if they are candidates for
+ coalescing together, false otherwise.
+
+- This must stay consistent with var_map_base_init in tree-ssa-live.c. */
++ This must stay consistent with compute_samebase_partition_bases and
++ compute_optimized_partition_bases. */
+
+ bool
+ gimple_can_coalesce_p (tree name1, tree name2)
+@@ -1759,7 +1760,7 @@
+ else
+ /* This restricts what anonymous SSA names we can coalesce
+ as it restricts the sets we compute conflicts for.
+- Using TREE_TYPE to generate sets is the easies as
++ Using TREE_TYPE to generate sets is the easiest as
+ type equivalency also holds for SSA names with the same
+ underlying decl.
+
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/tree-ssa-loop-unswitch.c gcc-6-20160721/gcc/tree-ssa-loop-unswitch.c
+--- gcc-6.1.0/gcc/tree-ssa-loop-unswitch.c 2016-04-12 13:38:46.000000000 +0000
++++ gcc-6-20160721/gcc/tree-ssa-loop-unswitch.c 2016-05-10 14:26:37.000000000 +0000
+@@ -532,6 +532,12 @@
+ guard_edge->src->index, guard_edge->dest->index);
+ return NULL;
+ }
++ if (guard_edge->dest == loop->latch)
++ {
++ if (dump_file && (dump_flags & TDF_DETAILS))
++ fprintf (dump_file, "Guard edge destination is loop latch.\n");
++ return NULL;
++ }
+
+ if (dump_file && (dump_flags & TDF_DETAILS))
+ fprintf (dump_file,
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/tree-ssa-phiopt.c gcc-6-20160721/gcc/tree-ssa-phiopt.c
+--- gcc-6.1.0/gcc/tree-ssa-phiopt.c 2016-03-14 14:50:40.000000000 +0000
++++ gcc-6-20160721/gcc/tree-ssa-phiopt.c 2016-05-25 20:44:21.000000000 +0000
+@@ -438,15 +438,18 @@
+ /* Check if arg0 is an SSA_NAME and the stmt which defines arg0 is
+ a conversion. */
+ arg0_def_stmt = SSA_NAME_DEF_STMT (arg0);
+- if (!is_gimple_assign (arg0_def_stmt)
+- || !gimple_assign_cast_p (arg0_def_stmt))
++ if (!gimple_assign_cast_p (arg0_def_stmt))
+ return NULL;
+
+ /* Use the RHS as new_arg0. */
+ convert_code = gimple_assign_rhs_code (arg0_def_stmt);
+ new_arg0 = gimple_assign_rhs1 (arg0_def_stmt);
+ if (convert_code == VIEW_CONVERT_EXPR)
+- new_arg0 = TREE_OPERAND (new_arg0, 0);
++ {
++ new_arg0 = TREE_OPERAND (new_arg0, 0);
++ if (!is_gimple_reg_type (TREE_TYPE (new_arg0)))
++ return NULL;
++ }
+
+ if (TREE_CODE (arg1) == SSA_NAME)
+ {
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/tree-ssa-sccvn.c gcc-6-20160721/gcc/tree-ssa-sccvn.c
+--- gcc-6.1.0/gcc/tree-ssa-sccvn.c 2016-04-19 13:17:46.000000000 +0000
++++ gcc-6-20160721/gcc/tree-ssa-sccvn.c 2016-06-13 17:44:29.000000000 +0000
+@@ -1976,11 +1976,7 @@
+ /* We need to pre-pend vr->operands[0..i] to rhs. */
+ vec<vn_reference_op_s> old = vr->operands;
+ if (i + 1 + rhs.length () > vr->operands.length ())
+- {
+- vr->operands.safe_grow (i + 1 + rhs.length ());
+- if (old == shared_lookup_references)
+- shared_lookup_references = vr->operands;
+- }
++ vr->operands.safe_grow (i + 1 + rhs.length ());
+ else
+ vr->operands.truncate (i + 1 + rhs.length ());
+ FOR_EACH_VEC_ELT (rhs, j, vro)
+@@ -2131,8 +2127,7 @@
+ {
+ vec<vn_reference_op_s> old = vr->operands;
+ vr->operands.safe_grow_cleared (2);
+- if (old == shared_lookup_references
+- && vr->operands != old)
++ if (old == shared_lookup_references)
+ shared_lookup_references = vr->operands;
+ }
+ else
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/tree-ssa-strlen.c gcc-6-20160721/gcc/tree-ssa-strlen.c
+--- gcc-6.1.0/gcc/tree-ssa-strlen.c 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/gcc/tree-ssa-strlen.c 2016-06-21 07:15:36.000000000 +0000
+@@ -859,6 +859,65 @@
+ }
+ }
+
++/* Return true if STMT is a call to a builtin function with the right
++ arguments and attributes that should be considered for optimization
++ by this pass. */
++
++static bool
++valid_builtin_call (gimple *stmt)
++{
++ if (!gimple_call_builtin_p (stmt, BUILT_IN_NORMAL))
++ return false;
++
++ tree callee = gimple_call_fndecl (stmt);
++ switch (DECL_FUNCTION_CODE (callee))
++ {
++ case BUILT_IN_MEMCMP:
++ case BUILT_IN_STRCHR:
++ case BUILT_IN_STRCHR_CHKP:
++ case BUILT_IN_STRLEN:
++ case BUILT_IN_STRLEN_CHKP:
++ /* The above functions should be pure. Punt if they aren't. */
++ if (gimple_vdef (stmt) || gimple_vuse (stmt) == NULL_TREE)
++ return false;
++ break;
++
++ case BUILT_IN_CALLOC:
++ case BUILT_IN_MALLOC:
++ case BUILT_IN_MEMCPY:
++ case BUILT_IN_MEMCPY_CHK:
++ case BUILT_IN_MEMCPY_CHKP:
++ case BUILT_IN_MEMCPY_CHK_CHKP:
++ case BUILT_IN_MEMPCPY:
++ case BUILT_IN_MEMPCPY_CHK:
++ case BUILT_IN_MEMPCPY_CHKP:
++ case BUILT_IN_MEMPCPY_CHK_CHKP:
++ case BUILT_IN_MEMSET:
++ case BUILT_IN_STPCPY:
++ case BUILT_IN_STPCPY_CHK:
++ case BUILT_IN_STPCPY_CHKP:
++ case BUILT_IN_STPCPY_CHK_CHKP:
++ case BUILT_IN_STRCAT:
++ case BUILT_IN_STRCAT_CHK:
++ case BUILT_IN_STRCAT_CHKP:
++ case BUILT_IN_STRCAT_CHK_CHKP:
++ case BUILT_IN_STRCPY:
++ case BUILT_IN_STRCPY_CHK:
++ case BUILT_IN_STRCPY_CHKP:
++ case BUILT_IN_STRCPY_CHK_CHKP:
++ /* The above functions should be neither const nor pure. Punt if they
++ aren't. */
++ if (gimple_vdef (stmt) == NULL_TREE || gimple_vuse (stmt) == NULL_TREE)
++ return false;
++ break;
++
++ default:
++ break;
++ }
++
++ return true;
++}
++
+ /* If the last .MEM setter statement before STMT is
+ memcpy (x, y, strlen (y) + 1), the only .MEM use of it is STMT
+ and STMT is known to overwrite x[strlen (x)], adjust the last memcpy to
+@@ -934,7 +993,7 @@
+ return;
+ }
+
+- if (!gimple_call_builtin_p (last.stmt, BUILT_IN_NORMAL))
++ if (!valid_builtin_call (last.stmt))
+ return;
+
+ callee = gimple_call_fndecl (last.stmt);
+@@ -1810,7 +1869,7 @@
+ if (!stmt1 || !is_gimple_call (stmt1))
+ return true;
+ tree callee1 = gimple_call_fndecl (stmt1);
+- if (!gimple_call_builtin_p (stmt1, BUILT_IN_NORMAL))
++ if (!valid_builtin_call (stmt1))
+ return true;
+ enum built_in_function code1 = DECL_FUNCTION_CODE (callee1);
+ tree size = gimple_call_arg (stmt2, 2);
+@@ -2055,7 +2114,7 @@
+ if (is_gimple_call (stmt))
+ {
+ tree callee = gimple_call_fndecl (stmt);
+- if (gimple_call_builtin_p (stmt, BUILT_IN_NORMAL))
++ if (valid_builtin_call (stmt))
+ switch (DECL_FUNCTION_CODE (callee))
+ {
+ case BUILT_IN_STRLEN:
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/tree-ssa-structalias.c gcc-6-20160721/gcc/tree-ssa-structalias.c
+--- gcc-6.1.0/gcc/tree-ssa-structalias.c 2016-03-10 08:06:03.000000000 +0000
++++ gcc-6-20160721/gcc/tree-ssa-structalias.c 2016-05-13 13:22:42.000000000 +0000
+@@ -4639,12 +4639,11 @@
+ auto_vec<ce_s, 2> lhsc;
+ struct constraint_expr rhs;
+ struct constraint_expr *lhsp;
++ bool aggr_p = aggregate_value_p (lhsop, gimple_call_fntype (t));
+
+ get_constraint_for (lhsop, &lhsc);
+ rhs = get_function_part_constraint (fi, fi_result);
+- if (fndecl
+- && DECL_RESULT (fndecl)
+- && DECL_BY_REFERENCE (DECL_RESULT (fndecl)))
++ if (aggr_p)
+ {
+ auto_vec<ce_s, 2> tem;
+ tem.quick_push (rhs);
+@@ -4654,22 +4653,19 @@
+ }
+ FOR_EACH_VEC_ELT (lhsc, j, lhsp)
+ process_constraint (new_constraint (*lhsp, rhs));
+- }
+
+- /* If we pass the result decl by reference, honor that. */
+- if (lhsop
+- && fndecl
+- && DECL_RESULT (fndecl)
+- && DECL_BY_REFERENCE (DECL_RESULT (fndecl)))
+- {
+- struct constraint_expr lhs;
+- struct constraint_expr *rhsp;
++ /* If we pass the result decl by reference, honor that. */
++ if (aggr_p)
++ {
++ struct constraint_expr lhs;
++ struct constraint_expr *rhsp;
+
+- get_constraint_for_address_of (lhsop, &rhsc);
+- lhs = get_function_part_constraint (fi, fi_result);
+- FOR_EACH_VEC_ELT (rhsc, j, rhsp)
+- process_constraint (new_constraint (lhs, *rhsp));
+- rhsc.truncate (0);
++ get_constraint_for_address_of (lhsop, &rhsc);
++ lhs = get_function_part_constraint (fi, fi_result);
++ FOR_EACH_VEC_ELT (rhsc, j, rhsp)
++ process_constraint (new_constraint (lhs, *rhsp));
++ rhsc.truncate (0);
++ }
+ }
+
+ /* If we use a static chain, pass it along. */
+@@ -7486,7 +7482,7 @@
+ = { true, false, false, false, false, false, false, false, NULL };
+
+ /* Associate node with varinfo DATA. Worker for
+- cgraph_for_node_and_aliases. */
++ cgraph_for_symbol_thunks_and_aliases. */
+ static bool
+ associate_varinfo_to_alias (struct cgraph_node *node, void *data)
+ {
+@@ -7496,6 +7492,29 @@
+ return false;
+ }
+
++/* Compute whether node is refered to non-locally. Worker for
++ cgraph_for_symbol_thunks_and_aliases. */
++static bool
++refered_from_nonlocal_fn (struct cgraph_node *node, void *data)
++{
++ bool *nonlocal_p = (bool *)data;
++ *nonlocal_p |= (node->used_from_other_partition
++ || node->externally_visible
++ || node->force_output);
++ return false;
++}
++
++/* Same for varpool nodes. */
++static bool
++refered_from_nonlocal_var (struct varpool_node *node, void *data)
++{
++ bool *nonlocal_p = (bool *)data;
++ *nonlocal_p |= (node->used_from_other_partition
++ || node->externally_visible
++ || node->force_output);
++ return false;
++}
++
+ /* Execute the driver for IPA PTA. */
+ static unsigned int
+ ipa_pta_execute (void)
+@@ -7559,6 +7578,8 @@
+ || node->externally_visible
+ || node->force_output
+ || node_address_taken);
++ node->call_for_symbol_thunks_and_aliases (refered_from_nonlocal_fn,
++ &nonlocal_p, true);
+
+ vi = create_function_info_for (node->decl,
+ alias_get_name (node->decl), false,
+@@ -7596,6 +7617,8 @@
+ bool nonlocal_p = (var->used_from_other_partition
+ || var->externally_visible
+ || var->force_output);
++ var->call_for_symbol_and_aliases (refered_from_nonlocal_var,
++ &nonlocal_p, true);
+ if (nonlocal_p)
+ vi->is_ipa_escape_point = true;
+ }
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/tree-ssa-tail-merge.c gcc-6-20160721/gcc/tree-ssa-tail-merge.c
+--- gcc-6.1.0/gcc/tree-ssa-tail-merge.c 2016-03-07 14:50:13.000000000 +0000
++++ gcc-6-20160721/gcc/tree-ssa-tail-merge.c 2016-06-10 09:45:51.000000000 +0000
+@@ -538,6 +538,9 @@
+ gimple *s1, *s2;
+ basic_block bb1, bb2;
+
++ if (e1 == e2)
++ return 1;
++
+ if (e1->hashval != e2->hashval)
+ return 0;
+
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/tree-ssa-uninit.c gcc-6-20160721/gcc/tree-ssa-uninit.c
+--- gcc-6.1.0/gcc/tree-ssa-uninit.c 2016-01-13 12:15:01.000000000 +0000
++++ gcc-6-20160721/gcc/tree-ssa-uninit.c 2016-06-21 07:13:52.000000000 +0000
+@@ -133,6 +133,29 @@
+ if (!has_undefined_value_p (t))
+ return;
+
++ /* Anonymous SSA_NAMEs shouldn't be uninitialized, but ssa_undefined_value_p
++ can return true if the def stmt of anonymous SSA_NAME is COMPLEX_EXPR
++ created for conversion from scalar to complex. Use the underlying var of
++ the COMPLEX_EXPRs real part in that case. See PR71581. */
++ if (expr == NULL_TREE
++ && var == NULL_TREE
++ && SSA_NAME_VAR (t) == NULL_TREE
++ && is_gimple_assign (SSA_NAME_DEF_STMT (t))
++ && gimple_assign_rhs_code (SSA_NAME_DEF_STMT (t)) == COMPLEX_EXPR)
++ {
++ tree v = gimple_assign_rhs1 (SSA_NAME_DEF_STMT (t));
++ if (TREE_CODE (v) == SSA_NAME
++ && has_undefined_value_p (v)
++ && zerop (gimple_assign_rhs2 (SSA_NAME_DEF_STMT (t))))
++ {
++ expr = SSA_NAME_VAR (v);
++ var = expr;
++ }
++ }
++
++ if (expr == NULL_TREE)
++ return;
++
+ /* TREE_NO_WARNING either means we already warned, or the front end
+ wishes to suppress the warning. */
+ if ((context
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/tree-ssa.c gcc-6-20160721/gcc/tree-ssa.c
+--- gcc-6.1.0/gcc/tree-ssa.c 2016-02-09 08:35:22.000000000 +0000
++++ gcc-6-20160721/gcc/tree-ssa.c 2016-07-07 07:30:04.000000000 +0000
+@@ -1342,6 +1342,18 @@
+ tree decl = TREE_OPERAND (TREE_OPERAND (lhs, 0), 0);
+ if (DECL_P (decl)
+ && DECL_SIZE (decl) == TYPE_SIZE (TREE_TYPE (lhs))
++ /* If the dynamic type of the decl has larger precision than
++ the decl itself we can't use the decls type for SSA rewriting. */
++ && ((! INTEGRAL_TYPE_P (TREE_TYPE (decl))
++ || compare_tree_int (DECL_SIZE (decl),
++ TYPE_PRECISION (TREE_TYPE (decl))) == 0)
++ || (INTEGRAL_TYPE_P (TREE_TYPE (lhs))
++ && (TYPE_PRECISION (TREE_TYPE (decl))
++ >= TYPE_PRECISION (TREE_TYPE (lhs)))))
++ /* Make sure we are not re-writing non-float copying into float
++ copying as that can incur normalization. */
++ && (! FLOAT_TYPE_P (TREE_TYPE (decl))
++ || types_compatible_p (TREE_TYPE (lhs), TREE_TYPE (decl)))
+ && (TREE_THIS_VOLATILE (decl) == TREE_THIS_VOLATILE (lhs)))
+ return false;
+ }
+@@ -1590,9 +1602,16 @@
+ if (gimple_assign_lhs (stmt) != lhs
+ && !useless_type_conversion_p (TREE_TYPE (lhs),
+ TREE_TYPE (rhs)))
+- rhs = fold_build1 (VIEW_CONVERT_EXPR,
+- TREE_TYPE (lhs), rhs);
+-
++ {
++ if (gimple_clobber_p (stmt))
++ {
++ rhs = build_constructor (TREE_TYPE (lhs), NULL);
++ TREE_THIS_VOLATILE (rhs) = 1;
++ }
++ else
++ rhs = fold_build1 (VIEW_CONVERT_EXPR,
++ TREE_TYPE (lhs), rhs);
++ }
+ if (gimple_assign_lhs (stmt) != lhs)
+ gimple_assign_set_lhs (stmt, lhs);
+
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/tree-vect-data-refs.c gcc-6-20160721/gcc/tree-vect-data-refs.c
+--- gcc-6.1.0/gcc/tree-vect-data-refs.c 2016-04-15 07:28:44.000000000 +0000
++++ gcc-6-20160721/gcc/tree-vect-data-refs.c 2016-07-11 15:21:20.000000000 +0000
+@@ -692,6 +692,7 @@
+ tree base, base_addr;
+ tree misalign = NULL_TREE;
+ tree aligned_to;
++ tree step;
+ unsigned HOST_WIDE_INT alignment;
+
+ if (dump_enabled_p ())
+@@ -822,16 +823,20 @@
+ DR_VECT_AUX (dr)->base_element_aligned = true;
+ }
+
++ if (loop && nested_in_vect_loop_p (loop, stmt))
++ step = STMT_VINFO_DR_STEP (stmt_info);
++ else
++ step = DR_STEP (dr);
+ /* If this is a backward running DR then first access in the larger
+ vectype actually is N-1 elements before the address in the DR.
+ Adjust misalign accordingly. */
+- if (tree_int_cst_sgn (DR_STEP (dr)) < 0)
++ if (tree_int_cst_sgn (step) < 0)
+ {
+ tree offset = ssize_int (TYPE_VECTOR_SUBPARTS (vectype) - 1);
+ /* DR_STEP(dr) is the same as -TYPE_SIZE of the scalar type,
+ otherwise we wouldn't be here. */
+- offset = fold_build2 (MULT_EXPR, ssizetype, offset, DR_STEP (dr));
+- /* PLUS because DR_STEP was negative. */
++ offset = fold_build2 (MULT_EXPR, ssizetype, offset, step);
++ /* PLUS because STEP was negative. */
+ misalign = size_binop (PLUS_EXPR, misalign, offset);
+ }
+
+@@ -2751,7 +2756,7 @@
+ /* Sorting has ensured that DR_INIT (dra) <= DR_INIT (drb). */
+ HOST_WIDE_INT init_a = TREE_INT_CST_LOW (DR_INIT (dra));
+ HOST_WIDE_INT init_b = TREE_INT_CST_LOW (DR_INIT (drb));
+- gcc_assert (init_a < init_b);
++ gcc_assert (init_a <= init_b);
+
+ /* If init_b == init_a + the size of the type * k, we have an
+ interleaving, and DRA is accessed before DRB. */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/tree-vect-loop.c gcc-6-20160721/gcc/tree-vect-loop.c
+--- gcc-6.1.0/gcc/tree-vect-loop.c 2016-04-12 13:38:46.000000000 +0000
++++ gcc-6-20160721/gcc/tree-vect-loop.c 2016-06-01 16:06:29.000000000 +0000
+@@ -216,7 +216,8 @@
+
+ gcc_assert (stmt_info);
+
+- if (STMT_VINFO_RELEVANT_P (stmt_info))
++ if (STMT_VINFO_RELEVANT_P (stmt_info)
++ || STMT_VINFO_LIVE_P (stmt_info))
+ {
+ gcc_assert (!STMT_VINFO_VECTYPE (stmt_info));
+ scalar_type = TREE_TYPE (PHI_RESULT (phi));
+@@ -437,9 +438,12 @@
+ /* Bool ops don't participate in vectorization factor
+ computation. For comparison use compared types to
+ compute a factor. */
+- if (TREE_CODE (scalar_type) == BOOLEAN_TYPE)
++ if (TREE_CODE (scalar_type) == BOOLEAN_TYPE
++ && is_gimple_assign (stmt)
++ && gimple_assign_rhs_code (stmt) != COND_EXPR)
+ {
+- if (STMT_VINFO_RELEVANT_P (stmt_info))
++ if (STMT_VINFO_RELEVANT_P (stmt_info)
++ || STMT_VINFO_LIVE_P (stmt_info))
+ mask_producers.safe_push (stmt_info);
+ bool_result = true;
+
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/tree-vect-patterns.c gcc-6-20160721/gcc/tree-vect-patterns.c
+--- gcc-6.1.0/gcc/tree-vect-patterns.c 2016-03-23 09:52:00.000000000 +0000
++++ gcc-6-20160721/gcc/tree-vect-patterns.c 2016-05-10 16:59:04.000000000 +0000
+@@ -3673,8 +3673,10 @@
+ if (!rhs1_type)
+ return NULL;
+ }
+- else
++ else if (COMPARISON_CLASS_P (rhs1))
+ rhs1_type = TREE_TYPE (TREE_OPERAND (rhs1, 0));
++ else
++ return NULL;
+
+ vectype2 = get_mask_type_for_scalar_type (rhs1_type);
+
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/tree-vect-slp.c gcc-6-20160721/gcc/tree-vect-slp.c
+--- gcc-6.1.0/gcc/tree-vect-slp.c 2016-02-29 13:24:24.000000000 +0000
++++ gcc-6-20160721/gcc/tree-vect-slp.c 2016-06-06 18:47:33.000000000 +0000
+@@ -3050,7 +3050,7 @@
+ if (integer_zerop (op))
+ op = build_int_cst (TREE_TYPE (vector_type), 0);
+ else if (integer_onep (op))
+- op = build_int_cst (TREE_TYPE (vector_type), 1);
++ op = build_all_ones_cst (TREE_TYPE (vector_type));
+ else
+ gcc_unreachable ();
+ }
+@@ -3065,8 +3065,14 @@
+ gimple *init_stmt;
+ if (VECTOR_BOOLEAN_TYPE_P (vector_type))
+ {
++ tree true_val
++ = build_all_ones_cst (TREE_TYPE (vector_type));
++ tree false_val
++ = build_zero_cst (TREE_TYPE (vector_type));
+ gcc_assert (INTEGRAL_TYPE_P (TREE_TYPE (op)));
+- init_stmt = gimple_build_assign (new_temp, NOP_EXPR, op);
++ init_stmt = gimple_build_assign (new_temp, COND_EXPR,
++ op, true_val,
++ false_val);
+ }
+ else
+ {
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/tree-vect-stmts.c gcc-6-20160721/gcc/tree-vect-stmts.c
+--- gcc-6.1.0/gcc/tree-vect-stmts.c 2016-04-20 07:21:42.000000000 +0000
++++ gcc-6-20160721/gcc/tree-vect-stmts.c 2016-07-11 20:39:44.000000000 +0000
+@@ -1256,10 +1256,11 @@
+ gimple *init_stmt;
+ tree new_temp;
+
+- if (TREE_CODE (type) == VECTOR_TYPE
+- && TREE_CODE (TREE_TYPE (val)) != VECTOR_TYPE)
++ /* We abuse this function to push sth to a SSA name with initial 'val'. */
++ if (! useless_type_conversion_p (type, TREE_TYPE (val)))
+ {
+- if (!types_compatible_p (TREE_TYPE (type), TREE_TYPE (val)))
++ gcc_assert (TREE_CODE (type) == VECTOR_TYPE);
++ if (! types_compatible_p (TREE_TYPE (type), TREE_TYPE (val)))
+ {
+ /* Scalar boolean value should be transformed into
+ all zeros or all ones value before building a vector. */
+@@ -1284,7 +1285,13 @@
+ else
+ {
+ new_temp = make_ssa_name (TREE_TYPE (type));
+- init_stmt = gimple_build_assign (new_temp, NOP_EXPR, val);
++ if (! INTEGRAL_TYPE_P (TREE_TYPE (val)))
++ init_stmt = gimple_build_assign (new_temp,
++ fold_build1 (VIEW_CONVERT_EXPR,
++ TREE_TYPE (type),
++ val));
++ else
++ init_stmt = gimple_build_assign (new_temp, NOP_EXPR, val);
+ vect_init_vector_1 (stmt, init_stmt, gsi);
+ val = new_temp;
+ }
+@@ -3022,8 +3029,10 @@
+ {
+ STMT_VINFO_SIMD_CLONE_INFO (stmt_info).safe_push (bestn->decl);
+ for (i = 0; i < nargs; i++)
+- if (bestn->simdclone->args[i].arg_type
+- == SIMD_CLONE_ARG_TYPE_LINEAR_CONSTANT_STEP)
++ if ((bestn->simdclone->args[i].arg_type
++ == SIMD_CLONE_ARG_TYPE_LINEAR_CONSTANT_STEP)
++ || (bestn->simdclone->args[i].arg_type
++ == SIMD_CLONE_ARG_TYPE_LINEAR_REF_CONSTANT_STEP))
+ {
+ STMT_VINFO_SIMD_CLONE_INFO (stmt_info).safe_grow_cleared (i * 3
+ + 1);
+@@ -3159,6 +3168,7 @@
+ vargs.safe_push (op);
+ break;
+ case SIMD_CLONE_ARG_TYPE_LINEAR_CONSTANT_STEP:
++ case SIMD_CLONE_ARG_TYPE_LINEAR_REF_CONSTANT_STEP:
+ if (j == 0)
+ {
+ gimple_seq stmts;
+@@ -3222,6 +3232,8 @@
+ vargs.safe_push (new_temp);
+ }
+ break;
++ case SIMD_CLONE_ARG_TYPE_LINEAR_VAL_CONSTANT_STEP:
++ case SIMD_CLONE_ARG_TYPE_LINEAR_UVAL_CONSTANT_STEP:
+ case SIMD_CLONE_ARG_TYPE_LINEAR_VARIABLE_STEP:
+ case SIMD_CLONE_ARG_TYPE_LINEAR_REF_VARIABLE_STEP:
+ case SIMD_CLONE_ARG_TYPE_LINEAR_VAL_VARIABLE_STEP:
+@@ -5074,11 +5086,8 @@
+ vect_get_vec_defs (op0, NULL_TREE, stmt, &vec_oprnds0, NULL,
+ slp_node, -1);
+ if (op_type == ternary_op)
+- {
+- vec_oprnds2.create (1);
+- vec_oprnds2.quick_push (vect_get_vec_def_for_operand (op2,
+- stmt));
+- }
++ vect_get_vec_defs (op2, NULL_TREE, stmt, &vec_oprnds2, NULL,
++ slp_node, -1);
+ }
+ else
+ {
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/tree-vrp.c gcc-6-20160721/gcc/tree-vrp.c
+--- gcc-6.1.0/gcc/tree-vrp.c 2016-03-30 00:55:00.000000000 +0000
++++ gcc-6-20160721/gcc/tree-vrp.c 2016-07-07 07:30:04.000000000 +0000
+@@ -2519,20 +2519,13 @@
+ min = wide_int_to_tree (expr_type, tmin);
+ max = wide_int_to_tree (expr_type, tmax);
+ }
+- else if (min_ovf == -1 && max_ovf == 1)
+- {
+- /* Underflow and overflow, drop to VR_VARYING. */
+- set_value_range_to_varying (vr);
+- return;
+- }
+- else
++ else if ((min_ovf == -1 && max_ovf == 0)
++ || (max_ovf == 1 && min_ovf == 0))
+ {
+ /* Min underflow or max overflow. The range kind
+ changes to VR_ANTI_RANGE. */
+ bool covers = false;
+ wide_int tem = tmin;
+- gcc_assert ((min_ovf == -1 && max_ovf == 0)
+- || (max_ovf == 1 && min_ovf == 0));
+ type = VR_ANTI_RANGE;
+ tmin = tmax + 1;
+ if (wi::cmp (tmin, tmax, sgn) < 0)
+@@ -2551,6 +2544,12 @@
+ min = wide_int_to_tree (expr_type, tmin);
+ max = wide_int_to_tree (expr_type, tmax);
+ }
++ else
++ {
++ /* Other underflow and/or overflow, drop to VR_VARYING. */
++ set_value_range_to_varying (vr);
++ return;
++ }
+ }
+ else
+ {
+@@ -2991,7 +2990,8 @@
+ and divisor are available. */
+ if (vr1.type == VR_RANGE
+ && !symbolic_range_p (&vr0)
+- && !symbolic_range_p (&vr1))
++ && !symbolic_range_p (&vr1)
++ && compare_values (vr1.max, zero) != 0)
+ min = int_const_binop (code, vr0.min, vr1.max);
+ else
+ min = zero;
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/tree.c gcc-6-20160721/gcc/tree.c
+--- gcc-6.1.0/gcc/tree.c 2016-04-14 16:51:16.000000000 +0000
++++ gcc-6-20160721/gcc/tree.c 2016-07-04 17:33:50.000000000 +0000
+@@ -5015,7 +5015,7 @@
+ && TREE_CODE (TREE_VALUE (attr2)) == TREE_LIST)
+ {
+ /* Handle attribute format. */
+- if (is_attribute_p ("format", TREE_PURPOSE (attr1)))
++ if (is_attribute_p ("format", get_attribute_name (attr1)))
+ {
+ attr1 = TREE_VALUE (attr1);
+ attr2 = TREE_VALUE (attr2);
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/tree.h gcc-6-20160721/gcc/tree.h
+--- gcc-6.1.0/gcc/tree.h 2016-04-08 21:09:47.000000000 +0000
++++ gcc-6-20160721/gcc/tree.h 2016-05-25 16:01:24.000000000 +0000
+@@ -4730,6 +4730,17 @@
+ && TYPE_UNSIGNED (type) == TYPE_UNSIGNED (sizetype));
+ }
+
++/* Return true if the argument is a complete type or an array
++ of unknown bound (whose type is incomplete but) whose elements
++ have complete type. */
++static inline bool
++complete_or_array_type_p (const_tree type)
++{
++ return COMPLETE_TYPE_P (type)
++ || (TREE_CODE (type) == ARRAY_TYPE
++ && COMPLETE_TYPE_P (TREE_TYPE (type)));
++}
++
+ extern tree strip_float_extensions (tree);
+ extern int really_constant_p (const_tree);
+ extern bool decl_address_invariant_p (const_tree);
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/gcc/ubsan.c gcc-6-20160721/gcc/ubsan.c
+--- gcc-6.1.0/gcc/ubsan.c 2016-01-06 10:24:15.000000000 +0000
++++ gcc-6-20160721/gcc/ubsan.c 2016-05-06 10:54:12.000000000 +0000
+@@ -302,7 +302,6 @@
+ static unsigned short
+ get_ubsan_type_info_for_type (tree type)
+ {
+- gcc_assert (TYPE_SIZE (type) && tree_fits_uhwi_p (TYPE_SIZE (type)));
+ if (TREE_CODE (type) == REAL_TYPE)
+ return tree_to_uhwi (TYPE_SIZE (type));
+ else if (INTEGRAL_TYPE_P (type))
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libatomic/ChangeLog gcc-6-20160721/libatomic/ChangeLog
+--- gcc-6.1.0/libatomic/ChangeLog 2016-04-27 08:20:21.000000000 +0000
++++ gcc-6-20160721/libatomic/ChangeLog 2016-05-10 07:03:07.000000000 +0000
+@@ -1,3 +1,13 @@
++2016-05-10 Sebastian Huber <sebastian.huber@embedded-brains.de>
++
++ Backport from mainline:
++ 2016-04-27 Sebastian Huber <sebastian.huber@embedded-brains.de>
++
++ * configure.tgt (configure_tgt_pre_target_cpu_XCFLAGS): New variable.
++ (*-*-rtems*): New supported target.
++ * config/rtems/host-config.h: New file.
++ * config/rtems/lock.c: Likewise.
++
+ 2016-04-27 Release Manager
+
+ * GCC 6.1.0 released.
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libatomic/config/rtems/host-config.h gcc-6-20160721/libatomic/config/rtems/host-config.h
+--- gcc-6.1.0/libatomic/config/rtems/host-config.h 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/libatomic/config/rtems/host-config.h 2016-05-10 07:03:07.000000000 +0000
+@@ -0,0 +1,41 @@
++/* Copyright (C) 2016 Free Software Foundation, Inc.
++ Contributed by Sebastian Huber <sebastian.huber@embedded-brains.de>.
++
++ This file is part of the GNU Atomic Library (libatomic).
++
++ Libatomic is free software; you can redistribute it and/or modify it
++ under the terms of the GNU General Public License as published by
++ the Free Software Foundation; either version 3 of the License, or
++ (at your option) any later version.
++
++ Libatomic 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.
++
++ Under Section 7 of GPL version 3, you are granted additional
++ permissions described in the GCC Runtime Library Exception, version
++ 3.1, as published by the Free Software Foundation.
++
++ You should have received a copy of the GNU General Public License and
++ a copy of the GCC Runtime Library Exception along with this program;
++ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
++ <http://www.gnu.org/licenses/>. */
++
++/* Included after all more target-specific host-config.h. */
++
++#include <machine/_libatomic.h>
++
++static inline UWORD
++protect_start (void *ptr)
++{
++ return _Libatomic_Protect_start (ptr);
++}
++
++static inline void
++protect_end (void *ptr, UWORD isr_level)
++{
++ _Libatomic_Protect_end (ptr, isr_level);
++}
++
++#include_next <host-config.h>
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libatomic/config/rtems/lock.c gcc-6-20160721/libatomic/config/rtems/lock.c
+--- gcc-6.1.0/libatomic/config/rtems/lock.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/libatomic/config/rtems/lock.c 2016-05-10 07:03:07.000000000 +0000
+@@ -0,0 +1,37 @@
++/* Copyright (C) 2016 Free Software Foundation, Inc.
++ Contributed by Sebastian Huber <sebastian.huber@embedded-brains.de>.
++
++ This file is part of the GNU Atomic Library (libatomic).
++
++ Libatomic is free software; you can redistribute it and/or modify it
++ under the terms of the GNU General Public License as published by
++ the Free Software Foundation; either version 3 of the License, or
++ (at your option) any later version.
++
++ Libatomic 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.
++
++ Under Section 7 of GPL version 3, you are granted additional
++ permissions described in the GCC Runtime Library Exception, version
++ 3.1, as published by the Free Software Foundation.
++
++ You should have received a copy of the GNU General Public License and
++ a copy of the GCC Runtime Library Exception along with this program;
++ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
++ <http://www.gnu.org/licenses/>. */
++
++#include "libatomic_i.h"
++
++void
++libat_lock_n (void *ptr, size_t n)
++{
++ _Libatomic_Lock_n (ptr, n);
++}
++
++void
++libat_unlock_n (void *ptr, size_t n)
++{
++ _Libatomic_Unlock_n (ptr, n);
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libatomic/configure.tgt gcc-6-20160721/libatomic/configure.tgt
+--- gcc-6.1.0/libatomic/configure.tgt 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/libatomic/configure.tgt 2016-05-10 07:03:07.000000000 +0000
+@@ -26,6 +26,10 @@
+ # Map the target cpu to an ARCH sub-directory. At the same time,
+ # work out any special compilation flags as necessary.
+
++# Give operating systems the opportunity to discard XCFLAGS modifications based
++# on ${target_cpu}. For example to allow proper use of multilibs.
++configure_tgt_pre_target_cpu_XCFLAGS="${XCFLAGS}"
++
+ case "${target_cpu}" in
+ alpha*)
+ # fenv.c needs this option to generate inexact exceptions.
+@@ -128,6 +132,12 @@
+ ;;
+ esac
+ ;;
++
++ *-*-rtems*)
++ XCFLAGS="${configure_tgt_pre_target_cpu_XCFLAGS}"
++ config_path="rtems"
++ ;;
++
+ *-*-elf*)
+ # ??? No target OS. We could be targeting bare-metal kernel-mode,
+ # or user-mode for some custom OS. If the target supports TAS,
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libbacktrace/ChangeLog gcc-6-20160721/libbacktrace/ChangeLog
+--- gcc-6.1.0/libbacktrace/ChangeLog 2016-04-27 08:20:21.000000000 +0000
++++ gcc-6-20160721/libbacktrace/ChangeLog 2016-05-18 14:48:40.000000000 +0000
+@@ -1,3 +1,9 @@
++2016-05-18 Uros Bizjak <ubizjak@gmail.com>
++
++ PR target/71161
++ * elf.c (phdr_callback) [__i386__]: Add
++ __attribute__((__force_align_arg_pointer__)).
++
+ 2016-04-27 Release Manager
+
+ * GCC 6.1.0 released.
+@@ -19,12 +25,13 @@
+
+ 2015-12-18 Andris Pavenis <andris.pavenis@iki.fi>
+
+- * configure.ac: Specify that DJGPP do not have mmap even when sys/mman.h exists
++ * configure.ac: Specify that DJGPP do not have mmap
++ even when sys/mman.h exists.
+ * configure: Regenerate
+
+ 2015-12-09 John David Anglin <danglin@gcc.gnu.org>
+
+- PR 68115/libfortran
++ PR libgfortran/68115
+ * configure.ac: Set libbacktrace_cv_sys_sync to no on hppa*-*-hpux*.
+ * configure: Regenerate.
+ * elf.c (backtrace_initialize): Cast __sync_bool_compare_and_swap call
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libbacktrace/elf.c gcc-6-20160721/libbacktrace/elf.c
+--- gcc-6.1.0/libbacktrace/elf.c 2016-03-02 16:32:55.000000000 +0000
++++ gcc-6-20160721/libbacktrace/elf.c 2016-05-18 14:48:40.000000000 +0000
+@@ -866,6 +866,9 @@
+ libraries. */
+
+ static int
++#ifdef __i386__
++__attribute__ ((__force_align_arg_pointer__))
++#endif
+ phdr_callback (struct dl_phdr_info *info, size_t size ATTRIBUTE_UNUSED,
+ void *pdata)
+ {
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libcilkrts/ChangeLog gcc-6-20160721/libcilkrts/ChangeLog
+--- gcc-6.1.0/libcilkrts/ChangeLog 2016-04-27 08:20:21.000000000 +0000
++++ gcc-6-20160721/libcilkrts/ChangeLog 2016-05-08 11:42:49.000000000 +0000
+@@ -1,3 +1,12 @@
++2016-05-08 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
++
++ Backport from mainline
++ 2016-04-26 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
++
++ PR target/60290
++ * Makefile.am (GENERAL_FLAGS): Add -funwind-tables.
++ * Makefile.in: Regenerate.
++
+ 2016-04-27 Release Manager
+
+ * GCC 6.1.0 released.
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libcilkrts/Makefile.am gcc-6-20160721/libcilkrts/Makefile.am
+--- gcc-6.1.0/libcilkrts/Makefile.am 2014-08-12 11:06:44.000000000 +0000
++++ gcc-6-20160721/libcilkrts/Makefile.am 2016-05-08 11:42:49.000000000 +0000
+@@ -43,6 +43,9 @@
+ # Enable Intel Cilk Plus extension
+ GENERAL_FLAGS += -fcilkplus
+
++# Always generate unwind tables
++GENERAL_FLAGS += -funwind-tables
++
+ AM_CFLAGS = $(XCFLAGS) $(GENERAL_FLAGS) -std=c99
+ AM_CPPFLAGS = $(GENERAL_FLAGS)
+ AM_LDFLAGS = $(XLDFLAGS)
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libcilkrts/Makefile.in gcc-6-20160721/libcilkrts/Makefile.in
+--- gcc-6.1.0/libcilkrts/Makefile.in 2015-05-13 11:01:24.000000000 +0000
++++ gcc-6-20160721/libcilkrts/Makefile.in 2016-05-08 11:42:49.000000000 +0000
+@@ -371,9 +371,11 @@
+ # GENERAL_FLAGS += -D_Cilk_spawn="" -D_Cilk_sync="" -D_Cilk_for=for
+
+ # Enable Intel Cilk Plus extension
++
++# Always generate unwind tables
+ GENERAL_FLAGS = -I$(top_srcdir)/include -I$(top_srcdir)/runtime \
+ -I$(top_srcdir)/runtime/config/$(config_dir) \
+- -DIN_CILK_RUNTIME=1 -fcilkplus
++ -DIN_CILK_RUNTIME=1 -fcilkplus -funwind-tables
+ AM_CFLAGS = $(XCFLAGS) $(GENERAL_FLAGS) -std=c99
+ AM_CPPFLAGS = $(GENERAL_FLAGS)
+ AM_LDFLAGS = $(XLDFLAGS)
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libffi/ChangeLog gcc-6-20160721/libffi/ChangeLog
+--- gcc-6.1.0/libffi/ChangeLog 2016-04-27 08:20:21.000000000 +0000
++++ gcc-6-20160721/libffi/ChangeLog 2016-05-23 15:00:41.000000000 +0000
+@@ -1,3 +1,10 @@
++2016-05-23 Thomas Schwinge <thomas@codesourcery.com>
++
++ Backport trunk r236594:
++
++ PR libffi/65567
++ * testsuite/lib/libffi.exp (libffi_feature_test): Fix, and simply.
++
+ 2016-04-27 Release Manager
+
+ * GCC 6.1.0 released.
+Only in gcc-6.1.0/libffi/doc: libffi.info
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libffi/testsuite/lib/libffi.exp gcc-6-20160721/libffi/testsuite/lib/libffi.exp
+--- gcc-6.1.0/libffi/testsuite/lib/libffi.exp 2015-10-27 00:39:32.000000000 +0000
++++ gcc-6-20160721/libffi/testsuite/lib/libffi.exp 2016-05-23 15:00:41.000000000 +0000
+@@ -227,20 +227,21 @@
+
+ # TEST should be a preprocessor condition. Returns true if it holds.
+ proc libffi_feature_test { test } {
+- set src "ffitest.c"
++ set src "ffitest[pid].c"
+
+ set f [open $src "w"]
+ puts $f "#include <ffi.h>"
+ puts $f $test
+- puts $f "xyzzy"
++ puts $f "/* OK */"
++ puts $f "#else"
++ puts $f "# error Failed $test"
+ puts $f "#endif"
+ close $f
+
+- set lines [libffi_target_compile $src "" "preprocess" ""]
++ set lines [libffi_target_compile $src /dev/null assembly ""]
+ file delete $src
+
+- set last [lindex [split $lines] end]
+- return [regexp -- "xyzzy" $last]
++ return [string match "" $lines]
+ }
+
+ # Utility routines.
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libgcc/ChangeLog gcc-6-20160721/libgcc/ChangeLog
+--- gcc-6.1.0/libgcc/ChangeLog 2016-04-27 08:20:21.000000000 +0000
++++ gcc-6-20160721/libgcc/ChangeLog 2016-07-14 14:03:20.000000000 +0000
+@@ -1,3 +1,25 @@
++2016-07-14 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
++
++ Backport from mainline
++ 2016-07-12 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
++
++ * config/rs6000/_divkc3.c: New.
++ * config/rs6000/_mulkc3.c: New.
++ * config/rs6000/quad-float128.h: Define TFtype; declare _mulkc3
++ and _divkc3.
++ * config/rs6000/t-float128: Add _mulkc3 and _divkc3 to
++ fp128_ppc_funcs.
++
++2016-05-17 Sebastian Huber <sebastian.huber@embedded-brains.de>
++
++ Backport from mainline
++ 2016-05-10 Joel Sherrill <joel@rtems.org>
++
++ PR libgcc/70720
++ * config.host (moxie-*-rtems*): Merge this stanza with other moxie
++ targets so the same extra_parts are built. Also have tmake_file add
++ on to its value rather than override.
++
+ 2016-04-27 Release Manager
+
+ * GCC 6.1.0 released.
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libgcc/config/rs6000/_divkc3.c gcc-6-20160721/libgcc/config/rs6000/_divkc3.c
+--- gcc-6.1.0/libgcc/config/rs6000/_divkc3.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/libgcc/config/rs6000/_divkc3.c 2016-07-14 14:03:20.000000000 +0000
+@@ -0,0 +1,64 @@
++typedef float KFtype __attribute__ ((mode (KF)));
++typedef __complex float KCtype __attribute__ ((mode (KC)));
++
++#define COPYSIGN(x,y) __builtin_copysignq (x, y)
++#define INFINITY __builtin_infq ()
++#define FABS __builtin_fabsq
++#define isnan __builtin_isnan
++#define isinf __builtin_isinf
++#define isfinite __builtin_isfinite
++
++KCtype
++__divkc3 (KFtype a, KFtype b, KFtype c, KFtype d)
++{
++ KFtype denom, ratio, x, y;
++ KCtype res;
++
++ /* ??? We can get better behavior from logarithmic scaling instead of
++ the division. But that would mean starting to link libgcc against
++ libm. We could implement something akin to ldexp/frexp as gcc builtins
++ fairly easily... */
++ if (FABS (c) < FABS (d))
++ {
++ ratio = c / d;
++ denom = (c * ratio) + d;
++ x = ((a * ratio) + b) / denom;
++ y = ((b * ratio) - a) / denom;
++ }
++ else
++ {
++ ratio = d / c;
++ denom = (d * ratio) + c;
++ x = ((b * ratio) + a) / denom;
++ y = (b - (a * ratio)) / denom;
++ }
++
++ /* Recover infinities and zeros that computed as NaN+iNaN; the only cases
++ are nonzero/zero, infinite/finite, and finite/infinite. */
++ if (isnan (x) && isnan (y))
++ {
++ if (c == 0.0 && d == 0.0 && (!isnan (a) || !isnan (b)))
++ {
++ x = COPYSIGN (INFINITY, c) * a;
++ y = COPYSIGN (INFINITY, c) * b;
++ }
++ else if ((isinf (a) || isinf (b)) && isfinite (c) && isfinite (d))
++ {
++ a = COPYSIGN (isinf (a) ? 1 : 0, a);
++ b = COPYSIGN (isinf (b) ? 1 : 0, b);
++ x = INFINITY * (a * c + b * d);
++ y = INFINITY * (b * c - a * d);
++ }
++ else if ((isinf (c) || isinf (d)) && isfinite (a) && isfinite (b))
++ {
++ c = COPYSIGN (isinf (c) ? 1 : 0, c);
++ d = COPYSIGN (isinf (d) ? 1 : 0, d);
++ x = 0.0 * (a * c + b * d);
++ y = 0.0 * (b * c - a * d);
++ }
++ }
++
++ __real__ res = x;
++ __imag__ res = y;
++ return res;
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libgcc/config/rs6000/_mulkc3.c gcc-6-20160721/libgcc/config/rs6000/_mulkc3.c
+--- gcc-6.1.0/libgcc/config/rs6000/_mulkc3.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/libgcc/config/rs6000/_mulkc3.c 2016-07-14 14:03:20.000000000 +0000
+@@ -0,0 +1,69 @@
++typedef float KFtype __attribute__ ((mode (KF)));
++typedef __complex float KCtype __attribute__ ((mode (KC)));
++
++#define COPYSIGN(x,y) __builtin_copysignq (x, y)
++#define INFINITY __builtin_infq ()
++#define isnan __builtin_isnan
++#define isinf __builtin_isinf
++
++KCtype
++__mulkc3 (KFtype a, KFtype b, KFtype c, KFtype d)
++{
++ KFtype ac, bd, ad, bc, x, y;
++ KCtype res;
++
++ ac = a * c;
++ bd = b * d;
++ ad = a * d;
++ bc = b * c;
++
++ x = ac - bd;
++ y = ad + bc;
++
++ if (isnan (x) && isnan (y))
++ {
++ /* Recover infinities that computed as NaN + iNaN. */
++ _Bool recalc = 0;
++ if (isinf (a) || isinf (b))
++ {
++ /* z is infinite. "Box" the infinity and change NaNs in
++ the other factor to 0. */
++ a = COPYSIGN (isinf (a) ? 1 : 0, a);
++ b = COPYSIGN (isinf (b) ? 1 : 0, b);
++ if (isnan (c)) c = COPYSIGN (0, c);
++ if (isnan (d)) d = COPYSIGN (0, d);
++ recalc = 1;
++ }
++ if (isinf (c) || isinf (d))
++ {
++ /* w is infinite. "Box" the infinity and change NaNs in
++ the other factor to 0. */
++ c = COPYSIGN (isinf (c) ? 1 : 0, c);
++ d = COPYSIGN (isinf (d) ? 1 : 0, d);
++ if (isnan (a)) a = COPYSIGN (0, a);
++ if (isnan (b)) b = COPYSIGN (0, b);
++ recalc = 1;
++ }
++ if (!recalc
++ && (isinf (ac) || isinf (bd)
++ || isinf (ad) || isinf (bc)))
++ {
++ /* Recover infinities from overflow by changing NaNs to 0. */
++ if (isnan (a)) a = COPYSIGN (0, a);
++ if (isnan (b)) b = COPYSIGN (0, b);
++ if (isnan (c)) c = COPYSIGN (0, c);
++ if (isnan (d)) d = COPYSIGN (0, d);
++ recalc = 1;
++ }
++ if (recalc)
++ {
++ x = INFINITY * (a * c - b * d);
++ y = INFINITY * (a * d + b * c);
++ }
++ }
++
++ __real__ res = x;
++ __imag__ res = y;
++ return res;
++}
++
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libgcc/config/rs6000/quad-float128.h gcc-6-20160721/libgcc/config/rs6000/quad-float128.h
+--- gcc-6.1.0/libgcc/config/rs6000/quad-float128.h 2016-01-21 17:52:33.000000000 +0000
++++ gcc-6-20160721/libgcc/config/rs6000/quad-float128.h 2016-07-14 14:03:20.000000000 +0000
+@@ -33,6 +33,10 @@
+ This define forces it to use KFmode (aka, ieee 128-bit floating point). */
+ #define TF KF
+
++/* We also need TCtype to represent complex ieee 128-bit float for
++ __mulkc3 and __divkc3. */
++typedef __complex float TCtype __attribute__ ((mode (KC)));
++
+ /* Force the use of the VSX instruction set. */
+ #if defined(_ARCH_PPC) && (!defined(__VSX__) || !defined(__FLOAT128__))
+ #pragma GCC target ("vsx,float128")
+@@ -154,6 +158,10 @@
+ extern IBM128_TYPE __extendkftf2 (TFtype);
+ extern TFtype __trunctfkf2 (IBM128_TYPE);
+
++/* Complex __float128 built on __float128 interfaces. */
++extern TCtype __mulkc3 (TFtype, TFtype, TFtype, TFtype);
++extern TCtype __divkc3 (TFtype, TFtype, TFtype, TFtype);
++
+ /* Implementation of conversions between __ibm128 and __float128, to allow the
+ same code to be used on systems with IEEE 128-bit emulation and with IEEE
+ 128-bit hardware support. */
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libgcc/config/rs6000/t-float128 gcc-6-20160721/libgcc/config/rs6000/t-float128
+--- gcc-6.1.0/libgcc/config/rs6000/t-float128 2016-01-21 17:52:33.000000000 +0000
++++ gcc-6-20160721/libgcc/config/rs6000/t-float128 2016-07-14 14:03:20.000000000 +0000
+@@ -25,7 +25,7 @@
+ # New functions for software emulation
+ fp128_ppc_funcs = floattikf floatuntikf fixkfti fixunskfti \
+ extendkftf2-sw trunctfkf2-sw \
+- sfp-exceptions
++ sfp-exceptions _mulkc3 _divkc3
+
+ fp128_ppc_src = $(addprefix $(srcdir)/config/rs6000/,$(addsuffix \
+ .c,$(fp128_ppc_funcs)))
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libgcc/config.host gcc-6-20160721/libgcc/config.host
+--- gcc-6.1.0/libgcc/config.host 2016-02-26 20:02:28.000000000 +0000
++++ gcc-6-20160721/libgcc/config.host 2016-05-17 06:15:52.000000000 +0000
+@@ -931,14 +931,9 @@
+ mn10300-*-*)
+ tmake_file=t-fdpbit
+ ;;
+-moxie-*-elf | moxie-*-moxiebox* | moxie-*-uclinux*)
+- tmake_file="moxie/t-moxie t-softfp-sfdf t-softfp-excl t-softfp"
+- extra_parts="$extra_parts crti.o crtn.o crtbegin.o crtend.o"
+- ;;
+-moxie-*-rtems*)
++moxie-*-elf | moxie-*-moxiebox* | moxie-*-uclinux* | moxie-*-rtems*)
+ tmake_file="$tmake_file moxie/t-moxie t-softfp-sfdf t-softfp-excl t-softfp"
+- # Don't use default.
+- extra_parts=
++ extra_parts="$extra_parts crti.o crtn.o crtbegin.o crtend.o"
+ ;;
+ msp430*-*-elf)
+ tmake_file="$tm_file t-crtstuff t-fdpbit msp430/t-msp430"
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libgomp/ChangeLog gcc-6-20160721/libgomp/ChangeLog
+--- gcc-6.1.0/libgomp/ChangeLog 2016-04-27 08:20:21.000000000 +0000
++++ gcc-6-20160721/libgomp/ChangeLog 2016-07-02 10:24:41.000000000 +0000
+@@ -1,3 +1,65 @@
++2016-07-02 Jakub Jelinek <jakub@redhat.com>
++
++ Backported from mainline
++ 2016-07-01 Jakub Jelinek <jakub@redhat.com>
++
++ PR fortran/71717
++ * testsuite/libgomp.fortran/associate3.f90: New test.
++
++2016-06-21 Jakub Jelinek <jakub@redhat.com>
++
++ Backported from mainline
++ 2016-06-17 Jakub Jelinek <jakub@redhat.com>
++
++ * testsuite/libgomp.c++/target-21.C: New test.
++
++ 2016-06-16 Jakub Jelinek <jakub@redhat.com>
++
++ * testsuite/libgomp.c++/target-20.C: New test.
++
++2016-06-10 Thomas Schwinge <thomas@codesourcery.com>
++
++ PR middle-end/71373
++ Backport from trunk r237291:
++ 2016-06-10 Thomas Schwinge <thomas@codesourcery.com>
++ Cesar Philippidis <cesar@codesourcery.com>
++
++ * libgomp.oacc-c/nested-function-1.c: New file.
++ * libgomp.oacc-c/nested-function-2.c: Likewise.
++ * libgomp.oacc-fortran/nested-function-1.f90: Likewise.
++ * libgomp.oacc-fortran/nested-function-2.f90: Likewise.
++ * libgomp.oacc-fortran/nested-function-3.f90: Likewise.
++
++ PR c/71381
++ Backport from trunk r237290:
++ * testsuite/libgomp.oacc-c-c++-common/cache-1.c: #include
++ "../../../gcc/testsuite/c-c++-common/goacc/cache-1.c".
++ * testsuite/libgomp.oacc-fortran/cache-1.f95: New file.
++
++2016-05-23 Martin Jambor <mjambor@suse.cz>
++
++ * testsuite/libgomp.hsa.c/switch-sbr-2.c: New test.
++
++2016-05-16 Martin Jambor <mjambor@suse.cz>
++
++ * testsuite/libgomp.hsa.c/complex-align-2.c: New test.
++
++2016-04-29 Cesar Philippidis <cesar@codesourcery.com>
++
++ PR middle-end/70626
++ * testsuite/libgomp.oacc-c++/template-reduction.C: Adjust test.
++ * testsuite/libgomp.oacc-c-c++-common/combined-reduction.c: New test.
++ * testsuite/libgomp.oacc-fortran/combined-reduction.f90: New test.
++
++2016-04-27 Jakub Jelinek <jakub@redhat.com>
++
++ Backported from mainline
++ 2016-04-19 Jakub Jelinek <jakub@redhat.com>
++
++ PR middle-end/70680
++ * testsuite/libgomp.c/pr70680-1.c: New test.
++ * testsuite/libgomp.c/pr70680-2.c: New test.
++
+ 2016-04-27 Release Manager
+
+ * GCC 6.1.0 released.
+Only in gcc-6.1.0/libgomp: libgomp.info
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libgomp/testsuite/libgomp.c/pr70680-1.c gcc-6-20160721/libgomp/testsuite/libgomp.c/pr70680-1.c
+--- gcc-6.1.0/libgomp/testsuite/libgomp.c/pr70680-1.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/libgomp/testsuite/libgomp.c/pr70680-1.c 2016-04-27 12:22:47.000000000 +0000
+@@ -0,0 +1,75 @@
++/* PR middle-end/70680 */
++
++int v;
++
++void
++f1 (void)
++{
++ int i = 0;
++#pragma omp task default(shared) if(0)
++ {
++#pragma omp simd
++ for (i = 0; i < 100; i++)
++ ;
++ v = i;
++ }
++ if (i != 100)
++ __builtin_abort ();
++}
++
++void
++f2 (void)
++{
++ int i = 0;
++#pragma omp task default(shared) if(0)
++ {
++#pragma omp simd
++ for (i = 0; i < 100; i++)
++ ;
++ }
++ if (i != 100)
++ __builtin_abort ();
++}
++
++void
++f3 (void)
++{
++ int i = 0;
++#pragma omp task default(shared) if(0)
++ {
++#pragma omp simd linear(i: 1)
++ for (i = 0; i < 100; i++)
++ ;
++ v = i;
++ }
++ if (i != 100)
++ __builtin_abort ();
++}
++
++void
++f4 (void)
++{
++ int i = 0;
++#pragma omp task default(shared) if(0)
++ {
++#pragma omp simd linear(i: 1)
++ for (i = 0; i < 100; i++)
++ ;
++ }
++ if (i != 100)
++ __builtin_abort ();
++}
++
++int
++main ()
++{
++ f1 ();
++ if (v++ != 100)
++ __builtin_abort ();
++ f2 ();
++ f3 ();
++ if (v++ != 100)
++ __builtin_abort ();
++ f4 ();
++ return 0;
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libgomp/testsuite/libgomp.c/pr70680-2.c gcc-6-20160721/libgomp/testsuite/libgomp.c/pr70680-2.c
+--- gcc-6.1.0/libgomp/testsuite/libgomp.c/pr70680-2.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/libgomp/testsuite/libgomp.c/pr70680-2.c 2016-04-27 12:22:47.000000000 +0000
+@@ -0,0 +1,79 @@
++/* PR middle-end/70680 */
++
++int v;
++
++void
++f1 (void)
++{
++ int i = 0, j = 0;
++#pragma omp task default(shared) if(0)
++ {
++#pragma omp simd collapse(2)
++ for (i = 0; i < 10; i++)
++ for (j = 0; j < 10; j++)
++ ;
++ v = i + j;
++ }
++ if (i != 10 || j != 10)
++ __builtin_abort ();
++}
++
++void
++f2 (void)
++{
++ int i = 0, j = 0;
++#pragma omp task default(shared) if(0)
++ {
++#pragma omp simd collapse(2)
++ for (i = 0; i < 10; i++)
++ for (j = 0; j < 10; j++)
++ ;
++ }
++ if (i != 10 || j != 10)
++ __builtin_abort ();
++}
++
++void
++f3 (void)
++{
++ int i = 0, j = 0;
++#pragma omp task default(shared) if(0)
++ {
++#pragma omp simd collapse(2) lastprivate (i, j)
++ for (i = 0; i < 10; i++)
++ for (j = 0; j < 10; j++)
++ ;
++ v = i + j;
++ }
++ if (i != 10 || j != 10)
++ __builtin_abort ();
++}
++
++void
++f4 (void)
++{
++ int i = 0, j = 0;
++#pragma omp task default(shared) if(0)
++ {
++#pragma omp simd collapse(2) lastprivate (i, j)
++ for (i = 0; i < 10; i++)
++ for (j = 0; j < 10; j++)
++ ;
++ }
++ if (i != 10 || j != 10)
++ __builtin_abort ();
++}
++
++int
++main ()
++{
++ f1 ();
++ if (v++ != 20)
++ __builtin_abort ();
++ f2 ();
++ f3 ();
++ if (v++ != 20)
++ __builtin_abort ();
++ f4 ();
++ return 0;
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libgomp/testsuite/libgomp.c++/target-20.C gcc-6-20160721/libgomp/testsuite/libgomp.c++/target-20.C
+--- gcc-6.1.0/libgomp/testsuite/libgomp.c++/target-20.C 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/libgomp/testsuite/libgomp.c++/target-20.C 2016-06-21 07:09:57.000000000 +0000
+@@ -0,0 +1,80 @@
++extern "C" void abort ();
++struct S { int a, b, c, d; };
++
++void
++foo (S &s)
++{
++ int err;
++ #pragma omp target map (s.b, s.d) map (from: err)
++ {
++ err = s.b != 21 || s.d != 24;
++ s.b++; s.d++;
++ }
++ if (err || s.b != 22 || s.d != 25)
++ abort ();
++ #pragma omp target data map (s.b, s.d)
++ {
++ #pragma omp target map (alloc: s.b, s.d) map (from: err)
++ {
++ err = s.b != 22 || s.d != 25;
++ s.b++; s.d++;
++ }
++ }
++ if (err || s.b != 23 || s.d != 26)
++ abort ();
++ #pragma omp target data map (s)
++ {
++ #pragma omp target map (alloc: s.b, s.d) map (from: err)
++ {
++ err = s.b != 23 || s.d != 26;
++ s.b++; s.d++;
++ }
++ }
++ if (err || s.b != 24 || s.d != 27)
++ abort ();
++}
++
++template <typename T, typename U>
++void
++bar (S &s, T &t, U u)
++{
++ int err;
++ #pragma omp target map (s.b, s.d, t.b, t.d, u.b, u.d) map (from: err)
++ {
++ err = s.b != 21 || s.d != 24 || t.b != 73 || t.d != 82 || u.b != 31 || u.d != 37;
++ s.b++; s.d++; t.b++; t.d++; u.b++; u.d++;
++ }
++ if (err || s.b != 22 || s.d != 25 || t.b != 74 || t.d != 83 || u.b != 32 || u.d != 38)
++ abort ();
++ #pragma omp target data map (s.b, s.d, t.b, t.d, u.b, u.d)
++ {
++ #pragma omp target map (alloc: s.b, s.d, t.b, t.d, u.b, u.d) map (from: err)
++ {
++ err = s.b != 22 || s.d != 25 || t.b != 74 || t.d != 83 || u.b != 32 || u.d != 38;
++ s.b++; s.d++; t.b++; t.d++; u.b++; u.d++;
++ }
++ }
++ if (err || s.b != 23 || s.d != 26 || t.b != 75 || t.d != 84 || u.b != 33 || u.d != 39)
++ abort ();
++ #pragma omp target data map (s, t, u)
++ {
++ #pragma omp target map (alloc: s.b, s.d, t.b, t.d, u.b, u.d) map (from: err)
++ {
++ err = s.b != 23 || s.d != 26 || t.b != 75 || t.d != 84 || u.b != 33 || u.d != 39;
++ s.b++; s.d++; t.b++; t.d++; u.b++; u.d++;
++ }
++ }
++ if (err || s.b != 24 || s.d != 27 || t.b != 76 || t.d != 85 || u.b != 34 || u.d != 40)
++ abort ();
++}
++
++int
++main ()
++{
++ S s = { 1, 21, 2, 24 };
++ foo (s);
++ S s2 = { 3, 21, 4, 24 };
++ S t = { 5, 73, 6, 82 };
++ S u = { 7, 31, 8, 37 };
++ bar <S, S &> (s2, t, u);
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libgomp/testsuite/libgomp.c++/target-21.C gcc-6-20160721/libgomp/testsuite/libgomp.c++/target-21.C
+--- gcc-6.1.0/libgomp/testsuite/libgomp.c++/target-21.C 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/libgomp/testsuite/libgomp.c++/target-21.C 2016-06-21 07:11:10.000000000 +0000
+@@ -0,0 +1,173 @@
++extern "C" void abort ();
++struct T { char t[270]; };
++struct S { int (&x)[10]; int *&y; T t; int &z; S (); ~S (); };
++
++template <int N>
++void
++foo (S s)
++{
++ int err;
++ #pragma omp target map (s.x[0:N], s.y[0:N]) map (s.t.t[16:3]) map (from: err)
++ {
++ err = s.x[2] != 28 || s.y[2] != 37 || s.t.t[17] != 81;
++ s.x[2]++;
++ s.y[2]++;
++ s.t.t[17]++;
++ }
++ if (err || s.x[2] != 29 || s.y[2] != 38 || s.t.t[17] != 82)
++ abort ();
++}
++
++template <int N>
++void
++bar (S s)
++{
++ int err;
++ #pragma omp target map (s.x, s.z)map(from:err)
++ {
++ err = s.x[2] != 29 || s.z != 6;
++ s.x[2]++;
++ s.z++;
++ }
++ if (err || s.x[2] != 30 || s.z != 7)
++ abort ();
++}
++
++template <int N>
++void
++foo2 (S &s)
++{
++ int err;
++ #pragma omp target map (s.x[N:10], s.y[N:10]) map (from: err) map (s.t.t[N+16:N+3])
++ {
++ err = s.x[2] != 30 || s.y[2] != 38 || s.t.t[17] != 81;
++ s.x[2]++;
++ s.y[2]++;
++ s.t.t[17]++;
++ }
++ if (err || s.x[2] != 31 || s.y[2] != 39 || s.t.t[17] != 82)
++ abort ();
++}
++
++template <int N>
++void
++bar2 (S &s)
++{
++ int err;
++ #pragma omp target map (s.x, s.z)map(from:err)
++ {
++ err = s.x[2] != 31 || s.z != 7;
++ s.x[2]++;
++ s.z++;
++ }
++ if (err || s.x[2] != 32 || s.z != 8)
++ abort ();
++}
++
++template <typename U>
++void
++foo3 (U s)
++{
++ int err;
++ #pragma omp target map (s.x[0:10], s.y[0:10]) map (from: err) map (s.t.t[16:3])
++ {
++ err = s.x[2] != 32 || s.y[2] != 39 || s.t.t[17] != 82;
++ s.x[2]++;
++ s.y[2]++;
++ s.t.t[17]++;
++ }
++ if (err || s.x[2] != 33 || s.y[2] != 40 || s.t.t[17] != 83)
++ abort ();
++}
++
++template <typename U>
++void
++bar3 (U s)
++{
++ int err;
++ #pragma omp target map (s.x, s.z)map(from:err)
++ {
++ err = s.x[2] != 33 || s.z != 8;
++ s.x[2]++;
++ s.z++;
++ }
++ if (err || s.x[2] != 34 || s.z != 9)
++ abort ();
++}
++
++template <typename U>
++void
++foo4 (U &s)
++{
++ int err;
++ #pragma omp target map (s.x[0:10], s.y[0:10]) map (from: err) map (s.t.t[16:3])
++ {
++ err = s.x[2] != 34 || s.y[2] != 40 || s.t.t[17] != 82;
++ s.x[2]++;
++ s.y[2]++;
++ s.t.t[17]++;
++ }
++ if (err || s.x[2] != 35 || s.y[2] != 41 || s.t.t[17] != 83)
++ abort ();
++}
++
++template <typename U>
++void
++bar4 (U &s)
++{
++ int err;
++ #pragma omp target map (s.x, s.z)map(from:err)
++ {
++ err = s.x[2] != 35 || s.z != 9;
++ s.x[2]++;
++ s.z++;
++ }
++ if (err || s.x[2] != 36 || s.z != 10)
++ abort ();
++}
++
++int xt[10] = { 1, 2, 28, 3, 4, 5, 6, 7, 8, 9 };
++int yt[10] = { 1, 2, 37, 3, 4, 5, 6, 7, 8, 9 };
++int *yp = yt;
++int zt = 6;
++
++S::S () : x (xt), y (yp), z (zt)
++{
++}
++
++S::~S ()
++{
++}
++
++int
++main ()
++{
++ S s;
++ s.t.t[16] = 5;
++ s.t.t[17] = 81;
++ s.t.t[18] = 9;
++ foo <10> (s);
++ if (s.t.t[17] != 81)
++ abort ();
++ bar <7> (s);
++ foo2 <0> (s);
++ if (s.t.t[17] != 82)
++ abort ();
++ bar2 <21> (s);
++ foo3 <S> (s);
++ if (s.t.t[17] != 82)
++ abort ();
++ bar3 <S> (s);
++ foo4 <S> (s);
++ if (s.t.t[17] != 83)
++ abort ();
++ bar4 <S> (s);
++ s.x[2] -= 4;
++ s.y[2] -= 2;
++ s.z -= 2;
++ s.t.t[17]--;
++ foo3 <S &> (s);
++ if (s.t.t[17] != 83)
++ abort ();
++ bar3 <S &> (s);
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libgomp/testsuite/libgomp.fortran/associate3.f90 gcc-6-20160721/libgomp/testsuite/libgomp.fortran/associate3.f90
+--- gcc-6.1.0/libgomp/testsuite/libgomp.fortran/associate3.f90 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/libgomp/testsuite/libgomp.fortran/associate3.f90 2016-07-02 10:24:41.000000000 +0000
+@@ -0,0 +1,20 @@
++! PR fortran/71717
++! { dg-do run }
++
++ type t
++ real, allocatable :: f(:)
++ end type
++ type (t) :: v
++ integer :: i, j
++ allocate (v%f(4))
++ v%f = 19.
++ i = 5
++ associate (u => v, k => i)
++ !$omp parallel do
++ do j = 1, 4
++ u%f(j) = 21.
++ if (j.eq.1) k = 7
++ end do
++ end associate
++ if (any (v%f(:).ne.21.) .or. i.ne.7) call abort
++end
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libgomp/testsuite/libgomp.hsa.c/complex-align-2.c gcc-6-20160721/libgomp/testsuite/libgomp.hsa.c/complex-align-2.c
+--- gcc-6.1.0/libgomp/testsuite/libgomp.hsa.c/complex-align-2.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/libgomp/testsuite/libgomp.hsa.c/complex-align-2.c 2016-05-16 17:52:28.000000000 +0000
+@@ -0,0 +1,27 @@
++#pragma omp declare target
++ _Complex int *g;
++#pragma omp end declare target
++
++
++
++_Complex float f(void);
++
++int
++main ()
++{
++ _Complex int y;
++#pragma omp target map(from:y)
++ {
++ _Complex int x;
++ g = &x;
++ __imag__ x = 1;
++ __real__ x = 2;
++ y = x;
++ }
++
++ if ((__imag__ y != 1)
++ || (__real__ y != 2))
++ __builtin_abort ();
++ return 0;
++}
++
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libgomp/testsuite/libgomp.hsa.c/switch-sbr-2.c gcc-6-20160721/libgomp/testsuite/libgomp.hsa.c/switch-sbr-2.c
+--- gcc-6.1.0/libgomp/testsuite/libgomp.hsa.c/switch-sbr-2.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/libgomp/testsuite/libgomp.hsa.c/switch-sbr-2.c 2016-05-23 11:54:52.000000000 +0000
+@@ -0,0 +1,59 @@
++/* { dg-additional-options "-fno-tree-switch-conversion" } */
++
++#pragma omp declare target
++int
++foo (unsigned a)
++{
++ switch (a)
++ {
++ case 1 ... 5:
++ return 1;
++ case 9 ... 11:
++ return a + 3;
++ case 12 ... 13:
++ return a + 3;
++ default:
++ return 44;
++ }
++}
++#pragma omp end declare target
++
++#define s 100
++
++void __attribute__((noinline, noclone))
++verify(int *a)
++{
++ if (a[0] != 44)
++ __builtin_abort ();
++
++ for (int i = 1; i <= 5; i++)
++ if (a[i] != 1)
++ __builtin_abort ();
++
++ for (int i = 6; i <= 8; i++)
++ if (a[i] != 44)
++ __builtin_abort ();
++
++ for (int i = 9; i <= 13; i++)
++ if (a[i] != i + 3)
++ __builtin_abort ();
++
++ for (int i = 14; i < s; i++)
++ if (a[i] != 44)
++ __builtin_abort ();
++}
++
++int main(int argc)
++{
++ int array[s];
++#pragma omp target
++ {
++ for (int i = 0; i < s; i++)
++ {
++ int v = foo (i);
++ array[i] = v;
++ }
++ }
++ verify (array);
++ return 0;
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libgomp/testsuite/libgomp.oacc-c/nested-function-1.c gcc-6-20160721/libgomp/testsuite/libgomp.oacc-c/nested-function-1.c
+--- gcc-6.1.0/libgomp/testsuite/libgomp.oacc-c/nested-function-1.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/libgomp/testsuite/libgomp.oacc-c/nested-function-1.c 2016-06-10 09:46:18.000000000 +0000
+@@ -0,0 +1,52 @@
++/* Exercise nested function decomposition, gcc/tree-nested.c. */
++
++int
++main (void)
++{
++ void test1 ()
++ {
++ int i, j, k;
++ int a[4][7][8];
++
++ __builtin_memset (a, 0, sizeof (a));
++
++#pragma acc parallel
++#pragma acc loop collapse(4 - 1)
++ for (i = 1; i <= 3; i++)
++ for (j = 4; j <= 6; j++)
++ for (k = 5; k <= 7; k++)
++ a[i][j][k] = i + j + k;
++
++ for (i = 1; i <= 3; i++)
++ for (j = 4; j <= 6; j++)
++ for (k = 5; k <= 7; k++)
++ if (a[i][j][k] != i + j + k)
++ __builtin_abort();
++ }
++
++ void test2 ()
++ {
++ int i, j, k;
++ int a[4][4][4];
++
++ __builtin_memset (a, 0, sizeof (a));
++
++#pragma acc parallel
++#pragma acc loop collapse(3)
++ for (i = 1; i <= 3; i++)
++ for (j = 1; j <= 3; j++)
++ for (k = 1; k <= 3; k++)
++ a[i][j][k] = 1;
++
++ for (i = 1; i <= 3; i++)
++ for (j = 1; j <= 3; j++)
++ for (k = 1; k <= 3; k++)
++ if (a[i][j][k] != 1)
++ __builtin_abort ();
++ }
++
++ test1 ();
++ test2 ();
++
++ return 0;
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libgomp/testsuite/libgomp.oacc-c/nested-function-2.c gcc-6-20160721/libgomp/testsuite/libgomp.oacc-c/nested-function-2.c
+--- gcc-6.1.0/libgomp/testsuite/libgomp.oacc-c/nested-function-2.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/libgomp/testsuite/libgomp.oacc-c/nested-function-2.c 2016-06-10 09:46:18.000000000 +0000
+@@ -0,0 +1,155 @@
++/* Exercise nested function decomposition, gcc/tree-nested.c. */
++
++int
++main (void)
++{
++ int p1 = 2, p2 = 6, p3 = 0, p4 = 4, p5 = 13, p6 = 18, p7 = 1, p8 = 1, p9 = 1;
++
++ void test1 ()
++ {
++ int i, j, k;
++ int a[4][4][4];
++
++ __builtin_memset (a, '\0', sizeof (a));
++
++#pragma acc parallel
++#pragma acc loop collapse(3)
++ for (i = 1; i <= 3; i++)
++ for (j = 1; j <= 3; j++)
++ for (k = 2; k <= 3; k++)
++ a[i][j][k] = 1;
++
++ for (i = 1; i <= 3; i++)
++ for (j = 1; j <= 3; j++)
++ for (k = 2; k <= 3; k++)
++ if (a[i][j][k] != 1)
++ __builtin_abort();
++ }
++
++ void test2 (int v1, int v2, int v3, int v4, int v5, int v6)
++ {
++ int i, j, k, l = 0, r = 0;
++ int a[7][5][19];
++ int b[7][5][19];
++
++ __builtin_memset (a, '\0', sizeof (a));
++ __builtin_memset (b, '\0', sizeof (b));
++
++#pragma acc parallel reduction (||:l)
++#pragma acc loop reduction (||:l) collapse(3)
++ for (i = v1; i <= v2; i++)
++ for (j = v3; j <= v4; j++)
++ for (k = v5; k <= v6; k++)
++ {
++ l = l || i < 2 || i > 6 || j < 0 || j > 4 || k < 13 || k > 18;
++ if (!l)
++ a[i][j][k] += 1;
++ }
++
++ for (i = v1; i <= v2; i++)
++ for (j = v3; j <= v4; j++)
++ for (k = v5; k <= v6; k++)
++ {
++ r = r || i < 2 || i > 6 || j < 0 || j > 4 || k < 13 || k > 18;
++ if (!r)
++ b[i][j][k] += 1;
++ }
++
++ if (l != r)
++ __builtin_abort ();
++
++ for (i = v1; i <= v2; i++)
++ for (j = v3; j <= v4; j++)
++ for (k = v5; k <= v6; k++)
++ if (b[i][j][k] != a[i][j][k])
++ __builtin_abort ();
++ }
++
++ void test3 (int v1, int v2, int v3, int v4, int v5, int v6, int v7, int v8,
++ int v9)
++ {
++ int i, j, k, l = 0, r = 0;
++ int a[7][5][19];
++ int b[7][5][19];
++
++ __builtin_memset (a, '\0', sizeof (a));
++ __builtin_memset (b, '\0', sizeof (b));
++
++#pragma acc parallel reduction (||:l)
++#pragma acc loop reduction (||:l) collapse(3)
++ for (i = v1; i <= v2; i += v7)
++ for (j = v3; j <= v4; j += v8)
++ for (k = v5; k <= v6; k += v9)
++ {
++ l = l || i < 2 || i > 6 || j < 0 || j > 4 || k < 13 || k > 18;
++ if (!l)
++ a[i][j][k] += 1;
++ }
++
++ for (i = v1; i <= v2; i += v7)
++ for (j = v3; j <= v4; j += v8)
++ for (k = v5; k <= v6; k += v9)
++ {
++ r = r || i < 2 || i > 6 || j < 0 || j > 4 || k < 13 || k > 18;
++ if (!r)
++ b[i][j][k] += 1;
++ }
++
++ if (l != r)
++ __builtin_abort ();
++
++ for (i = v1; i <= v2; i++)
++ for (j = v3; j <= v4; j++)
++ for (k = v5; k <= v6; k++)
++ if (b[i][j][k] != a[i][j][k])
++ __builtin_abort ();
++ }
++
++ void test4 ()
++ {
++ int i, j, k, l = 0, r = 0;
++ int a[7][5][19];
++ int b[7][5][19];
++ int v1 = p1, v2 = p2, v3 = p3, v4 = p4, v5 = p5, v6 = p6, v7 = p7, v8 = p8,
++ v9 = p9;
++
++ __builtin_memset (a, '\0', sizeof (a));
++ __builtin_memset (b, '\0', sizeof (b));
++
++#pragma acc parallel reduction (||:l)
++#pragma acc loop reduction (||:l) collapse(3)
++ for (i = v1; i <= v2; i += v7)
++ for (j = v3; j <= v4; j += v8)
++ for (k = v5; k <= v6; k += v9)
++ {
++ l = l || i < 2 || i > 6 || j < 0 || j > 4 || k < 13 || k > 18;
++ if (!l)
++ a[i][j][k] += 1;
++ }
++
++ for (i = v1; i <= v2; i += v7)
++ for (j = v3; j <= v4; j += v8)
++ for (k = v5; k <= v6; k += v9)
++ {
++ r = r || i < 2 || i > 6 || j < 0 || j > 4 || k < 13 || k > 18;
++ if (!r)
++ b[i][j][k] += 1;
++ }
++
++ if (l != r)
++ __builtin_abort ();
++
++ for (i = v1; i <= v2; i++)
++ for (j = v3; j <= v4; j++)
++ for (k = v5; k <= v6; k++)
++ if (b[i][j][k] != a[i][j][k])
++ __builtin_abort ();
++ }
++
++ test1 ();
++ test2 (p1, p2, p3, p4, p5, p6);
++ test3 (p1, p2, p3, p4, p5, p6, p7, p8, p9);
++ test4 ();
++
++ return 0;
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libgomp/testsuite/libgomp.oacc-c++/template-reduction.C gcc-6-20160721/libgomp/testsuite/libgomp.oacc-c++/template-reduction.C
+--- gcc-6.1.0/libgomp/testsuite/libgomp.oacc-c++/template-reduction.C 2016-03-30 15:08:47.000000000 +0000
++++ gcc-6-20160721/libgomp/testsuite/libgomp.oacc-c++/template-reduction.C 2016-04-29 17:37:55.000000000 +0000
+@@ -7,7 +7,7 @@
+ {
+ T s = 0;
+
+-#pragma acc parallel loop num_gangs (10) gang reduction (+:s) copy (s, array[0:n])
++#pragma acc parallel loop num_gangs (10) gang reduction (+:s) copy (array[0:n])
+ for (int i = 0; i < n; i++)
+ s += array[i];
+
+@@ -25,7 +25,7 @@
+ for (int i = 0; i < n; i++)
+ array[i] = i+1;
+
+-#pragma acc parallel loop num_gangs (10) gang reduction (+:s) copy (s)
++#pragma acc parallel loop num_gangs (10) gang reduction (+:s)
+ for (int i = 0; i < n; i++)
+ s += array[i];
+
+@@ -43,7 +43,7 @@
+ for (int i = 0; i < n; i++)
+ array[i] = i+1;
+
+-#pragma acc parallel loop num_gangs (10) gang reduction (+:s) present (array[0:n]) copy (s) async wait (1)
++#pragma acc parallel loop num_gangs (10) gang reduction (+:s) present (array[0:n]) async wait (1)
+ for (int i = 0; i < n; i++)
+ s += array[i];
+
+@@ -59,7 +59,7 @@
+ {
+ T s = 0;
+
+-#pragma acc parallel loop num_gangs (10) gang reduction (+:s) copy(s) firstprivate (c) async wait (1)
++#pragma acc parallel loop num_gangs (10) gang reduction (+:s) firstprivate (c) async wait (1)
+ for (int i = 0; i < n; i++)
+ s += i+c;
+
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libgomp/testsuite/libgomp.oacc-c-c++-common/cache-1.c gcc-6-20160721/libgomp/testsuite/libgomp.oacc-c-c++-common/cache-1.c
+--- gcc-6.1.0/libgomp/testsuite/libgomp.oacc-c-c++-common/cache-1.c 2015-01-15 20:11:12.000000000 +0000
++++ gcc-6-20160721/libgomp/testsuite/libgomp.oacc-c-c++-common/cache-1.c 2016-06-10 09:46:04.000000000 +0000
+@@ -1,48 +1,3 @@
+-int
+-main (int argc, char **argv)
+-{
+-#define N 2
+- int a[N], b[N];
+- int i;
++/* OpenACC cache directive. */
+
+- for (i = 0; i < N; i++)
+- {
+- a[i] = 3;
+- b[i] = 0;
+- }
+-
+-#pragma acc parallel copyin (a[0:N]) copyout (b[0:N])
+-{
+- int ii;
+-
+- for (ii = 0; ii < N; ii++)
+- {
+- const int idx = ii;
+- int n = 1;
+- const int len = n;
+-
+-#pragma acc cache (a[0:N])
+-
+-#pragma acc cache (a[0:N], b[0:N])
+-
+-#pragma acc cache (a[0])
+-
+-#pragma acc cache (a[0], a[1], b[0:N])
+-
+-#pragma acc cache (a[idx])
+-
+-#pragma acc cache (a[idx:len])
+-
+- b[ii] = a[ii];
+- }
+-}
+-
+-
+- for (i = 0; i < N; i++)
+- {
+- if (a[i] != b[i])
+- __builtin_abort ();
+- }
+-
+- return 0;
+-}
++#include "../../../gcc/testsuite/c-c++-common/goacc/cache-1.c"
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libgomp/testsuite/libgomp.oacc-c-c++-common/combined-reduction.c gcc-6-20160721/libgomp/testsuite/libgomp.oacc-c-c++-common/combined-reduction.c
+--- gcc-6.1.0/libgomp/testsuite/libgomp.oacc-c-c++-common/combined-reduction.c 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/libgomp/testsuite/libgomp.oacc-c-c++-common/combined-reduction.c 2016-04-29 17:37:55.000000000 +0000
+@@ -0,0 +1,23 @@
++/* Test a combined acc parallel loop reduction. */
++
++/* { dg-do run } */
++
++#include <assert.h>
++
++int
++main ()
++{
++ int i, v1 = 0, v2 = 0, n = 100;
++
++#pragma acc parallel loop reduction(+:v1, v2)
++ for (i = 0; i < n; i++)
++ {
++ v1++;
++ v2++;
++ }
++
++ assert (v1 == n);
++ assert (v2 == n);
++
++ return 0;
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libgomp/testsuite/libgomp.oacc-fortran/cache-1.f95 gcc-6-20160721/libgomp/testsuite/libgomp.oacc-fortran/cache-1.f95
+--- gcc-6.1.0/libgomp/testsuite/libgomp.oacc-fortran/cache-1.f95 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/libgomp/testsuite/libgomp.oacc-fortran/cache-1.f95 2016-06-10 09:46:04.000000000 +0000
+@@ -0,0 +1,6 @@
++! OpenACC cache directive.
++! { dg-do run }
++! { dg-additional-options "-std=f2008" }
++! { dg-additional-options "-cpp" }
++
++#include "../../../gcc/testsuite/gfortran.dg/goacc/cache-1.f95"
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libgomp/testsuite/libgomp.oacc-fortran/combined-reduction.f90 gcc-6-20160721/libgomp/testsuite/libgomp.oacc-fortran/combined-reduction.f90
+--- gcc-6.1.0/libgomp/testsuite/libgomp.oacc-fortran/combined-reduction.f90 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/libgomp/testsuite/libgomp.oacc-fortran/combined-reduction.f90 2016-04-29 17:37:55.000000000 +0000
+@@ -0,0 +1,19 @@
++! Test a combined acc parallel loop reduction.
++
++! { dg-do run }
++
++program test
++ implicit none
++ integer i, n, var
++
++ n = 100
++ var = 0
++
++ !$acc parallel loop reduction(+:var)
++ do i = 1, 100
++ var = var + 1
++ end do
++ !$acc end parallel loop
++
++ if (var .ne. n) call abort
++end program test
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libgomp/testsuite/libgomp.oacc-fortran/nested-function-1.f90 gcc-6-20160721/libgomp/testsuite/libgomp.oacc-fortran/nested-function-1.f90
+--- gcc-6.1.0/libgomp/testsuite/libgomp.oacc-fortran/nested-function-1.f90 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/libgomp/testsuite/libgomp.oacc-fortran/nested-function-1.f90 2016-06-10 09:46:18.000000000 +0000
+@@ -0,0 +1,70 @@
++! Exercise nested function decomposition, gcc/tree-nested.c.
++
++! { dg-do run }
++
++program collapse2
++ call test1
++ call test2
++contains
++ subroutine test1
++ integer :: i, j, k, a(1:3, 4:6, 5:7)
++ logical :: l
++ l = .false.
++ a(:, :, :) = 0
++ !$acc parallel reduction (.or.:l)
++ !$acc loop worker vector collapse(4 - 1)
++ do 164 i = 1, 3
++ do 164 j = 4, 6
++ do 164 k = 5, 7
++ a(i, j, k) = i + j + k
++164 end do
++ !$acc loop worker vector reduction(.or.:l) collapse(2)
++firstdo: do i = 1, 3
++ do j = 4, 6
++ do k = 5, 7
++ if (a(i, j, k) .ne. (i + j + k)) l = .true.
++ end do
++ end do
++ end do firstdo
++ !$acc end parallel
++ if (l) call abort
++ end subroutine test1
++
++ subroutine test2
++ integer :: a(3,3,3), k, kk, kkk, l, ll, lll
++ a = 0
++ !$acc parallel
++ ! Use "gang(static:1)" here and below to effectively turn gang-redundant
++ ! execution mode into something like gang-single.
++ !$acc loop gang(static:1) collapse(1)
++ do 115 k=1,3
++ !$acc loop collapse(2)
++ dokk: do kk=1,3
++ do kkk=1,3
++ a(k,kk,kkk) = 1
++ enddo
++ enddo dokk
++115 continue
++ !$acc loop gang(static:1) collapse(1)
++ do k=1,3
++ if (any(a(k,1:3,1:3).ne.1)) call abort
++ enddo
++ ! Use "gang(static:1)" here and below to effectively turn gang-redundant
++ ! execution mode into something like gang-single.
++ !$acc loop gang(static:1) collapse(1)
++ dol: do 120 l=1,3
++ !$acc loop collapse(2)
++ doll: do ll=1,3
++ do lll=1,3
++ a(l,ll,lll) = 2
++ enddo
++ enddo doll
++120 end do dol
++ !$acc loop gang(static:1) collapse(1)
++ do l=1,3
++ if (any(a(l,1:3,1:3).ne.2)) call abort
++ enddo
++ !$acc end parallel
++ end subroutine test2
++
++end program collapse2
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libgomp/testsuite/libgomp.oacc-fortran/nested-function-2.f90 gcc-6-20160721/libgomp/testsuite/libgomp.oacc-fortran/nested-function-2.f90
+--- gcc-6.1.0/libgomp/testsuite/libgomp.oacc-fortran/nested-function-2.f90 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/libgomp/testsuite/libgomp.oacc-fortran/nested-function-2.f90 2016-06-10 09:46:18.000000000 +0000
+@@ -0,0 +1,173 @@
++! Exercise nested function decomposition, gcc/tree-nested.c.
++
++! { dg-do run }
++
++program collapse3
++ integer :: p1, p2, p3, p4, p5, p6, p7, p8, p9
++ p1 = 2
++ p2 = 6
++ p3 = -2
++ p4 = 4
++ p5 = 13
++ p6 = 18
++ p7 = 1
++ p8 = 1
++ p9 = 1
++ call test1
++ call test2 (p1, p2, p3, p4, p5, p6)
++ call test3 (p1, p2, p3, p4, p5, p6, p7, p8, p9)
++ call test4
++contains
++ subroutine test1
++ integer :: a(3,3,3), k, kk, kkk, l, ll, lll
++ !$acc parallel
++ !$acc loop collapse(3)
++ do 115 k=1,3
++dokk: do kk=1,3
++ do kkk=1,3
++ a(k,kk,kkk) = 1
++ enddo
++ enddo dokk
++115 continue
++ !$acc end parallel
++ if (any(a(1:3,1:3,1:3).ne.1)) call abort
++ !$acc parallel
++ !$acc loop collapse(3)
++dol: do 120 l=1,3
++doll: do ll=1,3
++ do lll=1,3
++ a(l,ll,lll) = 2
++ enddo
++ enddo doll
++120 end do dol
++ !$acc end parallel
++ if (any(a(1:3,1:3,1:3).ne.2)) call abort
++ end subroutine test1
++
++ subroutine test2(v1, v2, v3, v4, v5, v6)
++ integer :: i, j, k, a(1:7, -3:5, 12:19), b(1:7, -3:5, 12:19)
++ integer :: v1, v2, v3, v4, v5, v6
++ logical :: l, r
++ l = .false.
++ r = .false.
++ a(:, :, :) = 0
++ b(:, :, :) = 0
++ !$acc parallel reduction (.or.:l)
++ !$acc loop reduction (.or.:l) collapse (3)
++ do i = v1, v2
++ do j = v3, v4
++ do k = v5, v6
++ l = l.or.i.lt.2.or.i.gt.6.or.j.lt.-2.or.j.gt.4
++ l = l.or.k.lt.13.or.k.gt.18
++ if (.not.l) a(i, j, k) = a(i, j, k) + 1
++ end do
++ end do
++ end do
++ !$acc end parallel
++ do i = v1, v2
++ do j = v3, v4
++ do k = v5, v6
++ r = r.or.i.lt.2.or.i.gt.6.or.j.lt.-2.or.j.gt.4
++ r = r.or.k.lt.13.or.k.gt.18
++ if (.not.l) b(i, j, k) = b(i, j, k) + 1
++ end do
++ end do
++ end do
++ if (l .neqv. r) call abort
++ do i = v1, v2
++ do j = v3, v4
++ do k = v5, v6
++ if (a(i, j, k) .ne. b(i, j, k)) call abort
++ end do
++ end do
++ end do
++ end subroutine test2
++
++ subroutine test3(v1, v2, v3, v4, v5, v6, v7, v8, v9)
++ integer :: i, j, k, a(1:7, -3:5, 12:19), b(1:7, -3:5, 12:19)
++ integer :: v1, v2, v3, v4, v5, v6, v7, v8, v9
++ logical :: l, r
++ l = .false.
++ r = .false.
++ a(:, :, :) = 0
++ b(:, :, :) = 0
++ !$acc parallel reduction (.or.:l)
++ !$acc loop reduction (.or.:l) collapse (3)
++ do i = v1, v2, v7
++ do j = v3, v4, v8
++ do k = v5, v6, v9
++ l = l.or.i.lt.2.or.i.gt.6.or.j.lt.-2.or.j.gt.4
++ l = l.or.k.lt.13.or.k.gt.18
++ if (.not.l) a(i, j, k) = a(i, j, k) + 1
++ end do
++ end do
++ end do
++ !$acc end parallel
++ do i = v1, v2, v7
++ do j = v3, v4, v8
++ do k = v5, v6, v9
++ r = r.or.i.lt.2.or.i.gt.6.or.j.lt.-2.or.j.gt.4
++ r = r.or.k.lt.13.or.k.gt.18
++ if (.not.l) b(i, j, k) = b(i, j, k) + 1
++ end do
++ end do
++ end do
++ if (l .neqv. r) call abort
++ do i = v1, v2, v7
++ do j = v3, v4, v8
++ do k = v5, v6, v9
++ if (a(i, j, k) .ne. b(i, j, k)) call abort
++ end do
++ end do
++ end do
++ end subroutine test3
++
++ subroutine test4
++ integer :: i, j, k, a(1:7, -3:5, 12:19), b(1:7, -3:5, 12:19)
++ integer :: v1, v2, v3, v4, v5, v6, v7, v8, v9
++ logical :: l, r
++ l = .false.
++ r = .false.
++ a(:, :, :) = 0
++ b(:, :, :) = 0
++ v1 = p1
++ v2 = p2
++ v3 = p3
++ v4 = p4
++ v5 = p5
++ v6 = p6
++ v7 = p7
++ v8 = p8
++ v9 = p9
++ !$acc parallel reduction (.or.:l)
++ !$acc loop reduction (.or.:l) collapse (3)
++ do i = v1, v2, v7
++ do j = v3, v4, v8
++ do k = v5, v6, v9
++ l = l.or.i.lt.2.or.i.gt.6.or.j.lt.-2.or.j.gt.4
++ l = l.or.k.lt.13.or.k.gt.18
++ if (.not.l) a(i, j, k) = a(i, j, k) + 1
++ end do
++ end do
++ end do
++ !$acc end parallel
++ do i = v1, v2, v7
++ do j = v3, v4, v8
++ do k = v5, v6, v9
++ r = r.or.i.lt.2.or.i.gt.6.or.j.lt.-2.or.j.gt.4
++ r = r.or.k.lt.13.or.k.gt.18
++ if (.not.r) b(i, j, k) = b(i, j, k) + 1
++ end do
++ end do
++ end do
++ if (l .neqv. r) call abort
++ do i = v1, v2, v7
++ do j = v3, v4, v8
++ do k = v5, v6, v9
++ if (a(i, j, k) .ne. b(i, j, k)) call abort
++ end do
++ end do
++ end do
++ end subroutine test4
++
++end program collapse3
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libgomp/testsuite/libgomp.oacc-fortran/nested-function-3.f90 gcc-6-20160721/libgomp/testsuite/libgomp.oacc-fortran/nested-function-3.f90
+--- gcc-6.1.0/libgomp/testsuite/libgomp.oacc-fortran/nested-function-3.f90 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/libgomp/testsuite/libgomp.oacc-fortran/nested-function-3.f90 2016-06-10 09:46:18.000000000 +0000
+@@ -0,0 +1,244 @@
++! Exercise nested function decomposition, gcc/tree-nested.c.
++
++! { dg-do run }
++
++program sub_collapse_3
++ call test1
++ call test2 (2, 6, -2, 4, 13, 18)
++ call test3 (2, 6, -2, 4, 13, 18, 1, 1, 1)
++ call test4
++ call test5 (2, 6, -2, 4, 13, 18)
++ call test6 (2, 6, -2, 4, 13, 18, 1, 1, 1)
++contains
++ subroutine test1
++ integer :: a(3,3,3), k, kk, kkk, l, ll, lll
++ !$acc parallel
++ !$acc loop collapse(3)
++ do 115 k=1,3
++dokk: do kk=1,3
++ do kkk=1,3
++ a(k,kk,kkk) = 1
++ enddo
++ enddo dokk
++115 continue
++ !$acc end parallel
++ if (any(a(1:3,1:3,1:3).ne.1)) call abort
++ !$acc parallel
++ !$acc loop collapse(3)
++dol: do 120 l=1,3
++doll: do ll=1,3
++ do lll=1,3
++ a(l,ll,lll) = 2
++ enddo
++ enddo doll
++120 end do dol
++ !$acc end parallel
++ if (any(a(1:3,1:3,1:3).ne.2)) call abort
++ end subroutine test1
++
++ subroutine test2(v1, v2, v3, v4, v5, v6)
++ integer :: i, j, k, a(1:7, -3:5, 12:19), b(1:7, -3:5, 12:19)
++ integer :: v1, v2, v3, v4, v5, v6
++ logical :: l, r
++ l = .false.
++ r = .false.
++ a(:, :, :) = 0
++ b(:, :, :) = 0
++ !$acc parallel pcopyin (v1, v2, v3, v4, v5, v6) reduction (.or.:l)
++ !$acc loop reduction (.or.:l) collapse (3)
++ do i = v1, v2
++ do j = v3, v4
++ do k = v5, v6
++ l = l.or.i.lt.2.or.i.gt.6.or.j.lt.-2.or.j.gt.4
++ l = l.or.k.lt.13.or.k.gt.18
++ if (.not.l) a(i, j, k) = a(i, j, k) + 1
++ end do
++ end do
++ end do
++ !$acc end parallel
++ do i = v1, v2
++ do j = v3, v4
++ do k = v5, v6
++ r = r.or.i.lt.2.or.i.gt.6.or.j.lt.-2.or.j.gt.4
++ r = r.or.k.lt.13.or.k.gt.18
++ if (.not.l) b(i, j, k) = b(i, j, k) + 1
++ end do
++ end do
++ end do
++ if (l .neqv. r) call abort
++ do i = v1, v2
++ do j = v3, v4
++ do k = v5, v6
++ if (a(i, j, k) .ne. b(i, j, k)) call abort
++ end do
++ end do
++ end do
++ end subroutine test2
++
++ subroutine test3(v1, v2, v3, v4, v5, v6, v7, v8, v9)
++ integer :: i, j, k, a(1:7, -3:5, 12:19), b(1:7, -3:5, 12:19)
++ integer :: v1, v2, v3, v4, v5, v6, v7, v8, v9
++ logical :: l, r
++ l = .false.
++ r = .false.
++ a(:, :, :) = 0
++ b(:, :, :) = 0
++ !$acc parallel pcopyin (v1, v2, v3, v4, v5, v6, v7, v8, v9) reduction (.or.:l)
++ !$acc loop reduction (.or.:l) collapse (3)
++ do i = v1, v2, v7
++ do j = v3, v4, v8
++ do k = v5, v6, v9
++ l = l.or.i.lt.2.or.i.gt.6.or.j.lt.-2.or.j.gt.4
++ l = l.or.k.lt.13.or.k.gt.18
++ if (.not.l) a(i, j, k) = a(i, j, k) + 1
++ end do
++ end do
++ end do
++ !$acc end parallel
++ do i = v1, v2, v7
++ do j = v3, v4, v8
++ do k = v5, v6, v9
++ r = r.or.i.lt.2.or.i.gt.6.or.j.lt.-2.or.j.gt.4
++ r = r.or.k.lt.13.or.k.gt.18
++ if (.not.l) b(i, j, k) = b(i, j, k) + 1
++ end do
++ end do
++ end do
++ if (l .neqv. r) call abort
++ do i = v1, v2, v7
++ do j = v3, v4, v8
++ do k = v5, v6, v9
++ if (a(i, j, k) .ne. b(i, j, k)) call abort
++ end do
++ end do
++ end do
++ end subroutine test3
++
++ subroutine test4
++ integer :: i, j, k, a(1:7, -3:5, 12:19), b(1:7, -3:5, 12:19)
++ integer :: v1, v2, v3, v4, v5, v6, v7, v8, v9
++ logical :: l, r
++ l = .false.
++ r = .false.
++ a(:, :, :) = 0
++ b(:, :, :) = 0
++ v1 = 2
++ v2 = 6
++ v3 = -2
++ v4 = 4
++ v5 = 13
++ v6 = 18
++ v7 = 1
++ v8 = 1
++ v9 = 1
++ !$acc parallel pcopyin (v1, v2, v3, v4, v5, v6, v7, v8, v9) reduction (.or.:l)
++ !$acc loop reduction (.or.:l) collapse (3)
++ do i = v1, v2, v7
++ do j = v3, v4, v8
++ do k = v5, v6, v9
++ l = l.or.i.lt.2.or.i.gt.6.or.j.lt.-2.or.j.gt.4
++ l = l.or.k.lt.13.or.k.gt.18
++ if (.not.l) a(i, j, k) = a(i, j, k) + 1
++ end do
++ end do
++ end do
++ !$acc end parallel
++ do i = v1, v2, v7
++ do j = v3, v4, v8
++ do k = v5, v6, v9
++ r = r.or.i.lt.2.or.i.gt.6.or.j.lt.-2.or.j.gt.4
++ r = r.or.k.lt.13.or.k.gt.18
++ if (.not.r) b(i, j, k) = b(i, j, k) + 1
++ end do
++ end do
++ end do
++ if (l .neqv. r) call abort
++ do i = v1, v2, v7
++ do j = v3, v4, v8
++ do k = v5, v6, v9
++ if (a(i, j, k) .ne. b(i, j, k)) call abort
++ end do
++ end do
++ end do
++ end subroutine test4
++
++ subroutine test5(v1, v2, v3, v4, v5, v6)
++ integer :: i, j, k, a(1:7, -3:5, 12:19), b(1:7, -3:5, 12:19)
++ integer :: v1, v2, v3, v4, v5, v6
++ logical :: l, r
++ l = .false.
++ r = .false.
++ a(:, :, :) = 0
++ b(:, :, :) = 0
++ !$acc parallel pcopyin (v1, v2, v3, v4, v5, v6) reduction (.or.:l)
++ !$acc loop reduction (.or.:l) collapse (3)
++ do i = v1, v2
++ do j = v3, v4
++ do k = v5, v6
++ l = l.or.i.lt.2.or.i.gt.6.or.j.lt.-2.or.j.gt.4
++ l = l.or.k.lt.13.or.k.gt.18
++ if (.not.l) a(i, j, k) = a(i, j, k) + 1
++ end do
++ end do
++ end do
++ !$acc end parallel
++ do i = v1, v2
++ do j = v3, v4
++ do k = v5, v6
++ r = r.or.i.lt.2.or.i.gt.6.or.j.lt.-2.or.j.gt.4
++ r = r.or.k.lt.13.or.k.gt.18
++ if (.not.r) b(i, j, k) = b(i, j, k) + 1
++ end do
++ end do
++ end do
++ if (l .neqv. r) call abort
++ do i = v1, v2
++ do j = v3, v4
++ do k = v5, v6
++ if (a(i, j, k) .ne. b(i, j, k)) call abort
++ end do
++ end do
++ end do
++ end subroutine test5
++
++ subroutine test6(v1, v2, v3, v4, v5, v6, v7, v8, v9)
++ integer :: i, j, k, a(1:7, -3:5, 12:19), b(1:7, -3:5, 12:19)
++ integer :: v1, v2, v3, v4, v5, v6, v7, v8, v9
++ logical :: l, r
++ l = .false.
++ r = .false.
++ a(:, :, :) = 0
++ b(:, :, :) = 0
++ !$acc parallel pcopyin (v1, v2, v3, v4, v5, v6, v7, v8, v9) reduction (.or.:l)
++ !$acc loop reduction (.or.:l) collapse (3)
++ do i = v1, v2, v7
++ do j = v3, v4, v8
++ do k = v5, v6, v9
++ l = l.or.i.lt.2.or.i.gt.6.or.j.lt.-2.or.j.gt.4
++ l = l.or.k.lt.13.or.k.gt.18
++ if (.not.l) a(i, j, k) = a(i, j, k) + 1
++ m = i * 100 + j * 10 + k
++ end do
++ end do
++ end do
++ !$acc end parallel
++ do i = v1, v2, v7
++ do j = v3, v4, v8
++ do k = v5, v6, v9
++ r = r.or.i.lt.2.or.i.gt.6.or.j.lt.-2.or.j.gt.4
++ r = r.or.k.lt.13.or.k.gt.18
++ if (.not.r) b(i, j, k) = b(i, j, k) + 1
++ end do
++ end do
++ end do
++ if (l .neqv. r) call abort
++ do i = v1, v2, v7
++ do j = v3, v4, v8
++ do k = v5, v6, v9
++ if (a(i, j, k) .ne. b(i, j, k)) call abort
++ end do
++ end do
++ end do
++ end subroutine test6
++
++end program sub_collapse_3
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libiberty/ChangeLog gcc-6-20160721/libiberty/ChangeLog
+--- gcc-6.1.0/libiberty/ChangeLog 2016-04-27 08:20:21.000000000 +0000
++++ gcc-6-20160721/libiberty/ChangeLog 2016-07-21 06:15:23.000000000 +0000
+@@ -1,3 +1,43 @@
++2016-07-21 Jason Merrill <jason@redhat.com>
++
++ * cp-demangle.c (cplus_demangle_operators): Add f[lrLR].
++ (d_expression_1): Handle them.
++ (d_maybe_print_fold_expression): New.
++ (d_print_comp_inner): Use it.
++ (d_index_template_argument): Handle negative index.
++
++ * cp-demangle.c (cplus_demangle_operators): Add sP and sZ.
++ (d_print_comp_inner): Handle them.
++ (d_template_args_1): Split out from d_template_args.
++ (d_args_length): New.
++
++2016-05-19 Jakub Jelinek <jakub@redhat.com>
++
++ Backported from mainline
++ 2016-05-19 Jakub Jelinek <jakub@redhat.com>
++
++ PR c++/70498
++ * cp-demangle.c (d_expression_1): Formatting fix.
++
++ 2016-05-02 Marcel Böhme <boehme.marcel@gmail.com>
++
++ PR c++/70498
++ * cp-demangle.c: Parse numbers as integer instead of long to avoid
++ overflow after sanity checks. Include <limits.h> if available.
++ (INT_MAX): Define if necessary.
++ (d_make_template_param): Takes integer argument instead of long.
++ (d_make_function_param): Likewise.
++ (d_append_num): Likewise.
++ (d_identifier): Likewise.
++ (d_number): Parse as and return integer.
++ (d_compact_number): Handle overflow.
++ (d_source_name): Change variable type to integer for parsed number.
++ (d_java_resource): Likewise.
++ (d_special_name): Likewise.
++ (d_discriminator): Likewise.
++ (d_unnamed_type): Likewise.
++ * testsuite/demangle-expected: Add regression test cases.
++
+ 2016-04-27 Release Manager
+
+ * GCC 6.1.0 released.
+@@ -16,7 +56,7 @@
+ -1.
+
+ 2016-03-31 Mikhail Maltsev <maltsevm@gmail.com>
+- Marcel Bohme boehme.marcel@gmail.com
++ Marcel Bohme <boehme.marcel@gmail.com>
+
+ PR c++/67394
+ PR c++/70481
+@@ -2037,7 +2077,7 @@
+ that are locale-independent.
+ * Makefile.in (filename_cmp.o): Add dependency on safe-ctype.h.
+
+-2007-04-11 Thomas Neumann tneumann@users.sourceforge.net
++2007-04-11 Thomas Neumann <tneumann@users.sourceforge.net>
+
+ * argv.c: Use ANSI C declarations.
+ * make-relative-prefix.c: Likewise.
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libiberty/cp-demangle.c gcc-6-20160721/libiberty/cp-demangle.c
+--- gcc-6.1.0/libiberty/cp-demangle.c 2015-11-27 14:48:21.000000000 +0000
++++ gcc-6-20160721/libiberty/cp-demangle.c 2016-07-21 06:15:23.000000000 +0000
+@@ -128,6 +128,13 @@
+ # endif /* alloca */
+ #endif /* HAVE_ALLOCA_H */
+
++#ifdef HAVE_LIMITS_H
++#include <limits.h>
++#endif
++#ifndef INT_MAX
++# define INT_MAX (int)(((unsigned int) ~0) >> 1) /* 0x7FFFFFFF */
++#endif
++
+ #include "ansidecl.h"
+ #include "libiberty.h"
+ #include "demangle.h"
+@@ -337,7 +344,7 @@
+ /* Set to 1 if we saw a demangling error. */
+ int demangle_failure;
+ /* The current index into any template argument packs we are using
+- for printing. */
++ for printing, or -1 to print the whole pack. */
+ int pack_index;
+ /* Number of d_print_flush calls so far. */
+ unsigned long int flush_count;
+@@ -398,7 +405,7 @@
+ struct demangle_component *);
+
+ static struct demangle_component *
+-d_make_template_param (struct d_info *, long);
++d_make_template_param (struct d_info *, int);
+
+ static struct demangle_component *
+ d_make_sub (struct d_info *, const char *, int);
+@@ -421,9 +428,9 @@
+
+ static struct demangle_component *d_source_name (struct d_info *);
+
+-static long d_number (struct d_info *);
++static int d_number (struct d_info *);
+
+-static struct demangle_component *d_identifier (struct d_info *, long);
++static struct demangle_component *d_identifier (struct d_info *, int);
+
+ static struct demangle_component *d_operator_name (struct d_info *);
+
+@@ -459,6 +466,7 @@
+ d_template_param (struct d_info *);
+
+ static struct demangle_component *d_template_args (struct d_info *);
++static struct demangle_component *d_template_args_1 (struct d_info *);
+
+ static struct demangle_component *
+ d_template_arg (struct d_info *);
+@@ -1119,7 +1127,7 @@
+ /* Add a new template parameter. */
+
+ static struct demangle_component *
+-d_make_template_param (struct d_info *di, long i)
++d_make_template_param (struct d_info *di, int i)
+ {
+ struct demangle_component *p;
+
+@@ -1135,7 +1143,7 @@
+ /* Add a new function parameter. */
+
+ static struct demangle_component *
+-d_make_function_param (struct d_info *di, long i)
++d_make_function_param (struct d_info *di, int i)
+ {
+ struct demangle_component *p;
+
+@@ -1620,7 +1628,7 @@
+ static struct demangle_component *
+ d_source_name (struct d_info *di)
+ {
+- long len;
++ int len;
+ struct demangle_component *ret;
+
+ len = d_number (di);
+@@ -1633,12 +1641,12 @@
+
+ /* number ::= [n] <(non-negative decimal integer)> */
+
+-static long
++static int
+ d_number (struct d_info *di)
+ {
+ int negative;
+ char peek;
+- long ret;
++ int ret;
+
+ negative = 0;
+ peek = d_peek_char (di);
+@@ -1681,7 +1689,7 @@
+ /* identifier ::= <(unqualified source code identifier)> */
+
+ static struct demangle_component *
+-d_identifier (struct d_info *di, long len)
++d_identifier (struct d_info *di, int len)
+ {
+ const char *name;
+
+@@ -1702,7 +1710,7 @@
+ /* Look for something which looks like a gcc encoding of an
+ anonymous namespace, and replace it with a more user friendly
+ name. */
+- if (len >= (long) ANONYMOUS_NAMESPACE_PREFIX_LEN + 2
++ if (len >= (int) ANONYMOUS_NAMESPACE_PREFIX_LEN + 2
+ && memcmp (name, ANONYMOUS_NAMESPACE_PREFIX,
+ ANONYMOUS_NAMESPACE_PREFIX_LEN) == 0)
+ {
+@@ -1754,6 +1762,10 @@
+ { "eO", NL ("^="), 2 },
+ { "eo", NL ("^"), 2 },
+ { "eq", NL ("=="), 2 },
++ { "fL", NL ("..."), 3 },
++ { "fR", NL ("..."), 3 },
++ { "fl", NL ("..."), 2 },
++ { "fr", NL ("..."), 2 },
+ { "ge", NL (">="), 2 },
+ { "gs", NL ("::"), 1 },
+ { "gt", NL (">"), 2 },
+@@ -1788,6 +1800,8 @@
+ { "rc", NL ("reinterpret_cast"), 2 },
+ { "rm", NL ("%"), 2 },
+ { "rs", NL (">>"), 2 },
++ { "sP", NL ("sizeof..."), 1 },
++ { "sZ", NL ("sizeof..."), 1 },
+ { "sc", NL ("static_cast"), 2 },
+ { "st", NL ("sizeof "), 1 },
+ { "sz", NL ("sizeof "), 1 },
+@@ -1870,7 +1884,7 @@
+ {
+ struct demangle_component *p = NULL;
+ struct demangle_component *next = NULL;
+- long len, i;
++ int len, i;
+ char c;
+ const char *str;
+
+@@ -2012,7 +2026,7 @@
+ case 'C':
+ {
+ struct demangle_component *derived_type;
+- long offset;
++ int offset;
+ struct demangle_component *base_type;
+
+ derived_type = cplus_demangle_type (di);
+@@ -2946,10 +2960,10 @@
+
+ /* <non-negative number> _ */
+
+-static long
++static int
+ d_compact_number (struct d_info *di)
+ {
+- long num;
++ int num;
+ if (d_peek_char (di) == '_')
+ num = 0;
+ else if (d_peek_char (di) == 'n')
+@@ -2957,7 +2971,7 @@
+ else
+ num = d_number (di) + 1;
+
+- if (! d_check_char (di, '_'))
++ if (num < 0 || ! d_check_char (di, '_'))
+ return -1;
+ return num;
+ }
+@@ -2969,7 +2983,7 @@
+ static struct demangle_component *
+ d_template_param (struct d_info *di)
+ {
+- long param;
++ int param;
+
+ if (! d_check_char (di, 'T'))
+ return NULL;
+@@ -2988,6 +3002,19 @@
+ static struct demangle_component *
+ d_template_args (struct d_info *di)
+ {
++ if (d_peek_char (di) != 'I'
++ && d_peek_char (di) != 'J')
++ return NULL;
++ d_advance (di, 1);
++
++ return d_template_args_1 (di);
++}
++
++/* <template-arg>* E */
++
++static struct demangle_component *
++d_template_args_1 (struct d_info *di)
++{
+ struct demangle_component *hold_last_name;
+ struct demangle_component *al;
+ struct demangle_component **pal;
+@@ -2997,11 +3024,6 @@
+ constructor or destructor. */
+ hold_last_name = di->last_name;
+
+- if (d_peek_char (di) != 'I'
+- && d_peek_char (di) != 'J')
+- return NULL;
+- d_advance (di, 1);
+-
+ if (d_peek_char (di) == 'E')
+ {
+ /* An argument pack can be empty. */
+@@ -3171,9 +3193,10 @@
+ }
+ else
+ {
+- index = d_compact_number (di) + 1;
+- if (index == 0)
++ index = d_compact_number (di);
++ if (index == INT_MAX || index == -1)
+ return NULL;
++ index++;
+ }
+ return d_make_function_param (di, index);
+ }
+@@ -3262,6 +3285,8 @@
+ if (op->type == DEMANGLE_COMPONENT_CAST
+ && d_check_char (di, '_'))
+ operand = d_exprlist (di, 'E');
++ else if (code && !strcmp (code, "sP"))
++ operand = d_template_args_1 (di);
+ else
+ operand = d_expression_1 (di);
+
+@@ -3284,6 +3309,9 @@
+ return NULL;
+ if (op_is_new_cast (op))
+ left = cplus_demangle_type (di);
++ else if (code[0] == 'f')
++ /* fold-expression. */
++ left = d_operator_name (di);
+ else
+ left = d_expression_1 (di);
+ if (!strcmp (code, "cl"))
+@@ -3318,6 +3346,13 @@
+ second = d_expression_1 (di);
+ third = d_expression_1 (di);
+ }
++ else if (code[0] == 'f')
++ {
++ /* fold-expression. */
++ first = d_operator_name (di);
++ second = d_expression_1 (di);
++ third = d_expression_1 (di);
++ }
+ else if (code[0] == 'n')
+ {
+ /* new-expression. */
+@@ -3502,7 +3537,7 @@
+ static int
+ d_discriminator (struct d_info *di)
+ {
+- long discrim;
++ int discrim;
+
+ if (d_peek_char (di) != '_')
+ return 1;
+@@ -3558,7 +3593,7 @@
+ d_unnamed_type (struct d_info *di)
+ {
+ struct demangle_component *ret;
+- long num;
++ int num;
+
+ if (! d_check_char (di, 'U'))
+ return NULL;
+@@ -4086,10 +4121,10 @@
+ }
+
+ static inline void
+-d_append_num (struct d_print_info *dpi, long l)
++d_append_num (struct d_print_info *dpi, int l)
+ {
+ char buf[25];
+- sprintf (buf,"%ld", l);
++ sprintf (buf,"%d", l);
+ d_append_string (dpi, buf);
+ }
+
+@@ -4171,13 +4206,17 @@
+ }
+
+ /* Returns the I'th element of the template arglist ARGS, or NULL on
+- failure. */
++ failure. If I is negative, return the entire arglist. */
+
+ static struct demangle_component *
+ d_index_template_argument (struct demangle_component *args, int i)
+ {
+ struct demangle_component *a;
+
++ if (i < 0)
++ /* Print the whole argument pack. */
++ return args;
++
+ for (a = args;
+ a != NULL;
+ a = d_right (a))
+@@ -4277,6 +4316,30 @@
+ return count;
+ }
+
++/* Returns the number of template args in DC, expanding any pack expansions
++ found there. */
++
++static int
++d_args_length (struct d_print_info *dpi, const struct demangle_component *dc)
++{
++ int count = 0;
++ for (; dc && dc->type == DEMANGLE_COMPONENT_TEMPLATE_ARGLIST;
++ dc = d_right (dc))
++ {
++ struct demangle_component *elt = d_left (dc);
++ if (elt == NULL)
++ break;
++ if (elt->type == DEMANGLE_COMPONENT_PACK_EXPANSION)
++ {
++ struct demangle_component *a = d_find_pack (dpi, d_left (elt));
++ count += d_pack_length (a);
++ }
++ else
++ ++count;
++ }
++ return count;
++}
++
+ /* DC is a component of a mangled expression. Print it, wrapped in parens
+ if needed. */
+
+@@ -4353,6 +4416,70 @@
+ return NULL;
+ }
+
++/* If DC is a C++17 fold-expression, print it and return true; otherwise
++ return false. */
++
++static int
++d_maybe_print_fold_expression (struct d_print_info *dpi, int options,
++ const struct demangle_component *dc)
++{
++ const struct demangle_component *ops, *operator_, *op1, *op2;
++ int save_idx;
++
++ const char *fold_code = d_left (dc)->u.s_operator.op->code;
++ if (fold_code[0] != 'f')
++ return 0;
++
++ ops = d_right (dc);
++ operator_ = d_left (ops);
++ op1 = d_right (ops);
++ op2 = 0;
++ if (op1->type == DEMANGLE_COMPONENT_TRINARY_ARG2)
++ {
++ op2 = d_right (op1);
++ op1 = d_left (op1);
++ }
++
++ /* Print the whole pack. */
++ save_idx = dpi->pack_index;
++ dpi->pack_index = -1;
++
++ switch (fold_code[1])
++ {
++ /* Unary left fold, (... + X). */
++ case 'l':
++ d_append_string (dpi, "(...");
++ d_print_expr_op (dpi, options, operator_);
++ d_print_subexpr (dpi, options, op1);
++ d_append_char (dpi, ')');
++ break;
++
++ /* Unary right fold, (X + ...). */
++ case 'r':
++ d_append_char (dpi, '(');
++ d_print_subexpr (dpi, options, op1);
++ d_print_expr_op (dpi, options, operator_);
++ d_append_string (dpi, "...)");
++ break;
++
++ /* Binary left fold, (42 + ... + X). */
++ case 'L':
++ /* Binary right fold, (X + ... + 42). */
++ case 'R':
++ d_append_char (dpi, '(');
++ d_print_subexpr (dpi, options, op1);
++ d_print_expr_op (dpi, options, operator_);
++ d_append_string (dpi, "...");
++ d_print_expr_op (dpi, options, operator_);
++ d_print_subexpr (dpi, options, op2);
++ d_append_char (dpi, ')');
++ break;
++ }
++
++ dpi->pack_index = save_idx;
++ return 1;
++}
++
+ /* Subroutine to handle components. */
+
+ static void
+@@ -5113,6 +5240,21 @@
+ }
+ }
+
++ /* For sizeof..., just print the pack length. */
++ if (code && !strcmp (code, "sZ"))
++ {
++ struct demangle_component *a = d_find_pack (dpi, operand);
++ int len = d_pack_length (a);
++ d_append_num (dpi, len);
++ return;
++ }
++ else if (code && !strcmp (code, "sP"))
++ {
++ int len = d_args_length (dpi, operand);
++ d_append_num (dpi, len);
++ return;
++ }
++
+ if (op->type != DEMANGLE_COMPONENT_CAST)
+ d_print_expr_op (dpi, options, op);
+ else
+@@ -5154,6 +5296,9 @@
+ return;
+ }
+
++ if (d_maybe_print_fold_expression (dpi, options, dc))
++ return;
++
+ /* We wrap an expression which uses the greater-than operator in
+ an extra layer of parens so that it does not get confused
+ with the '>' which ends the template parameters. */
+@@ -5209,6 +5354,8 @@
+ d_print_error (dpi);
+ return;
+ }
++ if (d_maybe_print_fold_expression (dpi, options, dc))
++ return;
+ {
+ struct demangle_component *op = d_left (dc);
+ struct demangle_component *first = d_left (d_right (dc));
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libiberty/testsuite/demangle-expected gcc-6-20160721/libiberty/testsuite/demangle-expected
+--- gcc-6.1.0/libiberty/testsuite/demangle-expected 2016-03-31 17:20:53.000000000 +0000
++++ gcc-6-20160721/libiberty/testsuite/demangle-expected 2016-07-21 06:15:23.000000000 +0000
+@@ -4421,13 +4421,41 @@
+ --format=gnu-v3
+ _Z3fooI1FEN1XIXszdtcl1PclcvT__EEE5arrayEE4TypeEv
+ X<sizeof ((P(((F)())())).array)>::Type foo<F>()
++
++_Z1fIJidEEv1AIXsZT_EE
++void f<int, double>(A<2>)
++
++_ZN1A1fIJiiEiJiiiEEEvRAsPDpT_T0_DpT1_E_iS3_S5_
++void A::f<int, int, int, int, int, int>(int (&) [6], int, int, int, int)
++
++_Z10unary_leftIJLi1ELi2ELi3EEEv1AIXflplT_EE
++void unary_left<1, 2, 3>(A<(...+(1, 2, 3))>)
++
++_Z11unary_rightIJLi1ELi2ELi3EEEv1AIXfrplT_EE
++void unary_right<1, 2, 3>(A<((1, 2, 3)+...)>)
++
++_Z11binary_leftIJLi1ELi2ELi3EEEv1AIXfLplLi42ET_EE
++void binary_left<1, 2, 3>(A<((42)+...+(1, 2, 3))>)
++
++_Z12binary_rightIJLi1ELi2ELi3EEEv1AIXfRplT_Li42EEE
++void binary_right<1, 2, 3>(A<((1, 2, 3)+...+(42))>)
+ #
+-# Tests a use-after-free problem
++# Tests a use-after-free problem PR70481
+
+ _Q.__0
+ ::Q.(void)
+ #
+-# Tests a use-after-free problem
++# Tests a use-after-free problem PR70481
+
+ _Q10-__9cafebabe.
+ cafebabe.::-(void)
++#
++# Tests integer overflow problem PR70492
++
++__vt_90000000000cafebabe
++__vt_90000000000cafebabe
++#
++# Tests write access violation PR70498
++
++_Z80800000000000000000000
++_Z80800000000000000000000
+Only in gcc-6.1.0/libitm: libitm.info
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libjava/ChangeLog gcc-6-20160721/libjava/ChangeLog
+--- gcc-6.1.0/libjava/ChangeLog 2016-04-27 08:20:21.000000000 +0000
++++ gcc-6-20160721/libjava/ChangeLog 2016-04-29 11:50:42.000000000 +0000
+@@ -1,3 +1,11 @@
++2016-04-29 Dominique d'Humieres <dominiq@lps.ens.fr>
++
++ backport from trunk:
++ 2016-04-20 Ben Elliston <bje@gnu.org>
++
++ * testsuite/lib/libjava.exp (libjava_arguments): Use 'file
++ normalize' rather than the defunct DejaGnu 'absolute' proc.
++
+ 2016-04-27 Release Manager
+
+ * GCC 6.1.0 released.
+Only in gcc-6.1.0/libjava/classpath/doc: cp-tools.info
+Only in gcc-6.1.0/libjava/classpath/doc: gappletviewer.1
+Only in gcc-6.1.0/libjava/classpath/doc: gjar.1
+Only in gcc-6.1.0/libjava/classpath/doc: gjarsigner.1
+Only in gcc-6.1.0/libjava/classpath/doc: gjavah.1
+Only in gcc-6.1.0/libjava/classpath/doc: gjdoc.1
+Only in gcc-6.1.0/libjava/classpath/doc: gkeytool.1
+Only in gcc-6.1.0/libjava/classpath/doc: gnative2ascii.1
+Only in gcc-6.1.0/libjava/classpath/doc: gorbd.1
+Only in gcc-6.1.0/libjava/classpath/doc: grmid.1
+Only in gcc-6.1.0/libjava/classpath/doc: grmiregistry.1
+Only in gcc-6.1.0/libjava/classpath/doc: gserialver.1
+Only in gcc-6.1.0/libjava/classpath/doc: gtnameserv.1
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libjava/testsuite/lib/libjava.exp gcc-6-20160721/libjava/testsuite/lib/libjava.exp
+--- gcc-6.1.0/libjava/testsuite/lib/libjava.exp 2014-05-20 08:20:06.000000000 +0000
++++ gcc-6-20160721/libjava/testsuite/lib/libjava.exp 2016-04-29 11:50:42.000000000 +0000
+@@ -416,7 +416,7 @@
+
+ # Search for libtool. We need it to link.
+ set found_compiler 0
+- set d [absolute $objdir]
++ set d [file normalize $objdir]
+ foreach x {. .. ../.. ../../..} {
+ if {[file exists $d/$x/libtool]} then {
+ # We have to run silently to avoid DejaGNU lossage.
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libmpx/ChangeLog gcc-6-20160721/libmpx/ChangeLog
+--- gcc-6.1.0/libmpx/ChangeLog 2016-04-27 08:20:21.000000000 +0000
++++ gcc-6-20160721/libmpx/ChangeLog 2016-06-10 09:31:37.000000000 +0000
+@@ -1,3 +1,10 @@
++2016-06-10 Ilya Enkovich <ilya.enkovich@intel.com>
++
++ Backport from mainline r237292.
++ 2016-06-10 Ilya Enkovich <ilya.enkovich@intel.com>
++
++ * mpxwrap/mpx_wrappers.c (move_bounds): Fix overflow bug.
++
+ 2016-04-27 Release Manager
+
+ * GCC 6.1.0 released.
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libmpx/mpxwrap/mpx_wrappers.c gcc-6-20160721/libmpx/mpxwrap/mpx_wrappers.c
+--- gcc-6.1.0/libmpx/mpxwrap/mpx_wrappers.c 2016-01-18 19:36:02.000000000 +0000
++++ gcc-6-20160721/libmpx/mpxwrap/mpx_wrappers.c 2016-06-10 09:31:37.000000000 +0000
+@@ -27,6 +27,7 @@
+ #include "string.h"
+ #include <sys/mman.h>
+ #include <stdint.h>
++#include <assert.h>
+ #include "mpxrt/mpxrt.h"
+
+ void *
+@@ -418,7 +419,16 @@
+ else
+ elems_to_copy -= src_bt_index_end + 1;
+ }
+- src_bd_index_end--;
++ /* Go to previous table but beware of overflow.
++ We should have copied all required element
++ in case src_bd_index_end is 0. */
++ if (src_bd_index_end)
++ src_bd_index_end--;
++ else
++ {
++ assert (!elems_to_copy);
++ return;
++ }
+ /* For each bounds table we check if there are valid pointers inside.
+ If there are some, we copy table in pre-counted portions. */
+ for (; src_bd_index_end > src_bd_index; src_bd_index_end--)
+Only in gcc-6.1.0/libquadmath: libquadmath.info
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libsanitizer/ChangeLog gcc-6-20160721/libsanitizer/ChangeLog
+--- gcc-6.1.0/libsanitizer/ChangeLog 2016-04-27 08:20:21.000000000 +0000
++++ gcc-6-20160721/libsanitizer/ChangeLog 2016-05-18 21:26:54.000000000 +0000
+@@ -1,3 +1,12 @@
++2016-05-18 Jakub Jelinek <jakub@redhat.com>
++
++ Backported from mainline
++ 2016-05-17 Jakub Jelinek <jakub@redhat.com>
++
++ PR sanitizer/71160
++ * asan/asan_malloc_linux.cc: Cherry pick upstream r254395
++ and r269633.
++
+ 2016-04-27 Release Manager
+
+ * GCC 6.1.0 released.
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libsanitizer/asan/asan_malloc_linux.cc gcc-6-20160721/libsanitizer/asan/asan_malloc_linux.cc
+--- gcc-6.1.0/libsanitizer/asan/asan_malloc_linux.cc 2014-09-23 17:59:53.000000000 +0000
++++ gcc-6-20160721/libsanitizer/asan/asan_malloc_linux.cc 2016-05-18 21:26:54.000000000 +0000
+@@ -24,39 +24,62 @@
+ // ---------------------- Replacement functions ---------------- {{{1
+ using namespace __asan; // NOLINT
+
++static uptr allocated_for_dlsym;
++static const uptr kDlsymAllocPoolSize = 1024;
++static uptr alloc_memory_for_dlsym[kDlsymAllocPoolSize];
++
++static bool IsInDlsymAllocPool(const void *ptr) {
++ uptr off = (uptr)ptr - (uptr)alloc_memory_for_dlsym;
++ return off < sizeof(alloc_memory_for_dlsym);
++}
++
++static void *AllocateFromLocalPool(uptr size_in_bytes) {
++ uptr size_in_words = RoundUpTo(size_in_bytes, kWordSize) / kWordSize;
++ void *mem = (void*)&alloc_memory_for_dlsym[allocated_for_dlsym];
++ allocated_for_dlsym += size_in_words;
++ CHECK_LT(allocated_for_dlsym, kDlsymAllocPoolSize);
++ return mem;
++}
++
+ INTERCEPTOR(void, free, void *ptr) {
+ GET_STACK_TRACE_FREE;
++ if (UNLIKELY(IsInDlsymAllocPool(ptr)))
++ return;
+ asan_free(ptr, &stack, FROM_MALLOC);
+ }
+
+ INTERCEPTOR(void, cfree, void *ptr) {
+ GET_STACK_TRACE_FREE;
++ if (UNLIKELY(IsInDlsymAllocPool(ptr)))
++ return;
+ asan_free(ptr, &stack, FROM_MALLOC);
+ }
+
+ INTERCEPTOR(void*, malloc, uptr size) {
++ if (UNLIKELY(!asan_inited))
++ // Hack: dlsym calls malloc before REAL(malloc) is retrieved from dlsym.
++ return AllocateFromLocalPool(size);
+ GET_STACK_TRACE_MALLOC;
+ return asan_malloc(size, &stack);
+ }
+
+ INTERCEPTOR(void*, calloc, uptr nmemb, uptr size) {
+- if (UNLIKELY(!asan_inited)) {
++ if (UNLIKELY(!asan_inited))
+ // Hack: dlsym calls calloc before REAL(calloc) is retrieved from dlsym.
+- const uptr kCallocPoolSize = 1024;
+- static uptr calloc_memory_for_dlsym[kCallocPoolSize];
+- static uptr allocated;
+- uptr size_in_words = ((nmemb * size) + kWordSize - 1) / kWordSize;
+- void *mem = (void*)&calloc_memory_for_dlsym[allocated];
+- allocated += size_in_words;
+- CHECK(allocated < kCallocPoolSize);
+- return mem;
+- }
++ return AllocateFromLocalPool(nmemb * size);
+ GET_STACK_TRACE_MALLOC;
+ return asan_calloc(nmemb, size, &stack);
+ }
+
+ INTERCEPTOR(void*, realloc, void *ptr, uptr size) {
+ GET_STACK_TRACE_MALLOC;
++ if (UNLIKELY(IsInDlsymAllocPool(ptr))) {
++ uptr offset = (uptr)ptr - (uptr)alloc_memory_for_dlsym;
++ uptr copy_size = Min(size, kDlsymAllocPoolSize - offset);
++ void *new_ptr = asan_malloc(size, &stack);
++ internal_memcpy(new_ptr, ptr, copy_size);
++ return new_ptr;
++ }
+ return asan_realloc(ptr, size, &stack);
+ }
+
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libstdc++-v3/ChangeLog gcc-6-20160721/libstdc++-v3/ChangeLog
+--- gcc-6.1.0/libstdc++-v3/ChangeLog 2016-04-27 08:20:21.000000000 +0000
++++ gcc-6-20160721/libstdc++-v3/ChangeLog 2016-07-19 22:16:35.000000000 +0000
+@@ -1,3 +1,209 @@
++2016-07-19 Jonathan Wakely <jwakely@redhat.com>
++
++ Backport from mainline
++ 2016-07-14 Jonathan Wakely <jwakely@redhat.com>
++
++ * include/experimental/functional: Include <parallel/algorithm> in
++ Parallel Mode.
++
++ Backport from mainline
++ 2016-07-14 Jonathan Wakely <jwakely@redhat.com>
++
++ * testsuite/experimental/functional/searchers.cc: Include <algorithm>
++ for std::search.
++
++ PR libstdc++/71856
++ * include/bits/c++config (_GLIBCXX_ASSERTIONS): Define to 1 not empty.
++ * include/parallel/balanced_quicksort.h: Include <unistd.h> for sleep.
++ * include/parallel/compiletime_settings.h (_GLIBCXX_ASSERTIONS):
++ Do not define here.
++
++ Backport from mainline
++ 2016-06-06 Jonathan Wakely <jwakely@redhat.com>
++
++ PR libstdc++/71320
++ * src/filesystem/ops.cc (permissions(const path&, perms, error_code&)):
++ Add or remove permissions according to perms argument.
++ * testsuite/experimental/filesystem/operations/permissions.cc: New
++ test.
++
++2016-07-06 Ville Voutilainen <ville.voutilainen@gmail.com>
++
++ Implement LWG 2451, optional<T> should 'forward' T's
++ implicit conversions.
++ * include/experimental/optional (__is_optional_impl, __is_optional):
++ New.
++ (optional()): Make constexpr and default.
++ (optional(_Up&&), optional(const optional<_Up>&),
++ optional(optional<_Up>&& __t): New.
++ (operator=(_Up&&)): Constrain.
++ (operator=(const optional<_Up>&), operator=(optional<_Up>&&)): New.
++ * testsuite/experimental/optional/cons/value.cc:
++ Add tests for the functionality added by LWG 2451.
++ * testsuite/experimental/optional/cons/value_neg.cc: New.
++
++2016-07-05 Ville Voutilainen <ville.voutilainen@gmail.com>
++
++ Implement LWG 2509,
++ any_cast doesn't work with rvalue reference targets and cannot
++ move with a value target.
++ * include/experimental/any (any(_ValueType&&)): Constrain and
++ add an overload that doesn't forward.
++ (any_cast(any&&)): Constrain and add an overload that moves.
++ * testsuite/experimental/any/misc/any_cast.cc: Add tests for
++ the functionality added by LWG 2509.
++
++2016-07-04 Ville Voutilainen <ville.voutilainen@gmail.com>
++
++ PR libstdc++/71313
++ * src/filesystem/ops.cc (remove_all(const path&, error_code&)):
++ Call remove_all for children of a directory.
++ * testsuite/experimental/filesystem/operations/create_directories.cc:
++ Adjust.
++
++2016-06-17 Jonathan Wakely <jwakely@redhat.com>
++
++ PR libstdc++/71545
++ * include/bits/stl_algobase.h (lower_bound, lexicographical_compare):
++ Remove irreflexive checks.
++ * include/bits/stl_algo.h (lower_bound, upper_bound, equal_range,
++ binary_search): Likewise.
++ * testsuite/25_algorithms/equal_range/partitioned.cc: New test.
++ * testsuite/25_algorithms/lexicographical_compare/71545.cc: New test.
++ * testsuite/25_algorithms/lower_bound/partitioned.cc: New test.
++ * testsuite/25_algorithms/upper_bound/partitioned.cc: New test.
++ * testsuite/util/testsuite_iterators.h (__gnu_test::test_container):
++ Add constructor from array.
++
++2016-05-26 Jonathan Wakely <jwakely@redhat.com>
++
++ Backport from mainline
++ 2016-04-24 Jonathan Wakely <jwakely@redhat.com>
++
++ PR libstdc++/70762
++ * testsuite/util/testsuite_fs.h (__gnu_test::nonexistent_path): Use
++ static counter to return a different path on every call.
++
++ * testsuite/experimental/filesystem/path/native/string.cc: Add
++ dg-require-filesystem-ts directive.
++
++2016-05-25 Jonathan Wakely <jwakely@redhat.com>
++
++ Backport from mainline
++ 2016-04-20 Jonathan Wakely <jwakely@redhat.com>
++
++ PR libstdc++/69703
++ * src/c++11/codecvt.cc (__codecvt_utf8_base<char16_t>::do_in,
++ __codecvt_utf8_utf16_base<char16_t>::do_in): Fix mask operations.
++
++ Backport from mainline
++ 2016-04-19 Jonathan Wakely <jwakely@redhat.com>
++
++ PR libstdc++/69703
++ * src/c++11/codecvt.cc (__codecvt_utf8_base<char16_t>::do_in)):
++ Override endianness bit in mode.
++ * testsuite/22_locale/codecvt/codecvt_utf8/69703.cc: New test.
++ * testsuite/22_locale/codecvt/codecvt_utf8_utf16/66855.cc: Test
++ that little_endian mode is ignored.
++ * testsuite/experimental/filesystem/path/native/string.cc: New test.
++
++ Backport from mainline
++ 2016-05-10 Jonathan Wakely <jwakely@redhat.com>
++
++ * include/experimental/bits/fs_dir.h (begin, end): Add noexcept.
++ * testsuite/experimental/filesystem/iterators/directory_iterator.cc:
++ Test begin and end functions.
++ * testsuite/experimental/filesystem/iterators/
++ recursive_directory_iterator.cc: Likewise.
++
++ Backport from mainline
++ 2016-05-10 Jonathan Wakely <jwakely@redhat.com>
++
++ PR libstdc++/71038
++ * src/filesystem/ops.cc (do_copy_file): Fix backwards conditions.
++ * testsuite/experimental/filesystem/operations/copy_file.cc: New test.
++
++ Backport from mainline
++ 2016-05-10 Jonathan Wakely <jwakely@redhat.com>
++
++ * include/experimental/bits/fs_dir.h (__directory_iterator_proxy):
++ Overload operator* to move from rvalues.
++
++ Backport from mainline
++ 2016-05-10 Jonathan Wakely <jwakely@redhat.com>
++
++ PR libstdc++/71036
++ * src/filesystem/ops.cc (create_dir): Handle EEXIST from mkdir.
++ * testsuite/experimental/filesystem/operations/create_directory.cc:
++ New test.
++
++ Backport from mainline
++ 2016-05-10 Jonathan Wakely <jwakely@redhat.com>
++
++ PR libstdc++/71037
++ * src/filesystem/ops.cc (canonical(const path&, const path&)): Add
++ base path to exception.
++ * testsuite/experimental/filesystem/operations/canonical.cc: Test
++ paths contained in exception.
++
++ Backport from mainline
++ 2016-05-10 Jonathan Wakely <jwakely@redhat.com>
++
++ PR libstdc++/71005
++ * include/experimental/bits/fs_dir.h (__directory_iterator_proxy):
++ New type.
++ (directory_iterator::operator++(int)): Return proxy.
++ (recursive_directory_iterator::operator++(int)): Likewise.
++ * testsuite/experimental/filesystem/iterators/directory_iterator.cc:
++ Test post-increment.
++ * testsuite/experimental/filesystem/iterators/
++ recursive_directory_iterator.cc: Likewise.
++
++ Backport from mainline
++ 2016-05-09 Jonathan Wakely <jwakely@redhat.com>
++
++ PR libstdc++/71004
++ * include/experimental/bits/fs_dir.h (recursive_directory_iterator):
++ Initialize scalar member variables in default constructor.
++ * testsuite/experimental/filesystem/iterators/
++ recursive_directory_iterator.cc: Test default construction.
++
++ Backport from mainline
++ 2016-04-19 Jonathan Wakely <jwakely@redhat.com>
++
++ PR libstdc++/70609
++ * src/filesystem/ops.cc (close_fd): New function.
++ (do_copy_file): Set permissions before copying file contents. Check
++ result of closing file descriptors. Don't copy streambuf when file
++ is empty.
++ (copy(const path&, const path&, copy_options, error_code&)): Use
++ lstat for source file when copy_symlinks is set.
++ * testsuite/experimental/filesystem/operations/copy.cc: Test copy().
++
++ Backport from mainline
++ 2016-04-19 Jonathan Wakely <jwakely@redhat.com>
++
++ * include/experimental/bits/fs_fwd.h (operator&, operator|, operator^,
++ operator~ operator&=, operator|=, operator^=): Add noexcept to
++ overloaded operators for copy_options, perms and directory_options.
++ * src/filesystem/ops.cc (make_file_type, make_file_status,
++ is_not_found_errno, file_time): Add noexcept.
++
++2016-05-11 Jonathan Wakely <jwakely@redhat.com>
++
++ PR libstdc++/71049
++ * src/c++11/cow-stdexcept.cc [!_GLIBCXX_USE_DUAL_ABI]: Don't define
++ exception constructors with __sso_string parameters.
++
++2016-05-09 Ville Voutilainen <ville.voutilainen@gmail.com>
++
++ Avoid endless run-time recursion for copying single-element
++ tuples where the element type is by-value constructible
++ from any type.
++ * include/std/tuple (_NotSameTuple): New.
++ * include/std/tuple (tuple(_UElements&&...): Use it.
++ * testsuite/20_util/tuple/cons/element_accepts_anything_byval.cc: New.
++
+ 2016-04-27 Release Manager
+
+ * GCC 6.1.0 released.
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libstdc++-v3/include/bits/c++config gcc-6-20160721/libstdc++-v3/include/bits/c++config
+--- gcc-6.1.0/libstdc++-v3/include/bits/c++config 2016-04-14 16:23:06.000000000 +0000
++++ gcc-6-20160721/libstdc++-v3/include/bits/c++config 2016-07-19 22:16:23.000000000 +0000
+@@ -414,7 +414,7 @@
+
+ // Debug Mode implies checking assertions.
+ #ifdef _GLIBCXX_DEBUG
+-# define _GLIBCXX_ASSERTIONS
++# define _GLIBCXX_ASSERTIONS 1
+ #endif
+
+ // Disable std::string explicit instantiation declarations in order to assert.
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libstdc++-v3/include/bits/stl_algo.h gcc-6-20160721/libstdc++-v3/include/bits/stl_algo.h
+--- gcc-6.1.0/libstdc++-v3/include/bits/stl_algo.h 2016-04-14 16:23:06.000000000 +0000
++++ gcc-6-20160721/libstdc++-v3/include/bits/stl_algo.h 2016-06-17 18:53:46.000000000 +0000
+@@ -2026,7 +2026,6 @@
+ typename iterator_traits<_ForwardIterator>::value_type, _Tp>)
+ __glibcxx_requires_partitioned_lower_pred(__first, __last,
+ __val, __comp);
+- __glibcxx_requires_irreflexive_pred2(__first, __last, __comp);
+
+ return std::__lower_bound(__first, __last, __val,
+ __gnu_cxx::__ops::__iter_comp_val(__comp));
+@@ -2080,7 +2079,6 @@
+ __glibcxx_function_requires(_LessThanOpConcept<
+ _Tp, typename iterator_traits<_ForwardIterator>::value_type>)
+ __glibcxx_requires_partitioned_upper(__first, __last, __val);
+- __glibcxx_requires_irreflexive2(__first, __last);
+
+ return std::__upper_bound(__first, __last, __val,
+ __gnu_cxx::__ops::__val_less_iter());
+@@ -2112,7 +2110,6 @@
+ _Tp, typename iterator_traits<_ForwardIterator>::value_type>)
+ __glibcxx_requires_partitioned_upper_pred(__first, __last,
+ __val, __comp);
+- __glibcxx_requires_irreflexive_pred2(__first, __last, __comp);
+
+ return std::__upper_bound(__first, __last, __val,
+ __gnu_cxx::__ops::__val_comp_iter(__comp));
+@@ -2186,7 +2183,6 @@
+ _Tp, typename iterator_traits<_ForwardIterator>::value_type>)
+ __glibcxx_requires_partitioned_lower(__first, __last, __val);
+ __glibcxx_requires_partitioned_upper(__first, __last, __val);
+- __glibcxx_requires_irreflexive2(__first, __last);
+
+ return std::__equal_range(__first, __last, __val,
+ __gnu_cxx::__ops::__iter_less_val(),
+@@ -2225,7 +2221,6 @@
+ __val, __comp);
+ __glibcxx_requires_partitioned_upper_pred(__first, __last,
+ __val, __comp);
+- __glibcxx_requires_irreflexive_pred2(__first, __last, __comp);
+
+ return std::__equal_range(__first, __last, __val,
+ __gnu_cxx::__ops::__iter_comp_val(__comp),
+@@ -2255,7 +2250,6 @@
+ _Tp, typename iterator_traits<_ForwardIterator>::value_type>)
+ __glibcxx_requires_partitioned_lower(__first, __last, __val);
+ __glibcxx_requires_partitioned_upper(__first, __last, __val);
+- __glibcxx_requires_irreflexive2(__first, __last);
+
+ _ForwardIterator __i
+ = std::__lower_bound(__first, __last, __val,
+@@ -2291,7 +2285,6 @@
+ __val, __comp);
+ __glibcxx_requires_partitioned_upper_pred(__first, __last,
+ __val, __comp);
+- __glibcxx_requires_irreflexive_pred2(__first, __last, __comp);
+
+ _ForwardIterator __i
+ = std::__lower_bound(__first, __last, __val,
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libstdc++-v3/include/bits/stl_algobase.h gcc-6-20160721/libstdc++-v3/include/bits/stl_algobase.h
+--- gcc-6.1.0/libstdc++-v3/include/bits/stl_algobase.h 2016-01-26 19:38:20.000000000 +0000
++++ gcc-6-20160721/libstdc++-v3/include/bits/stl_algobase.h 2016-06-17 18:53:46.000000000 +0000
+@@ -989,7 +989,6 @@
+ __glibcxx_function_requires(_LessThanOpConcept<
+ typename iterator_traits<_ForwardIterator>::value_type, _Tp>)
+ __glibcxx_requires_partitioned_lower(__first, __last, __val);
+- __glibcxx_requires_irreflexive2(__first, __last);
+
+ return std::__lower_bound(__first, __last, __val,
+ __gnu_cxx::__ops::__iter_less_val());
+@@ -1214,9 +1213,7 @@
+ __glibcxx_function_requires(_LessThanOpConcept<_ValueType1, _ValueType2>)
+ __glibcxx_function_requires(_LessThanOpConcept<_ValueType2, _ValueType1>)
+ __glibcxx_requires_valid_range(__first1, __last1);
+- __glibcxx_requires_irreflexive2(__first1, __last1);
+ __glibcxx_requires_valid_range(__first2, __last2);
+- __glibcxx_requires_irreflexive2(__first2, __last2);
+
+ return std::__lexicographical_compare_aux(std::__niter_base(__first1),
+ std::__niter_base(__last1),
+@@ -1246,9 +1243,7 @@
+ __glibcxx_function_requires(_InputIteratorConcept<_II1>)
+ __glibcxx_function_requires(_InputIteratorConcept<_II2>)
+ __glibcxx_requires_valid_range(__first1, __last1);
+- __glibcxx_requires_irreflexive_pred2(__first1, __last1, __comp);
+ __glibcxx_requires_valid_range(__first2, __last2);
+- __glibcxx_requires_irreflexive_pred2(__first2, __last2, __comp);
+
+ return std::__lexicographical_compare_impl
+ (__first1, __last1, __first2, __last2,
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libstdc++-v3/include/experimental/any gcc-6-20160721/libstdc++-v3/include/experimental/any
+--- gcc-6.1.0/libstdc++-v3/include/experimental/any 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/libstdc++-v3/include/experimental/any 2016-07-05 20:06:31.000000000 +0000
+@@ -158,7 +158,9 @@
+
+ /// Construct with a copy of @p __value as the contained object.
+ template <typename _ValueType, typename _Tp = _Decay<_ValueType>,
+- typename _Mgr = _Manager<_Tp>>
++ typename _Mgr = _Manager<_Tp>,
++ typename enable_if<is_constructible<_Tp, _ValueType&&>::value,
++ bool>::type = true>
+ any(_ValueType&& __value)
+ : _M_manager(&_Mgr::_S_manage)
+ {
+@@ -167,6 +169,19 @@
+ "The contained object must be CopyConstructible");
+ }
+
++ /// Construct with a copy of @p __value as the contained object.
++ template <typename _ValueType, typename _Tp = _Decay<_ValueType>,
++ typename _Mgr = _Manager<_Tp>,
++ typename enable_if<!is_constructible<_Tp, _ValueType&&>::value,
++ bool>::type = false>
++ any(_ValueType&& __value)
++ : _M_manager(&_Mgr::_S_manage)
++ {
++ _Mgr::_S_create(_M_storage, __value);
++ static_assert(is_copy_constructible<_Tp>::value,
++ "The contained object must be CopyConstructible");
++ }
++
+ /// Destructor, calls @c clear()
+ ~any() { clear(); }
+
+@@ -377,7 +392,10 @@
+ __throw_bad_any_cast();
+ }
+
+- template<typename _ValueType>
++ template<typename _ValueType,
++ typename enable_if<!is_move_constructible<_ValueType>::value
++ || is_lvalue_reference<_ValueType>::value,
++ bool>::type = true>
+ inline _ValueType any_cast(any&& __any)
+ {
+ static_assert(any::__is_valid_cast<_ValueType>(),
+@@ -387,6 +405,20 @@
+ return *__p;
+ __throw_bad_any_cast();
+ }
++
++ template<typename _ValueType,
++ typename enable_if<is_move_constructible<_ValueType>::value
++ && !is_lvalue_reference<_ValueType>::value,
++ bool>::type = false>
++ inline _ValueType any_cast(any&& __any)
++ {
++ static_assert(any::__is_valid_cast<_ValueType>(),
++ "Template argument must be a reference or CopyConstructible type");
++ auto __p = any_cast<remove_reference_t<_ValueType>>(&__any);
++ if (__p)
++ return std::move(*__p);
++ __throw_bad_any_cast();
++ }
+ // @}
+
+ template<typename _Tp>
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libstdc++-v3/include/experimental/bits/fs_dir.h gcc-6-20160721/libstdc++-v3/include/experimental/bits/fs_dir.h
+--- gcc-6.1.0/libstdc++-v3/include/experimental/bits/fs_dir.h 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/libstdc++-v3/include/experimental/bits/fs_dir.h 2016-05-25 15:45:30.000000000 +0000
+@@ -153,8 +153,25 @@
+ };
+
+ struct _Dir;
++ class directory_iterator;
+ class recursive_directory_iterator;
+
++ struct __directory_iterator_proxy
++ {
++ const directory_entry& operator*() const& noexcept { return _M_entry; }
++
++ directory_entry operator*() && noexcept { return std::move(_M_entry); }
++
++ private:
++ friend class directory_iterator;
++ friend class recursive_directory_iterator;
++
++ explicit
++ __directory_iterator_proxy(const directory_entry& __e) : _M_entry(__e) { }
++
++ directory_entry _M_entry;
++ };
++
+ class directory_iterator
+ {
+ public:
+@@ -177,7 +194,8 @@
+ : directory_iterator(__p, directory_options::none, __ec) { }
+
+ directory_iterator(const path& __p,
+- directory_options __options, error_code& __ec) noexcept
++ directory_options __options,
++ error_code& __ec) noexcept
+ : directory_iterator(__p, __options, &__ec) { }
+
+ directory_iterator(const directory_iterator& __rhs) = default;
+@@ -186,19 +204,22 @@
+
+ ~directory_iterator() = default;
+
+- directory_iterator& operator=(const directory_iterator& __rhs) = default;
+- directory_iterator& operator=(directory_iterator&& __rhs) noexcept = default;
++ directory_iterator&
++ operator=(const directory_iterator& __rhs) = default;
++
++ directory_iterator&
++ operator=(directory_iterator&& __rhs) noexcept = default;
+
+ const directory_entry& operator*() const;
+ const directory_entry* operator->() const { return &**this; }
+ directory_iterator& operator++();
+ directory_iterator& increment(error_code& __ec) noexcept;
+
+- directory_iterator operator++(int)
++ __directory_iterator_proxy operator++(int)
+ {
+- auto __tmp = *this;
++ __directory_iterator_proxy __pr{**this};
+ ++*this;
+- return __tmp;
++ return __pr;
+ }
+
+ private:
+@@ -214,10 +235,12 @@
+ };
+
+ inline directory_iterator
+- begin(directory_iterator __iter) { return __iter; }
++ begin(directory_iterator __iter) noexcept
++ { return __iter; }
+
+ inline directory_iterator
+- end(directory_iterator) { return directory_iterator(); }
++ end(directory_iterator) noexcept
++ { return directory_iterator(); }
+
+ inline bool
+ operator==(const directory_iterator& __lhs, const directory_iterator& __rhs)
+@@ -274,18 +297,18 @@
+
+ // modifiers
+ recursive_directory_iterator&
+- operator=(const recursive_directory_iterator& __rhs) noexcept;
++ operator=(const recursive_directory_iterator& __rhs) noexcept;
+ recursive_directory_iterator&
+- operator=(recursive_directory_iterator&& __rhs) noexcept;
++ operator=(recursive_directory_iterator&& __rhs) noexcept;
+
+ recursive_directory_iterator& operator++();
+ recursive_directory_iterator& increment(error_code& __ec) noexcept;
+
+- recursive_directory_iterator operator++(int)
++ __directory_iterator_proxy operator++(int)
+ {
+- auto __tmp = *this;
++ __directory_iterator_proxy __pr{**this};
+ ++*this;
+- return __tmp;
++ return __pr;
+ }
+
+ void pop();
+@@ -301,15 +324,17 @@
+
+ struct _Dir_stack;
+ std::shared_ptr<_Dir_stack> _M_dirs;
+- directory_options _M_options;
+- bool _M_pending;
++ directory_options _M_options = {};
++ bool _M_pending = false;
+ };
+
+ inline recursive_directory_iterator
+- begin(recursive_directory_iterator __iter) { return __iter; }
++ begin(recursive_directory_iterator __iter) noexcept
++ { return __iter; }
+
+ inline recursive_directory_iterator
+- end(recursive_directory_iterator) { return recursive_directory_iterator(); }
++ end(recursive_directory_iterator) noexcept
++ { return recursive_directory_iterator(); }
+
+ inline bool
+ operator==(const recursive_directory_iterator& __lhs,
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libstdc++-v3/include/experimental/bits/fs_fwd.h gcc-6-20160721/libstdc++-v3/include/experimental/bits/fs_fwd.h
+--- gcc-6.1.0/libstdc++-v3/include/experimental/bits/fs_fwd.h 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/libstdc++-v3/include/experimental/bits/fs_fwd.h 2016-05-25 15:44:02.000000000 +0000
+@@ -93,7 +93,7 @@
+ };
+
+ constexpr copy_options
+- operator&(copy_options __x, copy_options __y)
++ operator&(copy_options __x, copy_options __y) noexcept
+ {
+ using __utype = typename std::underlying_type<copy_options>::type;
+ return static_cast<copy_options>(
+@@ -101,7 +101,7 @@
+ }
+
+ constexpr copy_options
+- operator|(copy_options __x, copy_options __y)
++ operator|(copy_options __x, copy_options __y) noexcept
+ {
+ using __utype = typename std::underlying_type<copy_options>::type;
+ return static_cast<copy_options>(
+@@ -109,7 +109,7 @@
+ }
+
+ constexpr copy_options
+- operator^(copy_options __x, copy_options __y)
++ operator^(copy_options __x, copy_options __y) noexcept
+ {
+ using __utype = typename std::underlying_type<copy_options>::type;
+ return static_cast<copy_options>(
+@@ -117,22 +117,22 @@
+ }
+
+ constexpr copy_options
+- operator~(copy_options __x)
++ operator~(copy_options __x) noexcept
+ {
+ using __utype = typename std::underlying_type<copy_options>::type;
+ return static_cast<copy_options>(~static_cast<__utype>(__x));
+ }
+
+ inline copy_options&
+- operator&=(copy_options& __x, copy_options __y)
++ operator&=(copy_options& __x, copy_options __y) noexcept
+ { return __x = __x & __y; }
+
+ inline copy_options&
+- operator|=(copy_options& __x, copy_options __y)
++ operator|=(copy_options& __x, copy_options __y) noexcept
+ { return __x = __x | __y; }
+
+ inline copy_options&
+- operator^=(copy_options& __x, copy_options __y)
++ operator^=(copy_options& __x, copy_options __y) noexcept
+ { return __x = __x ^ __y; }
+
+
+@@ -163,7 +163,7 @@
+ };
+
+ constexpr perms
+- operator&(perms __x, perms __y)
++ operator&(perms __x, perms __y) noexcept
+ {
+ using __utype = typename std::underlying_type<perms>::type;
+ return static_cast<perms>(
+@@ -171,7 +171,7 @@
+ }
+
+ constexpr perms
+- operator|(perms __x, perms __y)
++ operator|(perms __x, perms __y) noexcept
+ {
+ using __utype = typename std::underlying_type<perms>::type;
+ return static_cast<perms>(
+@@ -179,7 +179,7 @@
+ }
+
+ constexpr perms
+- operator^(perms __x, perms __y)
++ operator^(perms __x, perms __y) noexcept
+ {
+ using __utype = typename std::underlying_type<perms>::type;
+ return static_cast<perms>(
+@@ -187,22 +187,22 @@
+ }
+
+ constexpr perms
+- operator~(perms __x)
++ operator~(perms __x) noexcept
+ {
+ using __utype = typename std::underlying_type<perms>::type;
+ return static_cast<perms>(~static_cast<__utype>(__x));
+ }
+
+ inline perms&
+- operator&=(perms& __x, perms __y)
++ operator&=(perms& __x, perms __y) noexcept
+ { return __x = __x & __y; }
+
+ inline perms&
+- operator|=(perms& __x, perms __y)
++ operator|=(perms& __x, perms __y) noexcept
+ { return __x = __x | __y; }
+
+ inline perms&
+- operator^=(perms& __x, perms __y)
++ operator^=(perms& __x, perms __y) noexcept
+ { return __x = __x ^ __y; }
+
+ // Bitmask type
+@@ -211,7 +211,7 @@
+ };
+
+ constexpr directory_options
+- operator&(directory_options __x, directory_options __y)
++ operator&(directory_options __x, directory_options __y) noexcept
+ {
+ using __utype = typename std::underlying_type<directory_options>::type;
+ return static_cast<directory_options>(
+@@ -219,7 +219,7 @@
+ }
+
+ constexpr directory_options
+- operator|(directory_options __x, directory_options __y)
++ operator|(directory_options __x, directory_options __y) noexcept
+ {
+ using __utype = typename std::underlying_type<directory_options>::type;
+ return static_cast<directory_options>(
+@@ -227,7 +227,7 @@
+ }
+
+ constexpr directory_options
+- operator^(directory_options __x, directory_options __y)
++ operator^(directory_options __x, directory_options __y) noexcept
+ {
+ using __utype = typename std::underlying_type<directory_options>::type;
+ return static_cast<directory_options>(
+@@ -235,22 +235,22 @@
+ }
+
+ constexpr directory_options
+- operator~(directory_options __x)
++ operator~(directory_options __x) noexcept
+ {
+ using __utype = typename std::underlying_type<directory_options>::type;
+ return static_cast<directory_options>(~static_cast<__utype>(__x));
+ }
+
+ inline directory_options&
+- operator&=(directory_options& __x, directory_options __y)
++ operator&=(directory_options& __x, directory_options __y) noexcept
+ { return __x = __x & __y; }
+
+ inline directory_options&
+- operator|=(directory_options& __x, directory_options __y)
++ operator|=(directory_options& __x, directory_options __y) noexcept
+ { return __x = __x | __y; }
+
+ inline directory_options&
+- operator^=(directory_options& __x, directory_options __y)
++ operator^=(directory_options& __x, directory_options __y) noexcept
+ { return __x = __x ^ __y; }
+
+ typedef chrono::time_point<chrono::system_clock> file_time_type;
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libstdc++-v3/include/experimental/functional gcc-6-20160721/libstdc++-v3/include/experimental/functional
+--- gcc-6.1.0/libstdc++-v3/include/experimental/functional 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/libstdc++-v3/include/experimental/functional 2016-07-19 22:16:35.000000000 +0000
+@@ -42,6 +42,9 @@
+ #include <vector>
+ #include <array>
+ #include <bits/stl_algo.h>
++#ifdef _GLIBCXX_PARALLEL
++# include <parallel/algorithm> // For std::__parallel::search
++#endif
+
+ namespace std _GLIBCXX_VISIBILITY(default)
+ {
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libstdc++-v3/include/experimental/optional gcc-6-20160721/libstdc++-v3/include/experimental/optional
+--- gcc-6.1.0/libstdc++-v3/include/experimental/optional 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/libstdc++-v3/include/experimental/optional 2016-07-06 13:58:32.000000000 +0000
+@@ -470,6 +470,23 @@
+ bool _M_engaged = false;
+ };
+
++ template<typename _Tp>
++ class optional;
++
++ template<typename>
++ struct __is_optional_impl : false_type
++ { };
++
++ template<typename _Tp>
++ struct __is_optional_impl<optional<_Tp>> : true_type
++ { };
++
++ template<typename _Tp>
++ struct __is_optional
++ : public __is_optional_impl<std::remove_cv_t<std::remove_reference_t<_Tp>>>
++ { };
++
++
+ /**
+ * @brief Class template for optional values.
+ */
+@@ -502,6 +519,78 @@
+ // _Optional_base has the responsibility for construction.
+ using _Base::_Base;
+
++ constexpr optional() = default;
++ // Converting constructors for engaged optionals.
++ template <typename _Up,
++ enable_if_t<__and_<
++ __not_<is_same<_Tp, _Up>>,
++ is_constructible<_Tp, _Up&&>,
++ is_convertible<_Up&&, _Tp>
++ >::value, bool> = true>
++ constexpr optional(_Up&& __t)
++ : _Base(_Tp(std::forward<_Up>(__t))) { }
++
++ template <typename _Up,
++ enable_if_t<__and_<
++ __not_<is_same<_Tp, _Up>>,
++ is_constructible<_Tp, _Up&&>,
++ __not_<is_convertible<_Up&&, _Tp>>
++ >::value, bool> = false>
++ explicit constexpr optional(_Up&& __t)
++ : _Base(_Tp(std::forward<_Up>(__t))) { }
++
++ template <typename _Up,
++ enable_if_t<__and_<
++ __not_<is_same<_Tp, _Up>>,
++ __not_<is_constructible<
++ _Tp, const optional<_Up>&>>,
++ __not_<is_convertible<
++ const optional<_Up>&, _Tp>>,
++ is_constructible<_Tp, const _Up&>,
++ is_convertible<const _Up&, _Tp>
++ >::value, bool> = true>
++ constexpr optional(const optional<_Up>& __t)
++ : _Base(__t ? optional<_Tp>(*__t) : optional<_Tp>()) { }
++
++ template <typename _Up,
++ enable_if_t<__and_<
++ __not_<is_same<_Tp, _Up>>,
++ __not_<is_constructible<
++ _Tp, const optional<_Up>&>>,
++ __not_<is_convertible<
++ const optional<_Up>&, _Tp>>,
++ is_constructible<_Tp, const _Up&>,
++ __not_<is_convertible<const _Up&, _Tp>>
++ >::value, bool> = false>
++ explicit constexpr optional(const optional<_Up>& __t)
++ : _Base(__t ? optional<_Tp>(*__t) : optional<_Tp>()) { }
++
++ template <typename _Up,
++ enable_if_t<__and_<
++ __not_<is_same<_Tp, _Up>>,
++ __not_<is_constructible<
++ _Tp, optional<_Up>&&>>,
++ __not_<is_convertible<
++ optional<_Up>&&, _Tp>>,
++ is_constructible<_Tp, _Up&&>,
++ is_convertible<_Up&&, _Tp>
++ >::value, bool> = true>
++ constexpr optional(optional<_Up>&& __t)
++ : _Base(__t ? optional<_Tp>(std::move(*__t)) : optional<_Tp>()) { }
++
++ template <typename _Up,
++ enable_if_t<__and_<
++ __not_<is_same<_Tp, _Up>>,
++ __not_<is_constructible<
++ _Tp, optional<_Up>&&>>,
++ __not_<is_convertible<
++ optional<_Up>&&, _Tp>>,
++ is_constructible<_Tp, _Up&&>,
++ __not_<is_convertible<_Up&&, _Tp>>
++ >::value, bool> = false>
++ explicit constexpr optional(optional<_Up>&& __t)
++ : _Base(__t ? optional<_Tp>(std::move(*__t)) : optional<_Tp>()) { }
++
+ // [X.Y.4.3] (partly) Assignment.
+ optional&
+ operator=(nullopt_t) noexcept
+@@ -510,8 +599,12 @@
+ return *this;
+ }
+
+- template<typename _Up>
+- enable_if_t<is_same<_Tp, decay_t<_Up>>::value, optional&>
++ template<typename _Up,
++ enable_if_t<__and_<
++ __not_<is_same<_Up, nullopt_t>>,
++ __not_<__is_optional<_Up>>>::value,
++ bool> = true>
++ optional&
+ operator=(_Up&& __u)
+ {
+ static_assert(__and_<is_constructible<_Tp, _Up>,
+@@ -525,6 +618,57 @@
+
+ return *this;
+ }
++
++ template<typename _Up,
++ enable_if_t<__and_<
++ __not_<is_same<_Tp, _Up>>>::value,
++ bool> = true>
++ optional&
++ operator=(const optional<_Up>& __u)
++ {
++ static_assert(__and_<is_constructible<_Tp, _Up>,
++ is_assignable<_Tp&, _Up>>(),
++ "Cannot assign to value type from argument");
++
++ if (__u)
++ {
++ if (this->_M_is_engaged())
++ this->_M_get() = *__u;
++ else
++ this->_M_construct(*__u);
++ }
++ else
++ {
++ this->_M_reset();
++ }
++ return *this;
++ }
++
++ template<typename _Up,
++ enable_if_t<__and_<
++ __not_<is_same<_Tp, _Up>>>::value,
++ bool> = true>
++ optional&
++ operator=(optional<_Up>&& __u)
++ {
++ static_assert(__and_<is_constructible<_Tp, _Up>,
++ is_assignable<_Tp&, _Up>>(),
++ "Cannot assign to value type from argument");
++
++ if (__u)
++ {
++ if (this->_M_is_engaged())
++ this->_M_get() = std::move(*__u);
++ else
++ this->_M_construct(std::move(*__u));
++ }
++ else
++ {
++ this->_M_reset();
++ }
++
++ return *this;
++ }
+
+ template<typename... _Args>
+ void
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libstdc++-v3/include/parallel/balanced_quicksort.h gcc-6-20160721/libstdc++-v3/include/parallel/balanced_quicksort.h
+--- gcc-6.1.0/libstdc++-v3/include/parallel/balanced_quicksort.h 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/libstdc++-v3/include/parallel/balanced_quicksort.h 2016-07-19 22:16:23.000000000 +0000
+@@ -53,6 +53,9 @@
+
+ #if _GLIBCXX_ASSERTIONS
+ #include <parallel/checkers.h>
++#ifdef _GLIBCXX_HAVE_UNISTD_H
++#include <unistd.h>
++#endif
+ #endif
+
+ namespace __gnu_parallel
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libstdc++-v3/include/parallel/compiletime_settings.h gcc-6-20160721/libstdc++-v3/include/parallel/compiletime_settings.h
+--- gcc-6.1.0/libstdc++-v3/include/parallel/compiletime_settings.h 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/libstdc++-v3/include/parallel/compiletime_settings.h 2016-07-19 22:16:23.000000000 +0000
+@@ -55,12 +55,6 @@
+ #define _GLIBCXX_SCALE_DOWN_FPU 0
+ #endif
+
+-#ifndef _GLIBCXX_ASSERTIONS
+-/** @brief Switch on many _GLIBCXX_PARALLEL_ASSERTions in parallel code.
+- * Should be switched on only locally. */
+-#define _GLIBCXX_ASSERTIONS 0
+-#endif
+-
+ #ifndef _GLIBCXX_RANDOM_SHUFFLE_CONSIDER_L1
+ /** @brief Switch on many _GLIBCXX_PARALLEL_ASSERTions in parallel code.
+ * Consider the size of the L1 cache for
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libstdc++-v3/include/std/tuple gcc-6-20160721/libstdc++-v3/include/std/tuple
+--- gcc-6.1.0/libstdc++-v3/include/std/tuple 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/libstdc++-v3/include/std/tuple 2016-05-09 14:44:32.000000000 +0000
+@@ -500,6 +500,14 @@
+ __not_<is_constructible<_Elements..., _SrcTuple>>
+ >::value;
+ }
++ template<typename... _UElements>
++ static constexpr bool _NotSameTuple()
++ {
++ return __not_<is_same<tuple<_Elements...>,
++ typename remove_const<
++ typename remove_reference<_UElements...>::type
++ >::type>>::value;
++ }
+ };
+
+ template<typename... _Elements>
+@@ -534,6 +542,11 @@
+ {
+ return true;
+ }
++ template<typename... _UElements>
++ static constexpr bool _NotSameTuple()
++ {
++ return true;
++ }
+ };
+
+ /// Primary class template, tuple
+@@ -611,7 +624,10 @@
+ _Elements...>;
+
+ template<typename... _UElements, typename
+- enable_if<_TMC<_UElements...>::template
++ enable_if<
++ _TC<sizeof...(_UElements) == 1, _Elements...>::template
++ _NotSameTuple<_UElements...>()
++ && _TMC<_UElements...>::template
+ _MoveConstructibleTuple<_UElements...>()
+ && _TMC<_UElements...>::template
+ _ImplicitlyMoveConvertibleTuple<_UElements...>()
+@@ -621,7 +637,10 @@
+ : _Inherited(std::forward<_UElements>(__elements)...) { }
+
+ template<typename... _UElements, typename
+- enable_if<_TMC<_UElements...>::template
++ enable_if<
++ _TC<sizeof...(_UElements) == 1, _Elements...>::template
++ _NotSameTuple<_UElements...>()
++ && _TMC<_UElements...>::template
+ _MoveConstructibleTuple<_UElements...>()
+ && !_TMC<_UElements...>::template
+ _ImplicitlyMoveConvertibleTuple<_UElements...>()
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libstdc++-v3/src/c++11/codecvt.cc gcc-6-20160721/libstdc++-v3/src/c++11/codecvt.cc
+--- gcc-6.1.0/libstdc++-v3/src/c++11/codecvt.cc 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/libstdc++-v3/src/c++11/codecvt.cc 2016-05-25 16:33:03.000000000 +0000
+@@ -789,7 +789,11 @@
+ {
+ range<const char> from{ __from, __from_end };
+ range<char16_t> to{ __to, __to_end };
+- auto res = ucs2_in(from, to, _M_maxcode, _M_mode);
++ codecvt_mode mode = codecvt_mode(_M_mode & (consume_header|generate_header));
++#if __BYTE_ORDER__ != __ORDER_BIG_ENDIAN__
++ mode = codecvt_mode(mode | little_endian);
++#endif
++ auto res = ucs2_in(from, to, _M_maxcode, mode);
+ __from_next = from.next;
+ __to_next = to.next;
+ return res;
+@@ -1264,7 +1268,7 @@
+ {
+ range<const char> from{ __from, __from_end };
+ range<char16_t> to{ __to, __to_end };
+- codecvt_mode mode = codecvt_mode(_M_mode | (consume_header|generate_header));
++ codecvt_mode mode = codecvt_mode(_M_mode & (consume_header|generate_header));
+ #if __BYTE_ORDER__ != __ORDER_BIG_ENDIAN__
+ mode = codecvt_mode(mode | little_endian);
+ #endif
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libstdc++-v3/src/c++11/cow-stdexcept.cc gcc-6-20160721/libstdc++-v3/src/c++11/cow-stdexcept.cc
+--- gcc-6.1.0/libstdc++-v3/src/c++11/cow-stdexcept.cc 2016-01-18 20:09:55.000000000 +0000
++++ gcc-6-20160721/libstdc++-v3/src/c++11/cow-stdexcept.cc 2016-05-11 19:06:45.000000000 +0000
+@@ -292,6 +292,7 @@
+ return (const char*) txnal_read_ptr((void**)&bs->_M_dataplus._M_p);
+ }
+
++#if _GLIBCXX_USE_DUAL_ABI
+ const char*
+ _txnal_sso_string_c_str(const void* that)
+ {
+@@ -299,6 +300,7 @@
+ (void* const*)const_cast<char* const*>(
+ &((const std::__sso_string*) that)->_M_s._M_p));
+ }
++#endif
+
+ void
+ _txnal_cow_string_D1_commit(void* data)
+@@ -344,9 +346,24 @@
+ // result in undefined behavior, which is in this case not initializing this
+ // string.
+ #if _GLIBCXX_USE_DUAL_ABI
+-#define CTORDTORSTRINGCSTR(s) _txnal_sso_string_c_str((s))
++#define CTORS_FROM_SSOSTRING(NAME, CLASS, BASE) \
++void \
++_ZGTtNSt##NAME##C1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE( \
++ CLASS* that, const std::__sso_string& s) \
++{ \
++ CLASS e(""); \
++ _ITM_memcpyRnWt(that, &e, sizeof(CLASS)); \
++ /* Get the C string from the SSO string. */ \
++ _txnal_cow_string_C1_for_exceptions(_txnal_##BASE##_get_msg(that), \
++ _txnal_sso_string_c_str(&s), that); \
++} \
++void \
++_ZGTtNSt##NAME##C2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE( \
++ CLASS*, const std::__sso_string&) __attribute__((alias \
++("_ZGTtNSt" #NAME \
++ "C1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE")));
+ #else
+-#define CTORDTORSTRINGCSTR(s) ""
++#define CTORS_FROM_SSOSTRING(NAME, CLASS, BASE)
+ #endif
+
+ // This macro defines transaction constructors and destructors for a specific
+@@ -373,21 +390,7 @@
+ void \
+ _ZGTtNSt##NAME##C2EPKc (CLASS*, const char*) \
+ __attribute__((alias ("_ZGTtNSt" #NAME "C1EPKc"))); \
+-void \
+-_ZGTtNSt##NAME##C1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE( \
+- CLASS* that, const std::__sso_string& s) \
+-{ \
+- CLASS e(""); \
+- _ITM_memcpyRnWt(that, &e, sizeof(CLASS)); \
+- /* Get the C string from the SSO string. */ \
+- _txnal_cow_string_C1_for_exceptions(_txnal_##BASE##_get_msg(that), \
+- CTORDTORSTRINGCSTR(&s), that); \
+-} \
+-void \
+-_ZGTtNSt##NAME##C2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE( \
+- CLASS*, const std::__sso_string&) __attribute__((alias \
+-("_ZGTtNSt" #NAME \
+- "C1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE"))); \
++CTORS_FROM_SSOSTRING(NAME, CLASS, BASE) \
+ void \
+ _ZGTtNSt##NAME##D1Ev(CLASS* that) \
+ { _txnal_cow_string_D1(_txnal_##BASE##_get_msg(that)); } \
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libstdc++-v3/src/filesystem/ops.cc gcc-6-20160721/libstdc++-v3/src/filesystem/ops.cc
+--- gcc-6.1.0/libstdc++-v3/src/filesystem/ops.cc 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/libstdc++-v3/src/filesystem/ops.cc 2016-07-19 16:34:23.000000000 +0000
+@@ -220,8 +220,9 @@
+ {
+ error_code ec;
+ path can = canonical(p, base, ec);
+- if (ec.value())
+- _GLIBCXX_THROW_OR_ABORT(filesystem_error("cannot canonicalize", p, ec));
++ if (ec)
++ _GLIBCXX_THROW_OR_ABORT(filesystem_error("cannot canonicalize", p, base,
++ ec));
+ return can;
+ }
+
+@@ -249,7 +250,7 @@
+ typedef struct ::stat stat_type;
+
+ inline fs::file_type
+- make_file_type(const stat_type& st)
++ make_file_type(const stat_type& st) noexcept
+ {
+ using fs::file_type;
+ #ifdef _GLIBCXX_HAVE_S_ISREG
+@@ -273,7 +274,7 @@
+ }
+
+ inline fs::file_status
+- make_file_status(const stat_type& st)
++ make_file_status(const stat_type& st) noexcept
+ {
+ return fs::file_status{
+ make_file_type(st),
+@@ -282,13 +283,13 @@
+ }
+
+ inline bool
+- is_not_found_errno(int err)
++ is_not_found_errno(int err) noexcept
+ {
+ return err == ENOENT || err == ENOTDIR;
+ }
+
+ inline fs::file_time_type
+- file_time(const stat_type& st)
++ file_time(const stat_type& st) noexcept
+ {
+ using namespace std::chrono;
+ return fs::file_time_type{
+@@ -300,6 +301,17 @@
+ };
+ }
+
++ // Returns true if the file descriptor was successfully closed,
++ // otherwise returns false and the reason will be in errno.
++ inline bool
++ close_fd(int fd)
++ {
++ while (::close(fd))
++ if (errno != EINTR)
++ return false;
++ return true;
++ }
++
+ bool
+ do_copy_file(const fs::path& from, const fs::path& to,
+ fs::copy_options option,
+@@ -376,7 +388,8 @@
+ }
+
+ struct CloseFD {
+- ~CloseFD() { if (fd != -1) ::close(fd); }
++ ~CloseFD() { if (fd != -1) close_fd(fd); }
++ bool close() { return close_fd(std::exchange(fd, -1)); }
+ int fd;
+ };
+
+@@ -401,34 +414,49 @@
+ return false;
+ }
+
++#ifdef _GLIBCXX_USE_FCHMOD
++ if (::fchmod(out.fd, from_st->st_mode))
++#elif _GLIBCXX_USE_FCHMODAT
++ if (::fchmodat(AT_FDCWD, to.c_str(), from_st->st_mode, 0))
++#else
++ if (::chmod(to.c_str(), from_st->st_mode))
++#endif
++ {
++ ec.assign(errno, std::generic_category());
++ return false;
++ }
++
+ #ifdef _GLIBCXX_USE_SENDFILE
+- auto n = ::sendfile(out.fd, in.fd, nullptr, from_st->st_size);
++ const auto n = ::sendfile(out.fd, in.fd, nullptr, from_st->st_size);
+ if (n != from_st->st_size)
+ {
+ ec.assign(errno, std::generic_category());
+ return false;
+ }
++ if (!out.close() || !in.close())
++ {
++ ec.assign(errno, std::generic_category());
++ return false;
++ }
+ #else
+ __gnu_cxx::stdio_filebuf<char> sbin(in.fd, std::ios::in);
+ __gnu_cxx::stdio_filebuf<char> sbout(out.fd, std::ios::out);
+- if ( !(std::ostream(&sbout) << &sbin) )
++ if (sbin.is_open())
++ in.fd = -1;
++ if (sbout.is_open())
++ out.fd = -1;
++ if (from_st->st_size && !(std::ostream(&sbout) << &sbin))
+ {
+ ec = std::make_error_code(std::errc::io_error);
+ return false;
+ }
+-#endif
+-
+-#ifdef _GLIBCXX_USE_FCHMOD
+- if (::fchmod(out.fd, from_st->st_mode))
+-#elif _GLIBCXX_USE_FCHMODAT
+- if (::fchmodat(AT_FDCWD, to.c_str(), from_st->st_mode, 0))
+-#else
+- if (::chmod(to.c_str(), from_st->st_mode))
+-#endif
++ if (!sbout.close() || !sbin.close())
+ {
+ ec.assign(errno, std::generic_category());
+ return false;
+ }
++#endif
++
+ ec.clear();
+ return true;
+ }
+@@ -439,13 +467,15 @@
+ fs::copy(const path& from, const path& to, copy_options options,
+ error_code& ec) noexcept
+ {
+- bool skip_symlinks = is_set(options, copy_options::skip_symlinks);
+- bool create_symlinks = is_set(options, copy_options::create_symlinks);
+- bool use_lstat = create_symlinks || skip_symlinks;
++ const bool skip_symlinks = is_set(options, copy_options::skip_symlinks);
++ const bool create_symlinks = is_set(options, copy_options::create_symlinks);
++ const bool copy_symlinks = is_set(options, copy_options::copy_symlinks);
++ const bool use_lstat = create_symlinks || skip_symlinks;
+
+ file_status f, t;
+ stat_type from_st, to_st;
+- if (use_lstat
++ // N4099 doesn't check copy_symlinks here, but I think that's a defect.
++ if (use_lstat || copy_symlinks
+ ? ::lstat(from.c_str(), &from_st)
+ : ::stat(from.c_str(), &from_st))
+ {
+@@ -488,7 +518,7 @@
+ {
+ if (skip_symlinks)
+ ec.clear();
+- else if (!exists(t) && is_set(options, copy_options::copy_symlinks))
++ else if (!exists(t) && copy_symlinks)
+ copy_symlink(from, to, ec);
+ else
+ // Not clear what should be done here.
+@@ -630,22 +660,26 @@
+ bool
+ create_dir(const fs::path& p, fs::perms perm, std::error_code& ec)
+ {
++ bool created = false;
+ #ifdef _GLIBCXX_HAVE_SYS_STAT_H
+ ::mode_t mode = static_cast<std::underlying_type_t<fs::perms>>(perm);
+ if (::mkdir(p.c_str(), mode))
+ {
+- ec.assign(errno, std::generic_category());
+- return false;
++ const int err = errno;
++ if (err != EEXIST || !is_directory(p))
++ ec.assign(err, std::generic_category());
++ else
++ ec.clear();
+ }
+ else
+ {
+ ec.clear();
+- return true;
++ created = true;
+ }
+ #else
+ ec = std::make_error_code(std::errc::not_supported);
+- return false;
+ #endif
++ return created;
+ }
+ } // namespace
+
+@@ -1050,6 +1084,28 @@
+
+ void fs::permissions(const path& p, perms prms, error_code& ec) noexcept
+ {
++ const bool add = is_set(prms, perms::add_perms);
++ const bool remove = is_set(prms, perms::remove_perms);
++ if (add && remove)
++ {
++ ec = std::make_error_code(std::errc::invalid_argument);
++ return;
++ }
++
++ prms &= perms::mask;
++
++ if (add || remove)
++ {
++ auto st = status(p, ec);
++ if (ec)
++ return;
++ auto curr = st.permissions();
++ if (add)
++ prms |= curr;
++ else
++ prms = curr & ~prms;
++ }
++
+ #if _GLIBCXX_USE_FCHMODAT
+ if (::fchmodat(AT_FDCWD, p.c_str(), static_cast<mode_t>(prms), 0))
+ #else
+@@ -1138,7 +1194,7 @@
+ uintmax_t count = 0;
+ if (ec.value() == 0 && fs.type() == file_type::directory)
+ for (directory_iterator d(p, ec), end; ec.value() == 0 && d != end; ++d)
+- count += fs::remove(d->path(), ec);
++ count += fs::remove_all(d->path(), ec);
+ if (ec.value())
+ return -1;
+ return fs::remove(p, ec) ? ++count : -1; // fs:remove() calls ec.clear()
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libstdc++-v3/testsuite/20_util/tuple/cons/element_accepts_anything_byval.cc gcc-6-20160721/libstdc++-v3/testsuite/20_util/tuple/cons/element_accepts_anything_byval.cc
+--- gcc-6.1.0/libstdc++-v3/testsuite/20_util/tuple/cons/element_accepts_anything_byval.cc 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/libstdc++-v3/testsuite/20_util/tuple/cons/element_accepts_anything_byval.cc 2016-05-09 14:44:32.000000000 +0000
+@@ -0,0 +1,30 @@
++// Copyright (C) 2016 Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library. This library is free
++// software; you can redistribute it and/or modify it under the
++// terms of the GNU General Public License as published by the
++// Free Software Foundation; either version 3, or (at your option)
++// any later version.
++
++// This library is distributed in the hope that it will be useful,
++// but WITHOUT ANY WARRANTY; without even the implied warranty of
++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++// GNU General Public License for more details.
++
++// You should have received a copy of the GNU General Public License along
++// with this library; see the file COPYING3. If not see
++// <http://www.gnu.org/licenses/>.
++
++#include <tuple>
++using namespace std;
++
++struct Something {
++ Something() { }
++ template <typename T> Something(T) { }
++};
++
++int main() {
++ tuple<Something> t1;
++ tuple<Something> t2 = t1;
++}
++
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libstdc++-v3/testsuite/22_locale/codecvt/codecvt_utf8/69703.cc gcc-6-20160721/libstdc++-v3/testsuite/22_locale/codecvt/codecvt_utf8/69703.cc
+--- gcc-6.1.0/libstdc++-v3/testsuite/22_locale/codecvt/codecvt_utf8/69703.cc 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/libstdc++-v3/testsuite/22_locale/codecvt/codecvt_utf8/69703.cc 2016-05-25 16:33:03.000000000 +0000
+@@ -0,0 +1,103 @@
++// Copyright (C) 2016 Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library. This library is free
++// software; you can redistribute it and/or modify it under the
++// terms of the GNU General Public License as published by the
++// Free Software Foundation; either version 3, or (at your option)
++// any later version.
++
++// This library is distributed in the hope that it will be useful,
++// but WITHOUT ANY WARRANTY; without even the implied warranty of
++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++// GNU General Public License for more details.
++
++// You should have received a copy of the GNU General Public License along
++// with this library; see the file COPYING3. If not see
++// <http://www.gnu.org/licenses/>.
++
++// { dg-options "-std=gnu++11" }
++
++#include <codecvt>
++#include <testsuite_hooks.h>
++
++void
++test01()
++{
++ bool test __attribute__((unused)) = true;
++
++ const char out[] = "abc";
++ char16_t in[4];
++ std::codecvt_utf8<char16_t> cvt;
++ std::mbstate_t st;
++ const char* no;
++ char16_t* ni;
++ auto res = cvt.in(st, out, out+3, no, in, in+3, ni);
++ VERIFY( res == std::codecvt_base::ok );
++ VERIFY( in[0] == u'a' );
++ VERIFY( in[1] == u'b' );
++ VERIFY( in[2] == u'c' );
++}
++
++void
++test02()
++{
++ bool test __attribute__((unused)) = true;
++
++ const char out[] = "abc";
++ char16_t in[4];
++ std::codecvt_utf8<char16_t, 0x10ffff, std::little_endian> cvt;
++ std::mbstate_t st;
++ const char* no;
++ char16_t* ni;
++ auto res = cvt.in(st, out, out+3, no, in, in+3, ni);
++ VERIFY( res == std::codecvt_base::ok );
++ VERIFY( in[0] == u'a' );
++ VERIFY( in[1] == u'b' );
++ VERIFY( in[2] == u'c' );
++}
++
++void
++test03()
++{
++ bool test __attribute__((unused)) = true;
++
++ const char out[] = "abc";
++ char32_t in[4];
++ std::codecvt_utf8<char32_t> cvt;
++ std::mbstate_t st;
++ const char* no;
++ char32_t* ni;
++ auto res = cvt.in(st, out, out+3, no, in, in+3, ni);
++ VERIFY( res == std::codecvt_base::ok );
++ VERIFY( in[0] == U'a' );
++ VERIFY( in[1] == U'b' );
++ VERIFY( in[2] == U'c' );
++}
++
++
++void
++test04()
++{
++ bool test __attribute__((unused)) = true;
++
++ const char out[] = "abc";
++ char32_t in[4];
++ std::codecvt_utf8<char32_t, 0x10ffff, std::little_endian> cvt;
++ std::mbstate_t st;
++ const char* no;
++ char32_t* ni;
++ auto res = cvt.in(st, out, out+3, no, in, in+3, ni);
++ VERIFY( res == std::codecvt_base::ok );
++ VERIFY( in[0] == U'a' );
++ VERIFY( in[1] == U'b' );
++ VERIFY( in[2] == U'c' );
++}
++
++int
++main()
++{
++ test01();
++ test02();
++ test01();
++ test02();
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libstdc++-v3/testsuite/22_locale/codecvt/codecvt_utf8_utf16/66855.cc gcc-6-20160721/libstdc++-v3/testsuite/22_locale/codecvt/codecvt_utf8_utf16/66855.cc
+--- gcc-6.1.0/libstdc++-v3/testsuite/22_locale/codecvt/codecvt_utf8_utf16/66855.cc 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/libstdc++-v3/testsuite/22_locale/codecvt/codecvt_utf8_utf16/66855.cc 2016-05-25 16:33:03.000000000 +0000
+@@ -45,8 +45,35 @@
+ VERIFY( buf[3] == utf16[3] );
+ }
+
++void
++test02()
++{
++ // Endianness flag should make no difference.
++ std::codecvt_utf8_utf16<char16_t, 0x10ffff, std::little_endian> cvt;
++ char16_t utf16[] = u"\ub098\ub294\ud0dc\uc624";
++ const char16_t* nf16;
++ char utf8[16];
++ char* nt8;
++ std::mbstate_t st{};
++ auto res = cvt.out(st, utf16, utf16+4, nf16, utf8, utf8+16, nt8);
++ VERIFY( res == std::codecvt_base::ok );
++
++ st = {};
++ char16_t buf[4] = {};
++ const char* nf8 = nt8;
++ char16_t* nt16;
++ res = cvt.in(st, utf8, nf8, nf8, buf, buf+4, nt16);
++ VERIFY( res == std::codecvt_base::ok );
++ VERIFY( nt16 == buf+4 );
++ VERIFY( buf[0] == utf16[0] );
++ VERIFY( buf[1] == utf16[1] );
++ VERIFY( buf[2] == utf16[2] );
++ VERIFY( buf[3] == utf16[3] );
++}
++
+ int
+ main()
+ {
+ test01();
++ test02();
+ }
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libstdc++-v3/testsuite/25_algorithms/binary_search/partitioned.cc gcc-6-20160721/libstdc++-v3/testsuite/25_algorithms/binary_search/partitioned.cc
+--- gcc-6.1.0/libstdc++-v3/testsuite/25_algorithms/binary_search/partitioned.cc 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/libstdc++-v3/testsuite/25_algorithms/binary_search/partitioned.cc 2016-06-17 18:53:46.000000000 +0000
+@@ -0,0 +1,67 @@
++// Copyright (C) 2016 Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library. This library is free
++// software; you can redistribute it and/or modify it under the
++// terms of the GNU General Public License as published by the
++// Free Software Foundation; either version 3, or (at your option)
++// any later version.
++
++// This library is distributed in the hope that it will be useful,
++// but WITHOUT ANY WARRANTY; without even the implied warranty of
++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++// GNU General Public License for more details.
++
++// You should have received a copy of the GNU General Public License along
++// with this library; see the file COPYING3. If not see
++// <http://www.gnu.org/licenses/>.
++
++// { dg-options "-std=gnu++11 -D_GLIBCXX_DEBUG" }
++
++#include <algorithm>
++#include <functional>
++#include <testsuite_iterators.h>
++#include <testsuite_hooks.h>
++
++using __gnu_test::test_container;
++using __gnu_test::forward_iterator_wrapper;
++
++struct X
++{
++ int val;
++
++ bool odd() const { return val % 2; }
++
++ // Partitioned so that all odd values come before even values:
++ bool operator<(const X& x) const { return this->odd() && !x.odd(); }
++};
++
++void
++test01()
++{
++ bool test __attribute((unused)) = true;
++
++ // Test with range that is partitioned, but not sorted.
++ X seq[] = { 1, 3, 5, 7, 1, 6, 4 };
++ test_container<X, forward_iterator_wrapper> c(seq);
++
++ auto b1 = std::binary_search(c.begin(), c.end(), X{2});
++ VERIFY( b1 );
++ auto b2 = std::binary_search(c.begin(), c.end(), X{2}, std::less<X>{});
++ VERIFY( b2 );
++
++ auto b3 = std::binary_search(c.begin(), c.end(), X{9});
++ VERIFY( b3 );
++ auto b4 = std::binary_search(c.begin(), c.end(), X{9}, std::less<X>{});
++ VERIFY( b4 );
++
++ auto b5 = std::binary_search(seq, seq+5, X{2});
++ VERIFY( !b5 );
++ auto b6 = std::binary_search(seq, seq+5, X{2}, std::less<X>{});
++ VERIFY( !b6 );
++}
++
++int
++main()
++{
++ test01();
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libstdc++-v3/testsuite/25_algorithms/equal_range/partitioned.cc gcc-6-20160721/libstdc++-v3/testsuite/25_algorithms/equal_range/partitioned.cc
+--- gcc-6.1.0/libstdc++-v3/testsuite/25_algorithms/equal_range/partitioned.cc 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/libstdc++-v3/testsuite/25_algorithms/equal_range/partitioned.cc 2016-06-17 18:53:46.000000000 +0000
+@@ -0,0 +1,66 @@
++// Copyright (C) 2016 Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library. This library is free
++// software; you can redistribute it and/or modify it under the
++// terms of the GNU General Public License as published by the
++// Free Software Foundation; either version 3, or (at your option)
++// any later version.
++
++// This library is distributed in the hope that it will be useful,
++// but WITHOUT ANY WARRANTY; without even the implied warranty of
++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++// GNU General Public License for more details.
++
++// You should have received a copy of the GNU General Public License along
++// with this library; see the file COPYING3. If not see
++// <http://www.gnu.org/licenses/>.
++
++// { dg-options "-std=gnu++11 -D_GLIBCXX_DEBUG" }
++
++#include <algorithm>
++#include <functional>
++#include <testsuite_iterators.h>
++#include <testsuite_hooks.h>
++
++using __gnu_test::test_container;
++using __gnu_test::forward_iterator_wrapper;
++
++struct X
++{
++ int val;
++
++ bool odd() const { return val % 2; }
++
++ // Partitioned so that all odd values come before even values:
++ bool operator<(const X& x) const { return this->odd() && !x.odd(); }
++};
++
++void
++test01()
++{
++ bool test __attribute((unused)) = true;
++
++ // Test with range that is partitioned, but not sorted.
++ X seq[] = { 1, 3, 5, 7, 1, 6, 4, 2 };
++ test_container<X, forward_iterator_wrapper> c(seq);
++
++ auto part1 = std::equal_range(c.begin(), c.end(), X{2});
++ VERIFY( part1.first != c.end() && part1.second == c.end() );
++ VERIFY( part1.first->val == 6 );
++ auto part2 = std::equal_range(c.begin(), c.end(), X{2}, std::less<X>{});
++ VERIFY( part2.first != c.end() && part1.second == c.end() );
++ VERIFY( part2.first->val == 6 );
++
++ auto part3 = std::equal_range(c.begin(), c.end(), X{9});
++ VERIFY( part3.first == c.begin() && part3.second != c.end() );
++ VERIFY( part3.second->val == 6 );
++ auto part4 = std::equal_range(c.begin(), c.end(), X{9}, std::less<X>{});
++ VERIFY( part4.first == c.begin() && part4.second != c.end() );
++ VERIFY( part4.second->val == 6 );
++}
++
++int
++main()
++{
++ test01();
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libstdc++-v3/testsuite/25_algorithms/lexicographical_compare/71545.cc gcc-6-20160721/libstdc++-v3/testsuite/25_algorithms/lexicographical_compare/71545.cc
+--- gcc-6.1.0/libstdc++-v3/testsuite/25_algorithms/lexicographical_compare/71545.cc 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/libstdc++-v3/testsuite/25_algorithms/lexicographical_compare/71545.cc 2016-06-17 18:53:46.000000000 +0000
+@@ -0,0 +1,35 @@
++// Copyright (C) 2016 Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library. This library is free
++// software; you can redistribute it and/or modify it under the
++// terms of the GNU General Public License as published by the
++// Free Software Foundation; either version 3, or (at your option)
++// any later version.
++
++// This library is distributed in the hope that it will be useful,
++// but WITHOUT ANY WARRANTY; without even the implied warranty of
++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++// GNU General Public License for more details.
++
++// You should have received a copy of the GNU General Public License along
++// with this library; see the file COPYING3. If not see
++// <http://www.gnu.org/licenses/>.
++
++// { dg-options "-std=gnu++11 -D_GLIBCXX_DEBUG" }
++// { dg-do link }
++
++#include <algorithm>
++
++struct X { };
++
++bool operator<(X, int) { return true; }
++bool operator<(int, X) { return false; }
++
++bool operator<(X, X); // undefined (PR libstdc++/71545)
++
++int main()
++{
++ X x[1];
++ int i[1];
++ std::lexicographical_compare(x, x+1, i, i+1);
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libstdc++-v3/testsuite/25_algorithms/lower_bound/partitioned.cc gcc-6-20160721/libstdc++-v3/testsuite/25_algorithms/lower_bound/partitioned.cc
+--- gcc-6.1.0/libstdc++-v3/testsuite/25_algorithms/lower_bound/partitioned.cc 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/libstdc++-v3/testsuite/25_algorithms/lower_bound/partitioned.cc 2016-06-17 18:53:46.000000000 +0000
+@@ -0,0 +1,100 @@
++// Copyright (C) 2016 Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library. This library is free
++// software; you can redistribute it and/or modify it under the
++// terms of the GNU General Public License as published by the
++// Free Software Foundation; either version 3, or (at your option)
++// any later version.
++
++// This library is distributed in the hope that it will be useful,
++// but WITHOUT ANY WARRANTY; without even the implied warranty of
++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++// GNU General Public License for more details.
++
++// You should have received a copy of the GNU General Public License along
++// with this library; see the file COPYING3. If not see
++// <http://www.gnu.org/licenses/>.
++
++// { dg-options "-std=gnu++11 -D_GLIBCXX_DEBUG" }
++
++#include <algorithm>
++#include <functional>
++#include <testsuite_iterators.h>
++#include <testsuite_hooks.h>
++
++using __gnu_test::test_container;
++using __gnu_test::forward_iterator_wrapper;
++
++struct X
++{
++ int val;
++
++ bool odd() const { return val % 2; }
++
++ // Partitioned so that all odd values come before even values:
++ bool operator<(const X& x) const { return this->odd() && !x.odd(); }
++};
++
++void
++test01()
++{
++ bool test __attribute((unused)) = true;
++
++ // Test with range that is partitioned, but not sorted.
++ X seq[] = { 1, 3, 5, 7, 1, 6, 4, 2 };
++ test_container<X, forward_iterator_wrapper> c(seq);
++
++ auto part1 = std::lower_bound(c.begin(), c.end(), X{2});
++ VERIFY( part1 != c.end() );
++ VERIFY( part1->val == 6 );
++ auto part2 = std::lower_bound(c.begin(), c.end(), X{2}, std::less<X>{});
++ VERIFY( part2 != c.end() );
++ VERIFY( part2->val == 6 );
++
++ auto part3 = std::lower_bound(c.begin(), c.end(), X{9});
++ VERIFY( part3 != c.end() );
++ VERIFY( part3->val == 1 );
++ auto part4 = std::lower_bound(c.begin(), c.end(), X{9}, std::less<X>{});
++ VERIFY( part4 != c.end() );
++ VERIFY( part4->val == 1 );
++}
++
++struct Y
++{
++ double val;
++
++ // Not irreflexive, so not a strict weak order.
++ bool operator<(const Y& y) const { return val < int(y.val); }
++};
++
++void
++test02()
++{
++ bool test __attribute((unused)) = true;
++
++ // Test that Debug Mode checks don't fire (libstdc++/71545)
++
++ Y seq[] = { -0.1, 1.2, 5.0, 5.2, 5.1, 5.9, 5.5, 6.0 };
++ test_container<Y, forward_iterator_wrapper> c(seq);
++
++ auto part1 = std::lower_bound(c.begin(), c.end(), Y{5.5});
++ VERIFY( part1 != c.end() );
++ VERIFY( part1->val == 5.0 );
++ auto part2 = std::lower_bound(c.begin(), c.end(), Y{5.5}, std::less<Y>{});
++ VERIFY( part2 != c.end() );
++ VERIFY( part2->val == 5.0 );
++
++ auto part3 = std::lower_bound(c.begin(), c.end(), Y{1.0});
++ VERIFY( part3 != c.end() );
++ VERIFY( part3->val == 1.2 );
++ auto part4 = std::lower_bound(c.begin(), c.end(), Y{1.0}, std::less<Y>{});
++ VERIFY( part4 != c.end() );
++ VERIFY( part4->val == 1.2 );
++}
++
++int
++main()
++{
++ test01();
++ test02();
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libstdc++-v3/testsuite/25_algorithms/upper_bound/partitioned.cc gcc-6-20160721/libstdc++-v3/testsuite/25_algorithms/upper_bound/partitioned.cc
+--- gcc-6.1.0/libstdc++-v3/testsuite/25_algorithms/upper_bound/partitioned.cc 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/libstdc++-v3/testsuite/25_algorithms/upper_bound/partitioned.cc 2016-06-17 18:53:46.000000000 +0000
+@@ -0,0 +1,98 @@
++// Copyright (C) 2016 Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library. This library is free
++// software; you can redistribute it and/or modify it under the
++// terms of the GNU General Public License as published by the
++// Free Software Foundation; either version 3, or (at your option)
++// any later version.
++
++// This library is distributed in the hope that it will be useful,
++// but WITHOUT ANY WARRANTY; without even the implied warranty of
++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++// GNU General Public License for more details.
++
++// You should have received a copy of the GNU General Public License along
++// with this library; see the file COPYING3. If not see
++// <http://www.gnu.org/licenses/>.
++
++// { dg-options "-std=gnu++11 -D_GLIBCXX_DEBUG" }
++
++#include <algorithm>
++#include <functional>
++#include <testsuite_iterators.h>
++#include <testsuite_hooks.h>
++
++using __gnu_test::test_container;
++using __gnu_test::forward_iterator_wrapper;
++
++struct X
++{
++ int val;
++
++ bool odd() const { return val % 2; }
++
++ // Partitioned so that all odd values come before even values:
++ bool operator<(const X& x) const { return this->odd() && !x.odd(); }
++};
++
++void
++test01()
++{
++ bool test __attribute((unused)) = true;
++
++ // Test with range that is partitioned, but not sorted.
++ X seq[] = { 1, 3, 5, 7, 1, 6, 4, 2 };
++ test_container<X, forward_iterator_wrapper> c(seq);
++
++ auto part1 = std::upper_bound(c.begin(), c.end(), X{2});
++ VERIFY( part1 == c.end() );
++ auto part2 = std::upper_bound(c.begin(), c.end(), X{2}, std::less<X>{});
++ VERIFY( part2 == c.end() );
++
++ auto part3 = std::upper_bound(c.begin(), c.end(), X{9});
++ VERIFY( part3 != c.end() );
++ VERIFY( part3->val == 6 );
++ auto part4 = std::upper_bound(c.begin(), c.end(), X{9}, std::less<X>{});
++ VERIFY( part3 != c.end() );
++ VERIFY( part4->val == 6 );
++}
++
++struct Y
++{
++ double val;
++
++ // Not irreflexive, so not a strict weak order.
++ bool operator<(const Y& y) const { return val < (int)y.val; }
++};
++
++void
++test02()
++{
++ bool test __attribute((unused)) = true;
++
++ // Test that Debug Mode checks don't fire (libstdc++/71545)
++
++ Y seq[] = { -0.1, 1.2, 5.0, 5.2, 5.1, 5.9, 5.5, 6.0 };
++ test_container<Y, forward_iterator_wrapper> c(seq);
++
++ auto part1 = std::upper_bound(c.begin(), c.end(), Y{5.5});
++ VERIFY( part1 != c.end() );
++ VERIFY( part1->val == 6.0 );
++ auto part2 = std::upper_bound(c.begin(), c.end(), Y{5.5}, std::less<Y>{});
++ VERIFY( part2 != c.end() );
++ VERIFY( part2->val == 6.0 );
++
++ auto part3 = std::upper_bound(c.begin(), c.end(), Y{1.0});
++ VERIFY( part3 != c.end() );
++ VERIFY( part3->val == 5.0 );
++ auto part4 = std::upper_bound(c.begin(), c.end(), Y{1.0}, std::less<Y>{});
++ VERIFY( part4 != c.end() );
++ VERIFY( part4->val == 5.0 );
++}
++
++int
++main()
++{
++ test01();
++ test02();
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libstdc++-v3/testsuite/experimental/any/misc/any_cast.cc gcc-6-20160721/libstdc++-v3/testsuite/experimental/any/misc/any_cast.cc
+--- gcc-6.1.0/libstdc++-v3/testsuite/experimental/any/misc/any_cast.cc 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/libstdc++-v3/testsuite/experimental/any/misc/any_cast.cc 2016-07-05 20:06:31.000000000 +0000
+@@ -77,8 +77,38 @@
+ }
+ }
+
++static int move_count = 0;
++
++void test03()
++{
++ struct MoveEnabled
++ {
++ MoveEnabled(MoveEnabled&&)
++ {
++ ++move_count;
++ }
++ MoveEnabled() = default;
++ MoveEnabled(const MoveEnabled&) = default;
++ };
++ MoveEnabled m;
++ MoveEnabled m2 = any_cast<MoveEnabled>(any(m));
++ VERIFY(move_count == 1);
++ MoveEnabled&& m3 = any_cast<MoveEnabled&&>(any(m));
++ VERIFY(move_count == 1);
++ struct MoveDeleted
++ {
++ MoveDeleted(MoveDeleted&&) = delete;
++ MoveDeleted() = default;
++ MoveDeleted(const MoveDeleted&) = default;
++ };
++ MoveDeleted md;
++ MoveDeleted&& md2 = any_cast<MoveDeleted>(any(std::move(md)));
++ MoveDeleted&& md3 = any_cast<MoveDeleted&&>(any(std::move(md)));
++}
++
+ int main()
+ {
+ test01();
+ test02();
++ test03();
+ }
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libstdc++-v3/testsuite/experimental/any/misc/any_cast_neg.cc gcc-6-20160721/libstdc++-v3/testsuite/experimental/any/misc/any_cast_neg.cc
+--- gcc-6.1.0/libstdc++-v3/testsuite/experimental/any/misc/any_cast_neg.cc 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/libstdc++-v3/testsuite/experimental/any/misc/any_cast_neg.cc 2016-07-05 20:06:31.000000000 +0000
+@@ -26,5 +26,5 @@
+ using std::experimental::any_cast;
+
+ const any y(1);
+- any_cast<int&>(y); // { dg-error "qualifiers" "" { target { *-*-* } } 353 }
++ any_cast<int&>(y); // { dg-error "qualifiers" "" { target { *-*-* } } 368 }
+ }
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libstdc++-v3/testsuite/experimental/filesystem/iterators/directory_iterator.cc gcc-6-20160721/libstdc++-v3/testsuite/experimental/filesystem/iterators/directory_iterator.cc
+--- gcc-6.1.0/libstdc++-v3/testsuite/experimental/filesystem/iterators/directory_iterator.cc 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/libstdc++-v3/testsuite/experimental/filesystem/iterators/directory_iterator.cc 2016-05-25 15:45:30.000000000 +0000
+@@ -70,8 +70,79 @@
+ remove_all(p, ec);
+ }
+
++void
++test02()
++{
++ bool test __attribute__((unused)) = false;
++
++ std::error_code ec;
++ const auto p = __gnu_test::nonexistent_path();
++ create_directory(p, fs::current_path(), ec);
++ create_directory_symlink(p, p / "l", ec);
++ VERIFY( !ec );
++
++ // Test post-increment (libstdc++/71005)
++ auto iter = fs::directory_iterator(p, ec);
++ VERIFY( !ec );
++ VERIFY( iter != fs::directory_iterator() );
++ const auto entry1 = *iter;
++ const auto entry2 = *iter++;
++ VERIFY( entry1 == entry2 );
++ VERIFY( entry1.path() == p/"l" );
++ VERIFY( iter == fs::directory_iterator() );
++
++ remove_all(p, ec);
++}
++
++void
++test03()
++{
++ bool test __attribute__((unused)) = false;
++
++ std::error_code ec;
++ const auto p = __gnu_test::nonexistent_path();
++ create_directories(p / "longer_than_small_string_buffer", ec);
++ VERIFY( !ec );
++
++ // Test for no reallocation on each dereference (this is a GNU extension)
++ auto iter = fs::directory_iterator(p, ec);
++ const auto* s1 = iter->path().c_str();
++ const auto* s2 = iter->path().c_str();
++ VERIFY( s1 == s2 );
++
++ remove_all(p, ec);
++}
++
++void
++test04()
++{
++ bool test __attribute__((unused)) = false;
++
++ const fs::directory_iterator it;
++ VERIFY( it == fs::directory_iterator() );
++}
++
++void
++test05()
++{
++ bool test __attribute__((unused)) = false;
++
++ auto p = __gnu_test::nonexistent_path();
++ create_directory(p);
++ create_directory_symlink(p, p / "l");
++ fs::directory_iterator it(p), endit;
++ VERIFY( begin(it) == it );
++ static_assert( noexcept(begin(it)), "begin is noexcept" );
++ VERIFY( end(it) == endit );
++ static_assert( noexcept(end(it)), "end is noexcept" );
++}
++
+ int
+ main()
+ {
+ test01();
++ test02();
++ test03();
++ test04();
++ test05();
+ }
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libstdc++-v3/testsuite/experimental/filesystem/iterators/recursive_directory_iterator.cc gcc-6-20160721/libstdc++-v3/testsuite/experimental/filesystem/iterators/recursive_directory_iterator.cc
+--- gcc-6.1.0/libstdc++-v3/testsuite/experimental/filesystem/iterators/recursive_directory_iterator.cc 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/libstdc++-v3/testsuite/experimental/filesystem/iterators/recursive_directory_iterator.cc 2016-05-25 15:45:30.000000000 +0000
+@@ -97,8 +97,83 @@
+ remove_all(p, ec);
+ }
+
++void
++test02()
++{
++ bool test __attribute__((unused)) = false;
++
++ std::error_code ec;
++ const auto p = __gnu_test::nonexistent_path();
++ create_directories(p / "d1/d2", ec);
++ VERIFY( !ec );
++
++ // Test post-increment (libstdc++/71005)
++ auto iter = fs::recursive_directory_iterator(p, ec);
++ VERIFY( !ec );
++ VERIFY( iter != fs::recursive_directory_iterator() );
++ const auto entry1 = *iter;
++ const auto entry2 = *iter++;
++ VERIFY( entry1 == entry2 );
++ VERIFY( entry1.path() == p/"d1" );
++ const auto entry3 = *iter;
++ const auto entry4 = *iter++;
++ VERIFY( entry3 == entry4 );
++ VERIFY( entry3.path() == p/"d1/d2" );
++ VERIFY( iter == fs::recursive_directory_iterator() );
++
++ remove_all(p, ec);
++}
++
++void
++test03()
++{
++ bool test __attribute__((unused)) = false;
++
++ std::error_code ec;
++ const auto p = __gnu_test::nonexistent_path();
++ create_directories(p / "longer_than_small_string_buffer", ec);
++ VERIFY( !ec );
++
++ // Test for no reallocation on each dereference (this is a GNU extension)
++ auto iter = fs::recursive_directory_iterator(p, ec);
++ const auto* s1 = iter->path().c_str();
++ const auto* s2 = iter->path().c_str();
++ VERIFY( s1 == s2 );
++
++ remove_all(p, ec);
++}
++
++void
++test04()
++{
++ bool test __attribute__((unused)) = false;
++
++ // libstdc++/71004
++ const fs::recursive_directory_iterator it;
++ VERIFY( it == fs::recursive_directory_iterator() );
++}
++
++void
++test05()
++{
++ bool test __attribute__((unused)) = false;
++
++ auto p = __gnu_test::nonexistent_path();
++ create_directory(p);
++ create_directory_symlink(p, p / "l");
++ fs::recursive_directory_iterator it(p), endit;
++ VERIFY( begin(it) == it );
++ static_assert( noexcept(begin(it)), "begin is noexcept" );
++ VERIFY( end(it) == endit );
++ static_assert( noexcept(end(it)), "end is noexcept" );
++}
++
+ int
+ main()
+ {
+ test01();
++ test02();
++ test03();
++ test04();
++ test05();
+ }
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libstdc++-v3/testsuite/experimental/filesystem/operations/canonical.cc gcc-6-20160721/libstdc++-v3/testsuite/experimental/filesystem/operations/canonical.cc
+--- gcc-6.1.0/libstdc++-v3/testsuite/experimental/filesystem/operations/canonical.cc 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/libstdc++-v3/testsuite/experimental/filesystem/operations/canonical.cc 2016-05-25 15:44:39.000000000 +0000
+@@ -59,8 +59,28 @@
+ VERIFY( !ec );
+ }
+
++void
++test02()
++{
++#if __cpp_exceptions
++ bool test __attribute__((unused)) = false;
++
++ fs::path p = "rel", base = __gnu_test::nonexistent_path();
++ fs::path e1, e2;
++ try {
++ canonical(p, base);
++ } catch (const fs::filesystem_error& e) {
++ e1 = e.path1();
++ e2 = e.path2();
++ }
++ VERIFY( e1 == p );
++ VERIFY( e2 == base );
++#endif
++}
++
+ int
+ main()
+ {
+ test01();
++ test02();
+ }
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libstdc++-v3/testsuite/experimental/filesystem/operations/copy.cc gcc-6-20160721/libstdc++-v3/testsuite/experimental/filesystem/operations/copy.cc
+--- gcc-6.1.0/libstdc++-v3/testsuite/experimental/filesystem/operations/copy.cc 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/libstdc++-v3/testsuite/experimental/filesystem/operations/copy.cc 2016-05-25 15:44:15.000000000 +0000
+@@ -21,34 +21,127 @@
+ // 15.3 Copy [fs.op.copy]
+
+ #include <experimental/filesystem>
++#include <fstream>
+ #include <testsuite_fs.h>
+ #include <testsuite_hooks.h>
+
+-using std::experimental::filesystem::path;
++namespace fs = std::experimental::filesystem;
+
++// Test error conditions.
+ void
+ test01()
+ {
+ bool test __attribute__((unused)) = false;
+
+- for (const path& p : __gnu_test::test_paths)
+- VERIFY( absolute(p).is_absolute() );
++ auto p = __gnu_test::nonexistent_path();
++ std::error_code ec;
++
++ VERIFY( !fs::exists(p) );
++ fs::copy(p, ".", fs::copy_options::none, ec);
++ VERIFY( ec );
++
++ ec.clear();
++ fs::copy(".", ".", fs::copy_options::none, ec);
++ VERIFY( ec );
++
++ std::ofstream{p.native()};
++ VERIFY( fs::is_directory(".") );
++ VERIFY( fs::is_regular_file(p) );
++ ec.clear();
++ fs::copy(".", p, fs::copy_options::none, ec);
++ VERIFY( ec );
++
++ remove(p, ec);
+ }
+
++// Test is_symlink(f) case.
+ void
+ test02()
+ {
+ bool test __attribute__((unused)) = false;
+
+- path p1("/");
+- VERIFY( absolute(p1) == p1 );
+- VERIFY( absolute(p1, "/bar") == p1 );
+- path p2("/foo");
+- VERIFY( absolute(p2) == p2 );
+- VERIFY( absolute(p2, "/bar") == p2 );
+- path p3("foo");
+- VERIFY( absolute(p3) != p3 );
+- VERIFY( absolute(p3, "/bar") == "/bar/foo" );
++ auto from = __gnu_test::nonexistent_path();
++ auto to = __gnu_test::nonexistent_path();
++ std::error_code ec;
++
++ fs::create_symlink(".", from, ec);
++ VERIFY( !ec );
++ VERIFY( fs::exists(from) );
++
++ fs::copy(from, to, fs::copy_options::skip_symlinks, ec);
++ VERIFY( !ec );
++ VERIFY( !fs::exists(to) );
++
++ fs::copy(from, to, fs::copy_options::skip_symlinks, ec);
++ VERIFY( !ec );
++ VERIFY( !fs::exists(to) );
++
++ fs::copy(from, to,
++ fs::copy_options::skip_symlinks|fs::copy_options::copy_symlinks,
++ ec);
++ VERIFY( !ec );
++ VERIFY( !fs::exists(to) );
++
++ fs::copy(from, to, fs::copy_options::copy_symlinks, ec);
++ VERIFY( !ec );
++ VERIFY( fs::exists(to) );
++
++ fs::copy(from, to, fs::copy_options::copy_symlinks, ec);
++ VERIFY( ec );
++
++ remove(from, ec);
++ remove(to, ec);
++}
++
++// Test is_regular_file(f) case.
++void
++test03()
++{
++ bool test __attribute__((unused)) = false;
++
++ auto from = __gnu_test::nonexistent_path();
++ auto to = __gnu_test::nonexistent_path();
++
++ // test empty file
++ std::ofstream{from.native()};
++ VERIFY( fs::exists(from) );
++ VERIFY( fs::file_size(from) == 0 );
++ fs::copy(from, to);
++ VERIFY( fs::exists(to) );
++ VERIFY( fs::file_size(to) == 0 );
++
++ remove(to);
++ VERIFY( !fs::exists(to) );
++ std::ofstream{from.native()} << "Hello, filesystem!";
++ VERIFY( fs::file_size(from) != 0 );
++ fs::copy(from, to);
++ VERIFY( fs::exists(to) );
++ VERIFY( fs::file_size(to) == fs::file_size(from) );
++}
++
++// Test is_directory(f) case.
++void
++test04()
++{
++ bool test __attribute__((unused)) = false;
++
++ auto from = __gnu_test::nonexistent_path();
++ auto to = __gnu_test::nonexistent_path();
++ std::error_code ec;
++
++}
++
++// Test no-op cases.
++void
++test05()
++{
++ bool test __attribute__((unused)) = false;
++
++ auto to = __gnu_test::nonexistent_path();
++ std::error_code ec;
++
++ fs::copy("/", to, fs::copy_options::create_symlinks, ec);
++ VERIFY( !ec );
+ }
+
+ int
+@@ -56,4 +149,7 @@
+ {
+ test01();
+ test02();
++ test03();
++ test04();
++ test05();
+ }
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libstdc++-v3/testsuite/experimental/filesystem/operations/copy_file.cc gcc-6-20160721/libstdc++-v3/testsuite/experimental/filesystem/operations/copy_file.cc
+--- gcc-6.1.0/libstdc++-v3/testsuite/experimental/filesystem/operations/copy_file.cc 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/libstdc++-v3/testsuite/experimental/filesystem/operations/copy_file.cc 2016-05-25 15:45:03.000000000 +0000
+@@ -0,0 +1,82 @@
++// Copyright (C) 2016 Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library. This library is free
++// software; you can redistribute it and/or modify it under the
++// terms of the GNU General Public License as published by the
++// Free Software Foundation; either version 3, or (at your option)
++// any later version.
++
++// This library is distributed in the hope that it will be useful,
++// but WITHOUT ANY WARRANTY; without even the implied warranty of
++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++// GNU General Public License for more details.
++
++// You should have received a copy of the GNU General Public License along
++// with this library; see the file COPYING3. If not see
++// <http://www.gnu.org/licenses/>.
++
++// { dg-options "-std=gnu++11 -lstdc++fs" }
++// { dg-require-filesystem-ts "" }
++
++// 15.4 Copy [fs.op.copy_file]
++
++#include <experimental/filesystem>
++#include <fstream>
++#include <testsuite_fs.h>
++#include <testsuite_hooks.h>
++
++void
++test01()
++{
++ bool test __attribute__((unused)) = false;
++ using std::experimental::filesystem::copy_options;
++ std::error_code ec;
++
++ auto from = __gnu_test::nonexistent_path();
++ auto to = __gnu_test::nonexistent_path();
++
++ // test non-existent file
++ bool b = copy_file(from, to, ec);
++ VERIFY( !b );
++ VERIFY( ec );
++ VERIFY( !exists(to) );
++
++ // test empty file
++ std::ofstream{from.native()};
++ VERIFY( exists(from) );
++ VERIFY( file_size(from) == 0 );
++
++ b = copy_file(from, to);
++ VERIFY( b );
++ VERIFY( exists(to) );
++ VERIFY( file_size(to) == 0 );
++ remove(to);
++ VERIFY( !exists(to) );
++ b = copy_file(from, to, copy_options::none, ec);
++ VERIFY( b );
++ VERIFY( !ec );
++ VERIFY( exists(to) );
++ VERIFY( file_size(to) == 0 );
++
++ std::ofstream{from.native()} << "Hello, filesystem!";
++ VERIFY( file_size(from) != 0 );
++ remove(to);
++ VERIFY( !exists(to) );
++ b = copy_file(from, to);
++ VERIFY( b );
++ VERIFY( exists(to) );
++ VERIFY( file_size(to) == file_size(from) );
++ remove(to);
++ VERIFY( !exists(to) );
++ b = copy_file(from, to);
++ VERIFY( b );
++ VERIFY( !ec );
++ VERIFY( exists(to) );
++ VERIFY( file_size(to) == file_size(from) );
++}
++
++int
++main()
++{
++ test01();
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libstdc++-v3/testsuite/experimental/filesystem/operations/create_directories.cc gcc-6-20160721/libstdc++-v3/testsuite/experimental/filesystem/operations/create_directories.cc
+--- gcc-6.1.0/libstdc++-v3/testsuite/experimental/filesystem/operations/create_directories.cc 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/libstdc++-v3/testsuite/experimental/filesystem/operations/create_directories.cc 2016-07-04 13:15:10.000000000 +0000
+@@ -65,7 +65,8 @@
+ VERIFY( b );
+ VERIFY( is_directory(p/"./d4/../d5") );
+
+- remove_all(p, ec);
++ std::uintmax_t count = remove_all(p, ec);
++ VERIFY( count == 6 );
+ }
+
+ int
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libstdc++-v3/testsuite/experimental/filesystem/operations/create_directory.cc gcc-6-20160721/libstdc++-v3/testsuite/experimental/filesystem/operations/create_directory.cc
+--- gcc-6.1.0/libstdc++-v3/testsuite/experimental/filesystem/operations/create_directory.cc 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/libstdc++-v3/testsuite/experimental/filesystem/operations/create_directory.cc 2016-05-25 15:44:44.000000000 +0000
+@@ -0,0 +1,63 @@
++// Copyright (C) 2016 Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library. This library is free
++// software; you can redistribute it and/or modify it under the
++// terms of the GNU General Public License as published by the
++// Free Software Foundation; either version 3, or (at your option)
++// any later version.
++
++// This library is distributed in the hope that it will be useful,
++// but WITHOUT ANY WARRANTY; without even the implied warranty of
++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++// GNU General Public License for more details.
++
++// You should have received a copy of the GNU General Public License along
++// with this library; see the file COPYING3. If not see
++// <http://www.gnu.org/licenses/>.
++
++// { dg-options "-std=gnu++11 -lstdc++fs" }
++// { dg-require-filesystem-ts "" }
++
++#include <experimental/filesystem>
++#include <testsuite_hooks.h>
++#include <testsuite_fs.h>
++
++namespace fs = std::experimental::filesystem;
++
++void
++test01()
++{
++ bool test __attribute__((unused)) = false;
++ std::error_code ec;
++
++ // Test empty path.
++ fs::path p;
++ bool b = create_directory( p, ec );
++ VERIFY( ec );
++ VERIFY( !b );
++
++ // Test non-existent path
++ p = __gnu_test::nonexistent_path();
++ VERIFY( !exists(p) );
++
++ b = create_directory(p, ec); // create the directory once
++ VERIFY( !ec );
++ VERIFY( b );
++ VERIFY( exists(p) );
++
++ // Test existing path (libstdc++/71036).
++ b = create_directory(p, ec);
++ VERIFY( !ec );
++ VERIFY( !b );
++ b = create_directory(p);
++ VERIFY( !ec );
++ VERIFY( !b );
++
++ remove_all(p, ec);
++}
++
++int
++main()
++{
++ test01();
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libstdc++-v3/testsuite/experimental/filesystem/operations/permissions.cc gcc-6-20160721/libstdc++-v3/testsuite/experimental/filesystem/operations/permissions.cc
+--- gcc-6.1.0/libstdc++-v3/testsuite/experimental/filesystem/operations/permissions.cc 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/libstdc++-v3/testsuite/experimental/filesystem/operations/permissions.cc 2016-07-19 16:34:23.000000000 +0000
+@@ -0,0 +1,51 @@
++// Copyright (C) 2016 Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library. This library is free
++// software; you can redistribute it and/or modify it under the
++// terms of the GNU General Public License as published by the
++// Free Software Foundation; either version 3, or (at your option)
++// any later version.
++
++// This library is distributed in the hope that it will be useful,
++// but WITHOUT ANY WARRANTY; without even the implied warranty of
++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++// GNU General Public License for more details.
++
++// You should have received a copy of the GNU General Public License along
++// with this library; see the file COPYING3. If not see
++// <http://www.gnu.org/licenses/>.
++
++// { dg-options "-std=gnu++11 -lstdc++fs" }
++// { dg-require-filesystem-ts "" }
++
++// 15.26 Permissions [fs.op.permissions]
++
++#include <experimental/filesystem>
++#include <fstream>
++#include <testsuite_fs.h>
++#include <testsuite_hooks.h>
++
++void
++test01()
++{
++ bool test __attribute__((unused)) = true;
++ using perms = std::experimental::filesystem::perms;
++
++ auto p = __gnu_test::nonexistent_path();
++ std::ofstream{p.native()};
++ VERIFY( exists(p) );
++ permissions(p, perms::owner_all);
++ VERIFY( status(p).permissions() == perms::owner_all );
++ permissions(p, perms::group_read | perms::add_perms);
++ VERIFY( status(p).permissions() == (perms::owner_all | perms::group_read) );
++ permissions(p, perms::group_read | perms::remove_perms);
++ VERIFY( status(p).permissions() == perms::owner_all );
++
++ remove(p);
++}
++
++int
++main()
++{
++ test01();
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libstdc++-v3/testsuite/experimental/filesystem/path/native/string.cc gcc-6-20160721/libstdc++-v3/testsuite/experimental/filesystem/path/native/string.cc
+--- gcc-6.1.0/libstdc++-v3/testsuite/experimental/filesystem/path/native/string.cc 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/libstdc++-v3/testsuite/experimental/filesystem/path/native/string.cc 2016-05-26 15:25:04.000000000 +0000
+@@ -0,0 +1,73 @@
++// Copyright (C) 2016 Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library. This library is free
++// software; you can redistribute it and/or modify it under the
++// terms of the GNU General Public License as published by the
++// Free Software Foundation; either version 3, or (at your option)
++// any later version.
++
++// This library is distributed in the hope that it will be useful,
++// but WITHOUT ANY WARRANTY; without even the implied warranty of
++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++// GNU General Public License for more details.
++
++// You should have received a copy of the GNU General Public License along
++// with this library; see the file COPYING3. If not see
++// <http://www.gnu.org/licenses/>.
++
++// { dg-options "-std=gnu++11 -lstdc++fs" }
++// { dg-require-filesystem-ts "" }
++
++#include <experimental/filesystem>
++#include <string>
++#include <testsuite_hooks.h>
++
++void
++test01()
++{
++ bool test __attribute__((unused)) = true;
++
++ using namespace std::experimental::filesystem;
++ const std::string s = "abc";
++ path p(s);
++
++ VERIFY( p.native() == s );
++ VERIFY( p.c_str() == s );
++ VERIFY( static_cast<std::string>(p) == s );
++
++ std::string s2 = p; // implicit conversion
++ VERIFY( s2 == p.native() );
++}
++
++void
++test02()
++{
++ bool test __attribute__((unused)) = true;
++
++ using namespace std::experimental::filesystem;
++ const char* s = "abc";
++ path p(s);
++
++ auto str = p.string<char>();
++ VERIFY( str == u"abc" );
++ VERIFY( str == p.string() );
++
++ auto strw = p.string<wchar_t>();
++ VERIFY( strw == L"abc" );
++ VERIFY( strw == p.wstring() );
++
++ auto str16 = p.string<char16_t>();
++ VERIFY( str16 == u"abc" );
++ VERIFY( str16 == p.u16string() );
++
++ auto str32 = p.string<char32_t>();
++ VERIFY( str32 == U"abc" );
++ VERIFY( str32 == p.u32string() );
++}
++
++int
++main()
++{
++ test01();
++ test02();
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libstdc++-v3/testsuite/experimental/functional/searchers.cc gcc-6-20160721/libstdc++-v3/testsuite/experimental/functional/searchers.cc
+--- gcc-6.1.0/libstdc++-v3/testsuite/experimental/functional/searchers.cc 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/libstdc++-v3/testsuite/experimental/functional/searchers.cc 2016-07-19 22:16:31.000000000 +0000
+@@ -22,6 +22,7 @@
+ #ifdef _GLIBCXX_USE_WCHAR_T
+ # include <cwchar>
+ #endif
++#include <algorithm>
+ #include <testsuite_hooks.h>
+
+ using std::experimental::make_default_searcher;
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libstdc++-v3/testsuite/experimental/optional/cons/value.cc gcc-6-20160721/libstdc++-v3/testsuite/experimental/optional/cons/value.cc
+--- gcc-6.1.0/libstdc++-v3/testsuite/experimental/optional/cons/value.cc 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/libstdc++-v3/testsuite/experimental/optional/cons/value.cc 2016-07-06 13:58:32.000000000 +0000
+@@ -22,6 +22,7 @@
+ #include <testsuite_hooks.h>
+
+ #include <vector>
++#include <string>
+
+ struct tracker
+ {
+@@ -236,4 +237,22 @@
+
+ VERIFY( result == caught );
+ }
++
++ {
++ std::experimental::optional<std::string> os = "foo";
++ struct X
++ {
++ explicit X(int) {}
++ X& operator=(int) {return *this;}
++ };
++ std::experimental::optional<X> ox{42};
++ std::experimental::optional<int> oi{42};
++ std::experimental::optional<X> ox2{oi};
++ std::experimental::optional<std::string> os2;
++ os2 = "foo";
++ std::experimental::optional<X> ox3;
++ ox3 = 42;
++ std::experimental::optional<X> ox4;
++ ox4 = oi;
++ }
+ }
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libstdc++-v3/testsuite/experimental/optional/cons/value_neg.cc gcc-6-20160721/libstdc++-v3/testsuite/experimental/optional/cons/value_neg.cc
+--- gcc-6.1.0/libstdc++-v3/testsuite/experimental/optional/cons/value_neg.cc 1970-01-01 00:00:00.000000000 +0000
++++ gcc-6-20160721/libstdc++-v3/testsuite/experimental/optional/cons/value_neg.cc 2016-07-06 13:58:32.000000000 +0000
+@@ -0,0 +1,39 @@
++// { dg-options "-std=gnu++14" }
++// { dg-do compile }
++
++// Copyright (C) 2013-2016 Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library. This library is free
++// software; you can redistribute it and/or modify it under the
++// terms of the GNU General Public License as published by the
++// Free Software Foundation; either version 3, or (at your option)
++// any later version.
++
++// This library is distributed in the hope that it will be useful,
++// but WITHOUT ANY WARRANTY; without even the implied warranty of
++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++// GNU General Public License for more details.
++
++// You should have received a moved_to of the GNU General Public License along
++// with this library; see the file COPYING3. If not see
++// <http://www.gnu.org/licenses/>.
++
++#include <experimental/optional>
++#include <testsuite_hooks.h>
++
++#include <string>
++#include <memory>
++
++int main()
++{
++ {
++ struct X
++ {
++ explicit X(int) {}
++ };
++ std::experimental::optional<X> ox{42};
++ std::experimental::optional<X> ox2 = 42; // { dg-error "conversion" }
++ std::experimental::optional<std::unique_ptr<int>> oup{new int};
++ std::experimental::optional<std::unique_ptr<int>> oup2 = new int; // { dg-error "conversion" }
++ }
++}
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libstdc++-v3/testsuite/util/testsuite_fs.h gcc-6-20160721/libstdc++-v3/testsuite/util/testsuite_fs.h
+--- gcc-6.1.0/libstdc++-v3/testsuite/util/testsuite_fs.h 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/libstdc++-v3/testsuite/util/testsuite_fs.h 2016-05-26 17:18:13.000000000 +0000
+@@ -83,11 +83,13 @@
+ p = tmp;
+ #else
+ char buf[64];
++ static int counter;
+ #if _GLIBCXX_USE_C99_STDIO
+- std::snprintf(buf, 64, "filesystem-ts-test.%lu", (unsigned long)::getpid());
++ std::snprintf(buf, 64,
+ #else
+- std::sprintf(buf, "filesystem-ts-test.%lu", (unsigned long)::getpid());
++ std::sprintf(buf,
+ #endif
++ "filesystem-ts-test.%d.%lu", counter++, (unsigned long) ::getpid());
+ p = buf;
+ #endif
+ return p;
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libstdc++-v3/testsuite/util/testsuite_iterators.h gcc-6-20160721/libstdc++-v3/testsuite/util/testsuite_iterators.h
+--- gcc-6.1.0/libstdc++-v3/testsuite/util/testsuite_iterators.h 2016-01-04 14:30:50.000000000 +0000
++++ gcc-6-20160721/libstdc++-v3/testsuite/util/testsuite_iterators.h 2016-06-17 18:53:46.000000000 +0000
+@@ -542,6 +542,13 @@
+ test_container(T* _first, T* _last):bounds(_first, _last)
+ { }
+
++#if __cplusplus >= 201103L
++ template<std::size_t N>
++ explicit
++ test_container(T (&arr)[N]) : test_container(arr, arr+N)
++ { }
++#endif
++
+ ItType<T>
+ it(int pos)
+ {
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libvtv/ChangeLog gcc-6-20160721/libvtv/ChangeLog
+--- gcc-6.1.0/libvtv/ChangeLog 2016-04-27 08:20:21.000000000 +0000
++++ gcc-6-20160721/libvtv/ChangeLog 2016-05-02 18:12:21.000000000 +0000
+@@ -1,3 +1,10 @@
++2016-05-02 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
++
++ * Makefile.am (toolexeclib_LTLIBRARIES): Only set if
++ ENABLE_VTABLE_VERIFY.
++ Simplify.
++ * Makefile.in: Regenerate.
++
+ 2016-04-27 Release Manager
+
+ * GCC 6.1.0 released.
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libvtv/Makefile.am gcc-6-20160721/libvtv/Makefile.am
+--- gcc-6.1.0/libvtv/Makefile.am 2015-11-25 10:30:25.000000000 +0000
++++ gcc-6-20160721/libvtv/Makefile.am 2016-05-02 18:12:21.000000000 +0000
+@@ -38,10 +38,11 @@
+ AM_CXXFLAGS += $(LIBSTDCXX_RAW_CXX_CXXFLAGS)
+ AM_CXXFLAGS += -Wl,-u_vtable_map_vars_start,-u_vtable_map_vars_end
+
+-if VTV_CYGMIN
+- toolexeclib_LTLIBRARIES = libvtv.la libvtv_stubs.la
+-else
++if ENABLE_VTABLE_VERIFY
+ toolexeclib_LTLIBRARIES = libvtv.la
++if VTV_CYGMIN
++ toolexeclib_LTLIBRARIES += libvtv_stubs.la
++endif
+ endif
+
+ vtv_headers = \
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/libvtv/Makefile.in gcc-6-20160721/libvtv/Makefile.in
+--- gcc-6.1.0/libvtv/Makefile.in 2016-04-27 08:22:11.000000000 +0000
++++ gcc-6-20160721/libvtv/Makefile.in 2016-07-21 22:33:06.000000000 +0000
+@@ -53,7 +53,8 @@
+ build_triplet = @build@
+ host_triplet = @host@
+ target_triplet = @target@
+-@ENABLE_VTABLE_VERIFY_TRUE@@VTV_NO_OBSTACK_TRUE@am__append_1 = obstack.c
++@ENABLE_VTABLE_VERIFY_TRUE@@VTV_CYGMIN_TRUE@am__append_1 = libvtv_stubs.la
++@ENABLE_VTABLE_VERIFY_TRUE@@VTV_NO_OBSTACK_TRUE@am__append_2 = obstack.c
+ subdir = .
+ DIST_COMMON = ChangeLog $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+ $(top_srcdir)/configure $(am__configure_deps) \
+@@ -119,8 +120,8 @@
+ libvtv_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(libvtv_la_LDFLAGS) $(LDFLAGS) -o $@
+-@VTV_CYGMIN_FALSE@am_libvtv_la_rpath = -rpath $(toolexeclibdir)
+-@VTV_CYGMIN_TRUE@am_libvtv_la_rpath = -rpath $(toolexeclibdir)
++@ENABLE_VTABLE_VERIFY_TRUE@am_libvtv_la_rpath = -rpath \
++@ENABLE_VTABLE_VERIFY_TRUE@ $(toolexeclibdir)
+ libvtv_stubs_la_LIBADD =
+ am__objects_3 = vtv_start.lo vtv_stubs.lo vtv_end.lo
+ @ENABLE_VTABLE_VERIFY_TRUE@@VTV_CYGMIN_TRUE@am_libvtv_stubs_la_OBJECTS = \
+@@ -129,7 +130,9 @@
+ libvtv_stubs_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(libvtv_stubs_la_LDFLAGS) $(LDFLAGS) -o $@
+-@VTV_CYGMIN_TRUE@am_libvtv_stubs_la_rpath = -rpath $(toolexeclibdir)
++@ENABLE_VTABLE_VERIFY_TRUE@@VTV_CYGMIN_TRUE@am_libvtv_stubs_la_rpath = \
++@ENABLE_VTABLE_VERIFY_TRUE@@VTV_CYGMIN_TRUE@ -rpath \
++@ENABLE_VTABLE_VERIFY_TRUE@@VTV_CYGMIN_TRUE@ $(toolexeclibdir)
+ DEFAULT_INCLUDES = -I.@am__isrc@
+ depcomp = $(SHELL) $(top_srcdir)/../depcomp
+ am__depfiles_maybe = depfiles
+@@ -323,8 +326,8 @@
+ AM_CCASFLAGS = $(XCFLAGS)
+ AM_CXXFLAGS = $(XCFLAGS) $(LIBSTDCXX_RAW_CXX_CXXFLAGS) \
+ -Wl,-u_vtable_map_vars_start,-u_vtable_map_vars_end
+-@VTV_CYGMIN_FALSE@toolexeclib_LTLIBRARIES = libvtv.la
+-@VTV_CYGMIN_TRUE@toolexeclib_LTLIBRARIES = libvtv.la libvtv_stubs.la
++@ENABLE_VTABLE_VERIFY_TRUE@toolexeclib_LTLIBRARIES = libvtv.la \
++@ENABLE_VTABLE_VERIFY_TRUE@ $(am__append_1)
+ vtv_headers = \
+ vtv_map.h \
+ vtv_malloc.h \
+@@ -354,7 +357,7 @@
+ @VTV_CYGMIN_TRUE@libvtv_stubs_la_LDFLAGS = $(lt_host_flags)
+ @ENABLE_VTABLE_VERIFY_FALSE@libvtv_la_SOURCES =
+ @ENABLE_VTABLE_VERIFY_TRUE@libvtv_la_SOURCES = $(vtv_sources) \
+-@ENABLE_VTABLE_VERIFY_TRUE@ $(am__append_1)
++@ENABLE_VTABLE_VERIFY_TRUE@ $(am__append_2)
+ @ENABLE_VTABLE_VERIFY_TRUE@@VTV_CYGMIN_TRUE@libvtv_stubs_la_SOURCES = $(vtv_stubs_sources)
+ @ENABLE_VTABLE_VERIFY_FALSE@libvtv_include_HEADERS =
+ @ENABLE_VTABLE_VERIFY_TRUE@libvtv_include_HEADERS = $(vtv_headers)
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/maintainer-scripts/ChangeLog gcc-6-20160721/maintainer-scripts/ChangeLog
+--- gcc-6.1.0/maintainer-scripts/ChangeLog 2016-04-27 08:20:21.000000000 +0000
++++ gcc-6-20160721/maintainer-scripts/ChangeLog 2016-06-13 07:57:52.000000000 +0000
+@@ -1,3 +1,8 @@
++2016-06-13 Jonathan Wakely <jwakely@redhat.com>
++
++ * generate_libstdcxx_web_docs: Use realpath to get absolute path.
++ Add comment about LaTeX errors.
++
+ 2016-04-27 Release Manager
+
+ * GCC 6.1.0 released.
+diff -ru --unidirectional-new-file --exclude po gcc-6.1.0/maintainer-scripts/generate_libstdcxx_web_docs gcc-6-20160721/maintainer-scripts/generate_libstdcxx_web_docs
+--- gcc-6.1.0/maintainer-scripts/generate_libstdcxx_web_docs 2014-10-30 10:11:38.000000000 +0000
++++ gcc-6-20160721/maintainer-scripts/generate_libstdcxx_web_docs 2016-06-13 07:57:52.000000000 +0000
+@@ -3,7 +3,7 @@
+ # i.e. http://gcc.gnu.org/onlinedocs/gcc-x.y.z/libstdc++*
+
+ SRCDIR=${1}
+-DOCSDIR=${2}
++DOCSDIR=$(realpath ${2})
+
+ if ! [ $# -eq 2 -a -x "${SRCDIR}/configure" -a -d "${DOCSDIR}" ]
+ then
+@@ -34,6 +34,9 @@
+ ${SRCDIR}/configure --enable-languages=c,c++ --disable-gcc $disabled_libs --docdir=/docs
+ eval `grep '^target=' config.log`
+ make configure-target
++# If the following step fails with an error like
++# ! LaTeX Error: File `xtab.sty' not found.
++# then you need to install the relevant TeX package e.g. texlive-xtab
+ make -C $target/libstdc++-v3 doc-install-html doc-install-xml doc-install-pdf DESTDIR=$DESTDIR
+ cd $DESTDIR/docs
+ mkdir libstdc++