diff options
author | Timo Teräs <timo.teras@iki.fi> | 2016-07-22 07:01:56 +0000 |
---|---|---|
committer | Timo Teräs <timo.teras@iki.fi> | 2016-07-22 07:01:56 +0000 |
commit | a9f466cd349d3237906b2af09ff11d4c5f3f2de4 (patch) | |
tree | 551fec7d485677a952efeac275243514b5db0b7a /main/gcc | |
parent | 02192413ade8b2fb6e771a2eade03fe8d8d8196a (diff) | |
download | aports-a9f466cd349d3237906b2af09ff11d4c5f3f2de4.tar.bz2 aports-a9f466cd349d3237906b2af09ff11d4c5f3f2de4.tar.xz |
main/gcc: upgrade to gcc 6 snapshot 20160721
this includes additional arm fixes that fix u-boot compilation.
_pkgbase is expected to be the release tarball, and we have
cumulative diff to bring up to the snapshot.
gcc marks the snapshot releases as 6.1.1 too, so we use this
version for our packaging too. gcc -v reports:
gcc version 6.1.1 20160721 (Alpine 6.1.1)
so the actual snapshot date is visible too. next release is
due to be 6.2.
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; - |