diff options
Diffstat (limited to 'main/gcc')
-rw-r--r-- | main/gcc/APKBUILD | 35 | ||||
-rw-r--r-- | main/gcc/gcc-6-20160721.patch | 54444 | ||||
-rw-r--r-- | main/gcc/gcc-6.1-71056-Don-t-use-vectorized-builtins-when-N.patch | 85 | ||||
-rw-r--r-- | main/gcc/pr70839.patch | 42 |
4 files changed, 54456 insertions, 150 deletions
diff --git a/main/gcc/APKBUILD b/main/gcc/APKBUILD index e149e2db90..63f3660f28 100644 --- a/main/gcc/APKBUILD +++ b/main/gcc/APKBUILD @@ -1,6 +1,7 @@ # Maintainer: Natanael Copa <ncopa@alpinelinux.org> pkgname=gcc -pkgver=6.1.0 +pkgver=6.1.1 +_pkgbase=6.1.0 _cross="" [ "$BOOTSTRAP" = "noheaders" ] && pkgname="gcc-pass1" [ "$BOOTSTRAP" = "nolibc" ] && pkgname="gcc-pass2" @@ -8,7 +9,7 @@ _cross="" && _cross="-$CTARGET" pkgname="$pkgname$_cross" -pkgrel=4 +pkgrel=0 pkgdesc="The GNU Compiler Collection" url="http://gcc.gnu.org" arch="all" @@ -143,8 +144,9 @@ if $LANG_ADA; then makedepends="$makedepends gcc-gnat" fi -source="ftp://gcc.gnu.org/pub/gcc/releases/gcc-$pkgver/gcc-$pkgver.tar.bz2 +source="ftp://gcc.gnu.org/pub/gcc/releases/gcc-$pkgver/gcc-${_pkgbase:-$pkgver}.tar.bz2 ftp://sourceware.org/pub/java/ecj-4.9.jar + gcc-6-20160721.patch 001_all_default-ssp-strong.patch 002_all_default-relro.patch @@ -171,7 +173,6 @@ source="ftp://gcc.gnu.org/pub/gcc/releases/gcc-$pkgver/gcc-$pkgver.tar.bz2 libada-cross-shared.patch gcc-4.9-musl-fortify.patch gcc-6.1-musl-libssp.patch - gcc-6.1-71056-Don-t-use-vectorized-builtins-when-N.patch boehm-gc-musl.patch gcc-pure64.patch fix-gcj-stdgnu14-link.patch @@ -183,12 +184,10 @@ source="ftp://gcc.gnu.org/pub/gcc/releases/gcc-$pkgver/gcc-$pkgver.tar.bz2 ada-fixes.patch ada-shared.patch ada-musl.patch - - pr70839.patch " # we build out-of-tree -_gccdir="$srcdir"/gcc-$pkgver +_gccdir="$srcdir"/gcc-${_pkgbase:-$pkgver} _gcclibdir=/usr/lib/gcc/${CTARGET}/$pkgver _gcclibexec=/usr/libexec/gcc/${CTARGET}/$pkgver @@ -200,7 +199,6 @@ prepare() { return 1 fi - # Gentoo, PIE and uclibc patches _err= for i in $source; do case "$i" in @@ -219,12 +217,6 @@ prepare() { return 1 fi - # genautomata crashes with a "Bus Error" when compiled with PIC - # mostly affecting cross-builds as on native build bootstrapping - # somehow seems to build proper genautomata - sed -i gcc/Makefile.in -e 's|^build/genautomata$(build_exeext) .*|& -fno-PIC|' \ - || return 1 - # see http://gcc.gnu.org/ml/java/2008-04/msg00027.html mv "$srcdir"/ecj-*.jar ecj.jar @@ -616,6 +608,7 @@ gnat() { md5sums="8fb6cb98b8459f5863328380fbf06bd1 gcc-6.1.0.tar.bz2 7339f199ba11c941890031fd9981d7be ecj-4.9.jar +7b942873ee7e0df5dfdd8abe4eacff04 gcc-6-20160721.patch 3634a8f58065805809273b105071c1f3 001_all_default-ssp-strong.patch 28ca9eac639e88869ac975d593ff7a89 002_all_default-relro.patch b7235f279097e28295b6bbaa0804302f 003_all_default-fortify-source.patch @@ -639,7 +632,6 @@ a7836fe20d35f91ddf623e3c62a920fe 205-nopie.patch 246aef378ea9730d9bf97bc42fd392d2 libada-cross-shared.patch 9e658e590bc51be611f39945183f6aa2 gcc-4.9-musl-fortify.patch 32c40cd9c22a01621c2b7d60ac4255a0 gcc-6.1-musl-libssp.patch -fad1bba965c4fd341eb027950d35111d gcc-6.1-71056-Don-t-use-vectorized-builtins-when-N.patch 0ea0f556d4ef9c260d1353b7fd33970c boehm-gc-musl.patch 3cb420ef6240a8b96f52fb1b479ddaab gcc-pure64.patch 1e143d6a88cdcbc4e3266b19208df0fd fix-gcj-stdgnu14-link.patch @@ -649,10 +641,10 @@ e17bbb0fe802974e20645b4182b4c410 fix-gcj-iconv-musl.patch 4aea37d334ab00bb6bba37cd8c481367 fix-cxxflags-passing.patch d00d7e4b0c00cb7448576af9cd7fcea8 ada-fixes.patch 20e2731c02ce50739ebdead2795f9c41 ada-shared.patch -221773e09429ae2aba03780fb1089290 ada-musl.patch -243bf5804799d2e70c4e51d3a6ca9d1a pr70839.patch" +221773e09429ae2aba03780fb1089290 ada-musl.patch" sha256sums="09c4c85cabebb971b1de732a0219609f93fc0af5f86f6e437fd8d7f832f1a351 gcc-6.1.0.tar.bz2 9506e75b862f782213df61af67338eb7a23c35ff425d328affc65585477d34cd ecj-4.9.jar +3e2c8350a354b54d8f2ffb3db17d103adf7e45dd4bbe94620b25b3c63d839b28 gcc-6-20160721.patch deb22792f37e107d0afff5f4ea6b2a9fc9de4f48e1c7133bf658b6e0d057b1d6 001_all_default-ssp-strong.patch 2c7fcbc3879cce0775e37306441110dc63e7f457e2e5ad890f6b0800eb520ef6 002_all_default-relro.patch 611d3d101351c134d3c03f6d8265a90268cef71c682bf72e02a6cd2d99315ef8 003_all_default-fortify-source.patch @@ -676,7 +668,6 @@ df92e2f03615c1591278c132cd38ee0ed2c576cd942d8ea751a44d0521057e6b 207-static-pie aa3e570f9ccd9dcaadf00369ed2c4ae26ba640c49256f32aee7e631e2b836771 libada-cross-shared.patch dc93f97dff28b872f9c7e241fb87a3eca0271f706534d196b3517781b05667fa gcc-4.9-musl-fortify.patch 4ece19529edb8e681e1778e977e2ba1d47984ccfcb82505e8b898bb29d659625 gcc-6.1-musl-libssp.patch -2b61762aa8c5fe2f1fe896dfd2aaa3238235fb63842b04a4c79c0b6a0b92a3c5 gcc-6.1-71056-Don-t-use-vectorized-builtins-when-N.patch 6ccca88695ef84c0d038cd315cad5ae5b799672ecb009fdaab34e68ba60b733c boehm-gc-musl.patch 0625ab76ec3f7b47364becdb9ddc66bec9215ebfbeab1d58df8e1855a1cd76bb gcc-pure64.patch c03165e7ce812c93a33fdb0893847b4f9eb892e353d32d85b23249610fb24396 fix-gcj-stdgnu14-link.patch @@ -686,10 +677,10 @@ bd7a6f514fcc457f29e5fda157203f3bcd013aeba5d53b3459196eef3ce752ab gcc-4.8-build- a395ba4cf047c48cac56985726fddf0948f4425c9f1a0c9ddba1812b2b3d8300 fix-cxxflags-passing.patch d2a67a7ae0304cd10532883df19923b98dbc9b7a24957b619d4a6e04f19c5507 ada-fixes.patch d6c7fc1820a4fa285297c299c255fe2f19ce1695486f20edd098252a97545e6a ada-shared.patch -23d99e94060972bb25de4687da88ecb4fce9a7f0afa4b71a05161246917cd75d ada-musl.patch -2c4836eeac884e96fbf35c01862820efd0ff08fa73b580e2747d457f761fe80e pr70839.patch" +23d99e94060972bb25de4687da88ecb4fce9a7f0afa4b71a05161246917cd75d ada-musl.patch" sha512sums="eeed3e2018b8c012aabce419e8d718fde701e5c3c179b4486c61ba46e5736eecc8fccdd18b01fcd973a42c6ad3116dbbe2ee247fe3757d622d373f93ebaf8d2e gcc-6.1.0.tar.bz2 28f8c6fdbcb19e950b1d0bafb3bcc7a8cba87bc673aa6027cece116599cdee80f0cf5e95a1440544890239f5c754e8a93ab46d9daedd937faef445d7ea33b226 ecj-4.9.jar +435ac5e2ec041c70c2508242dbdc3a56da9633bf0549fa9cd8c4e3aa4dfc9a02539bd4d81fba4f5c72eeda4f4c25c5b4998ae2f84ce5f64b4edf574833160b68 gcc-6-20160721.patch a1335adc2fbee98e36c4437ff2587771b98ed4180726779020f65039498235626a411cdb0100dbd20cd19d12f0d94f9a21af179ff624676c28cead9d60598b5d 001_all_default-ssp-strong.patch e36e95b81489163abd6fe9d58f7867bdca43e61143afacbfb17f4698c0b16ec5fd0061d8fab7b2ae615540bebd721c2e2227f80401b4e7fc253da9da62e6b513 002_all_default-relro.patch f86466c62b8291fac46f9c250c7ad8fa5ab7b1cce2504442fd07ddc4543665b317ae28951f244e39aba29aeaf3fff252ec4f6a147aa16adb2b7aed747dd89188 003_all_default-fortify-source.patch @@ -713,7 +704,6 @@ d08d7ead2de0429e5c9055d5b029ec2be9a8c821d22cecaf9b51f633652c493333f98963d9267fa2 497e73650b4e7ac1cc92158b993f543b1506d3af4f9df9cb1e9504af4db657a9fc6e4429b4cb2bf5b3c1c8c06a5cec5d8b19bc958fd57b92d7b4d5e58b34554c libada-cross-shared.patch 600fe5098dc54edaa9808fd5717af9dec058953f9ad37d49cfba1db4f7e9a7a8f02019342f75157fc575946fa693259422184de27b7ecc8386d9f3ecc0f7cc5d gcc-4.9-musl-fortify.patch dbe0ee917fc7668571722364ab7c806731e3a31e8bfa30b4941b28b16b877d2a32b4a3897ef533399a28f82d43cac9b28e92de0493f0e779046db56584e07fa4 gcc-6.1-musl-libssp.patch -df8ca05b82250977354d4677e5e90b3d597c77281ff697c699ef129fe1dbbccd39a736c9257405c76aaf4bc51ab9f128381e40ee72f163a771c7e1f52b15ad17 gcc-6.1-71056-Don-t-use-vectorized-builtins-when-N.patch bda845a6aa1854d2c883910b115f79ccfa93dfc2b5eac69a3a236d83eb34cadc140731d616ffc24698c7abc8878dd15f231bcc5119f1860e575a120b311706c7 boehm-gc-musl.patch cd94f7be10de7511b17355dbb6b86dc70919b4a41c8aec1d7c5961820248aa00cf1594ed66fdd412c12b02a94605600530f674b32ab4cbd0ca6456968475ecbb gcc-pure64.patch 2253941f3d19b6d08801d3782f5f5ed56c3b73fbc9d3561a8f01c702963ac4fab91599c686076e7081eb6a80c37ccd33591ae978996d6eee1dc0ce0f1c50259a fix-gcj-stdgnu14-link.patch @@ -723,5 +713,4 @@ abe9aaf9aa956058d0386a4396a511d176a46bb3906b90e952383646cdc158cbeb0a5dc616a1ccb1 35d6d59f0b7b968f282f56767c9e0823a7bdc5aa0d450aca50fbd802649a7ca608b47671244a3faa208a9b0d6832cabb5a22724157dc817b2c0ad63d09f93282 fix-cxxflags-passing.patch 9016b257abd8fa981de44a49512e35db814d1cbb47c1a87cd31c12d4ae20b13e9e149fe41691a7ec3c95bbcfde8a79194a8d2eaf547ceade3a246fad67c47dd8 ada-fixes.patch 3f5bc334d9f73d06f5f7c876738d02356acdd08958bea0e4d2095ebf15c2c2ec4e411abdae0297505ae9a1699ca01b17338e853184e84663203b192b0d35fc19 ada-shared.patch -a13c6acd864933bd7b12501686da57b09cbff9471c7f630f5bc9a92902a4006a9024a08ee41574707e4c232a754a21633ea89e0bb45dc0d5967e50b299ef6a5e ada-musl.patch -15f91fe67939e153ac096c4cc64600a457b637c9e8a96b0e691c89f2339821b0c7b32477e0f66bf27ed8650d5c5a7e9cbae4006ea4639a386d47bf66a8a1ecc7 pr70839.patch" +a13c6acd864933bd7b12501686da57b09cbff9471c7f630f5bc9a92902a4006a9024a08ee41574707e4c232a754a21633ea89e0bb45dc0d5967e50b299ef6a5e ada-musl.patch" 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, ¤t_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 (¤t_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 = ±
++ *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++ diff --git a/main/gcc/gcc-6.1-71056-Don-t-use-vectorized-builtins-when-N.patch b/main/gcc/gcc-6.1-71056-Don-t-use-vectorized-builtins-when-N.patch deleted file mode 100644 index ed72b893f6..0000000000 --- a/main/gcc/gcc-6.1-71056-Don-t-use-vectorized-builtins-when-N.patch +++ /dev/null @@ -1,85 +0,0 @@ -From 7286da3d2d19806e8a1273558fb08e094bb7ffe7 Mon Sep 17 00:00:00 2001 -From: ktkachov <ktkachov@138bc75d-0d04-0410-961f-82ee72b054a4> -Date: Thu, 19 May 2016 13:43:58 +0000 -Subject: [PATCH 2/2] PR target/71056: Don't use vectorized builtins when NEON - is not available - - 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. - - * gcc.target/arm/pr71056.c: New test. - -git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@236459 138bc75d-0d04-0410-961f-82ee72b054a4 ---- - gcc/config/arm/arm-builtins.c | 6 +++++- - gcc/testsuite/gcc.target/arm/pr71056.c | 32 ++++++++++++++++++++++++++++++++ - 2 files changed, 37 insertions(+), 1 deletion(-) - create mode 100644 gcc/testsuite/gcc.target/arm/pr71056.c - -diff --git a/gcc/config/arm/arm-builtins.c b/gcc/config/arm/arm-builtins.c -index 90fb40f..68b2839 100644 ---- a/gcc/config/arm/arm-builtins.c -+++ b/gcc/config/arm/arm-builtins.c -@@ -2861,6 +2861,10 @@ arm_builtin_vectorized_function (unsigned int fn, tree type_out, tree type_in) - 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 @@ arm_builtin_vectorized_function (unsigned int fn, tree type_out, tree type_in) - 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 --git a/gcc/testsuite/gcc.target/arm/pr71056.c b/gcc/testsuite/gcc.target/arm/pr71056.c -new file mode 100644 -index 0000000..136754e ---- /dev/null -+++ b/gcc/testsuite/gcc.target/arm/pr71056.c -@@ -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); -+ } -+} --- -2.7.2 - diff --git a/main/gcc/pr70839.patch b/main/gcc/pr70839.patch deleted file mode 100644 index 3be1483ac7..0000000000 --- a/main/gcc/pr70839.patch +++ /dev/null @@ -1,42 +0,0 @@ -https://gcc.gnu.org/ml/gcc-patches/2016-04/msg01791.html - -diff --git a/gcc/java/decl.c b/gcc/java/decl.c ---- a/gcc/java/decl.c -+++ b/gcc/java/decl.c -@@ -507,7 +507,7 @@ static void - 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 @@ parse_version (void) - 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 @@ parse_version (void) - 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; - |