Auto merge of #57602 - alexcrichton:test-appveyor, r=alexcrichton

Remove GCE cloud setting from AppVeyor config

AppVeyor has informed us that this may no longer be necessary after some
infrastructure upgrades on their side, so let's see how this goes!
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 65cdfe6..9924055 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -19,9 +19,16 @@
 
 As a reminder, all contributors are expected to follow our [Code of Conduct][coc].
 
+The [rustc-guide] is your friend! It describes how the compiler works and how
+to contribute to it in more detail than this document.
+
+If this is your first time contributing, the [walkthrough] chapter of the guide
+can give you a good example of how a typical contribution would go.
+
 [pound-rust-internals]: https://chat.mibbit.com/?server=irc.mozilla.org&channel=%23rust-internals
 [internals]: https://internals.rust-lang.org
 [coc]: https://www.rust-lang.org/conduct.html
+[walkthrough]: https://rust-lang.github.io/rustc-guide/walkthrough.html
 
 ## Feature Requests
 [feature-requests]: #feature-requests
@@ -89,222 +96,14 @@
 ```
 
 ## The Build System
-[the-build-system]: #the-build-system
 
-Rust's build system allows you to bootstrap the compiler, run tests &
-benchmarks, generate documentation, install a fresh build of Rust, and more.
-It's your best friend when working on Rust, allowing you to compile & test
-your contributions before submission.
+For info on how to configure and build the compiler, please see [this
+chapter][rustcguidebuild] of the rustc-guide. This chapter contains info for
+contributions to the compiler and the standard library. It also lists some
+really useful commands to the build system (`./x.py`), which could save you a
+lot of time.
 
-The build system lives in [the `src/bootstrap` directory][bootstrap] in the
-project root. Our build system is itself written in Rust and is based on Cargo
-to actually build all the compiler's crates. If you have questions on the build
-system internals, try asking in [`#rust-internals`][pound-rust-internals].
-
-[bootstrap]: https://github.com/rust-lang/rust/tree/master/src/bootstrap/
-
-### Configuration
-[configuration]: #configuration
-
-Before you can start building the compiler you need to configure the build for
-your system. In most cases, that will just mean using the defaults provided
-for Rust.
-
-To change configuration, you must copy the file `config.toml.example`
-to `config.toml` in the directory from which you will be running the build, and
-change the settings provided.
-
-There are large number of options provided in this config file that will alter the
-configuration used in the build process. Some options to note:
-
-#### `[llvm]`:
-- `assertions = true` = This enables LLVM assertions, which makes LLVM misuse cause an assertion failure instead of weird misbehavior. This also slows down the compiler's runtime by ~20%.
-- `ccache = true` - Use ccache when building llvm
-
-#### `[build]`:
-- `compiler-docs = true` - Build compiler documentation
-
-#### `[rust]`:
-- `debuginfo = true` - Build a compiler with debuginfo. Makes building rustc slower, but then you can use a debugger to debug `rustc`.
-- `debuginfo-lines = true` - An alternative to `debuginfo = true` that doesn't let you use a debugger, but doesn't make building rustc slower and still gives you line numbers in backtraces.
-- `debuginfo-tools = true` - Build the extended tools with debuginfo.
-- `debug-assertions = true` - Makes the log output of `debug!` work.
-- `optimize = false` - Disable optimizations to speed up compilation of stage1 rust, but makes the stage1 compiler x100 slower.
-
-For more options, the `config.toml` file contains commented out defaults, with
-descriptions of what each option will do.
-
-Note: Previously the `./configure` script was used to configure this
-project. It can still be used, but it's recommended to use a `config.toml`
-file. If you still have a `config.mk` file in your directory - from
-`./configure` - you may need to delete it for `config.toml` to work.
-
-### Building
-[building]: #building
-
-A default configuration requires around 3.5 GB of disk space, whereas building a debug configuration may require more than 30 GB.
-
-Dependencies
-- [build dependencies](README.md#building-from-source)
-- `gdb` 6.2.0 minimum, 7.1 or later recommended for test builds
-
-The build system uses the `x.py` script to control the build process. This script
-is used to build, test, and document various parts of the compiler. You can
-execute it as:
-
-```sh
-python x.py build
-```
-
-On some systems you can also use the shorter version:
-
-```sh
-./x.py build
-```
-
-To learn more about the driver and top-level targets, you can execute:
-
-```sh
-python x.py --help
-```
-
-The general format for the driver script is:
-
-```sh
-python x.py <command> [<directory>]
-```
-
-Some example commands are `build`, `test`, and `doc`. These will build, test,
-and document the specified directory. The second argument, `<directory>`, is
-optional and defaults to working over the entire compiler. If specified,
-however, only that specific directory will be built. For example:
-
-```sh
-# build the entire compiler
-python x.py build
-
-# build all documentation
-python x.py doc
-
-# run all test suites
-python x.py test
-
-# build only the standard library
-python x.py build src/libstd
-
-# test only one particular test suite
-python x.py test src/test/rustdoc
-
-# build only the stage0 libcore library
-python x.py build src/libcore --stage 0
-```
-
-You can explore the build system through the various `--help` pages for each
-subcommand. For example to learn more about a command you can run:
-
-```
-python x.py build --help
-```
-
-To learn about all possible rules you can execute, run:
-
-```
-python x.py build --help --verbose
-```
-
-Note: Previously `./configure` and `make` were used to build this project.
-They are still available, but `x.py` is the recommended build system.
-
-### Useful commands
-[useful-commands]: #useful-commands
-
-Some common invocations of `x.py` are:
-
-- `x.py build --help` - show the help message and explain the subcommand
-- `x.py build src/libtest --stage 1` - build up to (and including) the first
-  stage. For most cases we don't need to build the stage2 compiler, so we can
-  save time by not building it. The stage1 compiler is a fully functioning
-  compiler and (probably) will be enough to determine if your change works as
-  expected.
-- `x.py build src/rustc --stage 1` - This will build just rustc, without libstd.
-  This is the fastest way to recompile after you changed only rustc source code.
-  Note however that the resulting rustc binary won't have a stdlib to link
-  against by default. You can build libstd once with `x.py build src/libstd`,
-  but it is only guaranteed to work if recompiled, so if there are any issues
-  recompile it.
-- `x.py test` - build the full compiler & run all tests (takes a while). This
-  is what gets run by the continuous integration system against your pull
-  request. You should run this before submitting to make sure your tests pass
-  & everything builds in the correct manner.
-- `x.py test src/libstd --stage 1` - test the standard library without
-  recompiling stage 2.
-- `x.py test src/test/run-pass --test-args TESTNAME` - Run a matching set of
-  tests.
-  - `TESTNAME` should be a substring of the tests to match against e.g. it could
-    be the fully qualified test name, or just a part of it.
-    `TESTNAME=collections::hash::map::test_map::test_capacity_not_less_than_len`
-    or `TESTNAME=test_capacity_not_less_than_len`.
-- `x.py test src/test/run-pass --stage 1 --test-args <substring-of-test-name>` -
-  Run a single rpass test with the stage1 compiler (this will be quicker than
-  running the command above as we only build the stage1 compiler, not the entire
-  thing).  You can also leave off the directory argument to run all stage1 test
-  types.
-- `x.py test src/libcore --stage 1` - Run stage1 tests in `libcore`.
-- `x.py test src/tools/tidy` - Check that the source code is in compliance with
-  Rust's style guidelines. There is no official document describing Rust's full
-  guidelines as of yet, but basic rules like 4 spaces for indentation and no
-  more than 99 characters in a single line should be kept in mind when writing
-  code.
-
-### Using your local build
-[using-local-build]: #using-local-build
-
-If you use Rustup to manage your rust install, it has a feature called ["custom
-toolchains"][toolchain-link] that you can use to access your newly-built compiler
-without having to install it to your system or user PATH. If you've run `python
-x.py build`, then you can add your custom rustc to a new toolchain like this:
-
-[toolchain-link]: https://github.com/rust-lang-nursery/rustup.rs#working-with-custom-toolchains-and-local-builds
-
-```
-rustup toolchain link <name> build/<host-triple>/stage2
-```
-
-Where `<host-triple>` is the build triple for the host (the triple of your
-computer, by default), and `<name>` is the name for your custom toolchain. (If you
-added `--stage 1` to your build command, the compiler will be in the `stage1`
-folder instead.) You'll only need to do this once - it will automatically point
-to the latest build you've done.
-
-Once this is set up, you can use your custom toolchain just like any other. For
-example, if you've named your toolchain `local`, running `cargo +local build` will
-compile a project with your custom rustc, setting `rustup override set local` will
-override the toolchain for your current directory, and `cargo +local doc` will use
-your custom rustc and rustdoc to generate docs. (If you do this with a `--stage 1`
-build, you'll need to build rustdoc specially, since it's not normally built in
-stage 1. `python x.py build --stage 1 src/libstd src/tools/rustdoc` will build
-rustdoc and libstd, which will allow rustdoc to be run with that toolchain.)
-
-### Out-of-tree builds
-[out-of-tree-builds]: #out-of-tree-builds
-
-Rust's `x.py` script fully supports out-of-tree builds - it looks for
-the Rust source code from the directory `x.py` was found in, but it
-reads the `config.toml` configuration file from the directory it's
-run in, and places all build artifacts within a subdirectory named `build`.
-
-This means that if you want to do an out-of-tree build, you can just do it:
-```
-$ cd my/build/dir
-$ cp ~/my-config.toml config.toml # Or fill in config.toml otherwise
-$ path/to/rust/x.py build
-...
-$ # This will use the Rust source code in `path/to/rust`, but build
-$ # artifacts will now be in ./build
-```
-
-It's absolutely fine to have multiple build directories with different
-`config.toml` configurations using the same code.
+[rustcguidebuild]: https://rust-lang.github.io/rustc-guide/how-to-build-and-run.html
 
 ## Pull Requests
 [pull-requests]: #pull-requests
@@ -320,26 +119,13 @@
 
 Please make pull requests against the `master` branch.
 
-Compiling all of `./x.py test` can take a while. When testing your pull request,
-consider using one of the more specialized `./x.py` targets to cut down on the
-amount of time you have to wait. You need to have built the compiler at least
-once before running these will work, but that’s only one full build rather than
-one each time.
-
-    $ python x.py test --stage 1
-
-is one such example, which builds just `rustc`, and then runs the tests. If
-you’re adding something to the standard library, try
-
-    $ python x.py test src/libstd --stage 1
-
 Please make sure your pull request is in compliance with Rust's style
 guidelines by running
 
     $ python x.py test src/tools/tidy
 
 Make this check before every pull request (and every new commit in a pull
-request) ; you can add [git hooks](https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks)
+request); you can add [git hooks](https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks)
 before every push to make sure you never forget to make this check.
 
 All pull requests are reviewed by another person. We have a bot,
@@ -532,6 +318,12 @@
 reference to `doc/reference.html`. The CSS might be messed up, but you can
 verify that the HTML is right.
 
+Additionally, contributions to the [rustc-guide] are always welcome. Contributions
+can be made directly at [the
+rust-lang/rustc-guide](https://github.com/rust-lang/rustc-guide) repo. The issue
+tracker in that repo is also a great way to find things that need doing. There
+are issues for beginners and advanced compiler devs alike!
+
 ## Issue Triage
 [issue-triage]: #issue-triage
 
@@ -627,7 +419,7 @@
 more seasoned developers, some useful places to look for information
 are:
 
-* The [rustc guide] contains information about how various parts of the compiler work
+* The [rustc guide] contains information about how various parts of the compiler work and how to contribute to the compiler
 * [Rust Forge][rustforge] contains additional documentation, including write-ups of how to achieve common tasks
 * The [Rust Internals forum][rif], a place to ask questions and
   discuss Rust's internals
diff --git a/Cargo.lock b/Cargo.lock
index d3c6054..d4593c1 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -1332,7 +1332,7 @@
 
 [[package]]
 name = "minifier"
-version = "0.0.20"
+version = "0.0.26"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "macro-utils 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -2565,10 +2565,6 @@
 ]
 
 [[package]]
-name = "rustc_platform_intrinsics"
-version = "0.0.0"
-
-[[package]]
 name = "rustc_plugin"
 version = "0.0.0"
 dependencies = [
@@ -2678,7 +2674,6 @@
  "rustc 0.0.0",
  "rustc_data_structures 0.0.0",
  "rustc_errors 0.0.0",
- "rustc_platform_intrinsics 0.0.0",
  "rustc_target 0.0.0",
  "smallvec 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)",
  "syntax 0.0.0",
@@ -2697,7 +2692,7 @@
 name = "rustdoc"
 version = "0.0.0"
 dependencies = [
- "minifier 0.0.20 (registry+https://github.com/rust-lang/crates.io-index)",
+ "minifier 0.0.26 (registry+https://github.com/rust-lang/crates.io-index)",
  "parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)",
  "pulldown-cmark 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "tempfile 3.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -3515,7 +3510,7 @@
 "checksum memchr 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0a3eb002f0535929f1199681417029ebea04aadc0c7a4224b46be99c7f5d6a16"
 "checksum memmap 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e2ffa2c986de11a9df78620c01eeaaf27d94d3ff02bf81bfcca953102dd0c6ff"
 "checksum memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0f9dc261e2b62d7a622bf416ea3c5245cdd5d9a7fcc428c0d06804dfce1775b3"
-"checksum minifier 0.0.20 (registry+https://github.com/rust-lang/crates.io-index)" = "96c269bb45c39b333392b2b18ad71760b34ac65666591386b0e959ed58b3f474"
+"checksum minifier 0.0.26 (registry+https://github.com/rust-lang/crates.io-index)" = "f299df45afd73332044ea9f717c816a84fc90c8b631409abf339ba93642a7985"
 "checksum miniz-sys 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "0300eafb20369952951699b68243ab4334f4b10a88f411c221d444b36c40e649"
 "checksum miniz_oxide 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5ad30a47319c16cde58d0314f5d98202a80c9083b5f61178457403dfb14e509c"
 "checksum miniz_oxide_c_api 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "28edaef377517fd9fe3e085c37d892ce7acd1fbeab9239c5a36eec352d8a8b7e"
diff --git a/README.md b/README.md
index cb1f062..514e420 100644
--- a/README.md
+++ b/README.md
@@ -13,9 +13,13 @@
 ["Installation"]: https://doc.rust-lang.org/book/ch01-01-installation.html
 [The Book]: https://doc.rust-lang.org/book/index.html
 
-## Building from Source
+## Installing from Source
 [building-from-source]: #building-from-source
 
+_Note: If you wish to contribute to the compiler, you should read
+[this chapter](https://rust-lang.github.io/rustc-guide/how-to-build-and-run.html)
+of the rustc-guide instead._
+
 ### Building on *nix
 1. Make sure you have installed the dependencies:
 
diff --git a/config.toml.example b/config.toml.example
index 23943d3..24293fc 100644
--- a/config.toml.example
+++ b/config.toml.example
@@ -90,6 +90,11 @@
 # with clang-cl, so this is special in that it only compiles LLVM with clang-cl
 #clang-cl = '/path/to/clang-cl.exe'
 
+# Pass extra compiler and linker flags to the LLVM CMake build.
+#cflags = "-fextra-flag"
+#cxxflags = "-fextra-flag"
+#ldflags = "-Wl,extra-flag"
+
 # Use libc++ when building LLVM instead of libstdc++. This is the default on
 # platforms already use libc++ as the default C++ library, but this option
 # allows you to use libc++ even on platforms when it's not. You need to ensure
diff --git a/src/bootstrap/compile.rs b/src/bootstrap/compile.rs
index 8bc7c58..b581271 100644
--- a/src/bootstrap/compile.rs
+++ b/src/bootstrap/compile.rs
@@ -78,11 +78,8 @@
             builder.info(&format!("Uplifting stage1 std ({} -> {})", from.host, target));
 
             // Even if we're not building std this stage, the new sysroot must
-            // still contain the musl startup objects.
-            if target.contains("musl") {
-                let libdir = builder.sysroot_libdir(compiler, target);
-                copy_musl_third_party_objects(builder, target, &libdir);
-            }
+            // still contain the third party objects needed by various targets.
+            copy_third_party_objects(builder, &compiler, target);
 
             builder.ensure(StdLink {
                 compiler: from,
@@ -92,10 +89,7 @@
             return;
         }
 
-        if target.contains("musl") {
-            let libdir = builder.sysroot_libdir(compiler, target);
-            copy_musl_third_party_objects(builder, target, &libdir);
-        }
+        copy_third_party_objects(builder, &compiler, target);
 
         let mut cargo = builder.cargo(compiler, Mode::Std, target, "build");
         std_cargo(builder, &compiler, target, &mut cargo);
@@ -116,17 +110,36 @@
     }
 }
 
-/// Copies the crt(1,i,n).o startup objects
-///
-/// Since musl supports fully static linking, we can cross link for it even
-/// with a glibc-targeting toolchain, given we have the appropriate startup
-/// files. As those shipped with glibc won't work, copy the ones provided by
-/// musl so we have them on linux-gnu hosts.
-fn copy_musl_third_party_objects(builder: &Builder,
-                                 target: Interned<String>,
-                                 into: &Path) {
-    for &obj in &["crt1.o", "crti.o", "crtn.o"] {
-        builder.copy(&builder.musl_root(target).unwrap().join("lib").join(obj), &into.join(obj));
+/// Copies third pary objects needed by various targets.
+fn copy_third_party_objects(builder: &Builder, compiler: &Compiler, target: Interned<String>) {
+    let libdir = builder.sysroot_libdir(*compiler, target);
+
+    // Copies the crt(1,i,n).o startup objects
+    //
+    // Since musl supports fully static linking, we can cross link for it even
+    // with a glibc-targeting toolchain, given we have the appropriate startup
+    // files. As those shipped with glibc won't work, copy the ones provided by
+    // musl so we have them on linux-gnu hosts.
+    if target.contains("musl") {
+        for &obj in &["crt1.o", "crti.o", "crtn.o"] {
+            builder.copy(
+                &builder.musl_root(target).unwrap().join("lib").join(obj),
+                &libdir.join(obj),
+            );
+        }
+    }
+
+    // Copies libunwind.a compiled to be linked wit x86_64-fortanix-unknown-sgx.
+    //
+    // This target needs to be linked to Fortanix's port of llvm's libunwind.
+    // libunwind requires support for rwlock and printing to stderr,
+    // which is provided by std for this target.
+    if target == "x86_64-fortanix-unknown-sgx" {
+        let src_path_env = "X86_FORTANIX_SGX_LIBS";
+        let obj = "libunwind.a";
+        let src = env::var(src_path_env).expect(&format!("{} not found in env", src_path_env));
+        let src = Path::new(&src).join(obj);
+        builder.copy(&src, &libdir.join(obj));
     }
 }
 
diff --git a/src/bootstrap/config.rs b/src/bootstrap/config.rs
index 9421817..a2989f0 100644
--- a/src/bootstrap/config.rs
+++ b/src/bootstrap/config.rs
@@ -82,6 +82,9 @@
     pub lldb_enabled: bool,
     pub llvm_tools_enabled: bool,
 
+    pub llvm_cflags: Option<String>,
+    pub llvm_cxxflags: Option<String>,
+    pub llvm_ldflags: Option<String>,
     pub llvm_use_libcxx: bool,
 
     // rust codegen options
@@ -254,6 +257,9 @@
     link_shared: Option<bool>,
     version_suffix: Option<String>,
     clang_cl: Option<String>,
+    cflags: Option<String>,
+    cxxflags: Option<String>,
+    ldflags: Option<String>,
     use_libcxx: Option<bool>,
 }
 
@@ -516,6 +522,10 @@
             config.llvm_link_jobs = llvm.link_jobs;
             config.llvm_version_suffix = llvm.version_suffix.clone();
             config.llvm_clang_cl = llvm.clang_cl.clone();
+
+            config.llvm_cflags = llvm.cflags.clone();
+            config.llvm_cxxflags = llvm.cxxflags.clone();
+            config.llvm_ldflags = llvm.ldflags.clone();
             set(&mut config.llvm_use_libcxx, llvm.use_libcxx);
         }
 
diff --git a/src/bootstrap/configure.py b/src/bootstrap/configure.py
index b0c3c970..7b70236 100755
--- a/src/bootstrap/configure.py
+++ b/src/bootstrap/configure.py
@@ -64,6 +64,10 @@
 o("missing-tools", "dist.missing-tools", "allow failures when building tools")
 o("use-libcxx", "llvm.use_libcxx", "build LLVM with libc++")
 
+o("cflags", "llvm.cflags", "build LLVM with these extra compiler flags")
+o("cxxflags", "llvm.cxxflags", "build LLVM with these extra compiler flags")
+o("ldflags", "llvm.ldflags", "build LLVM with these extra linker flags")
+
 # Optimization and debugging options. These may be overridden by the release
 # channel, etc.
 o("optimize", "rust.optimize", "build optimized rust code")
diff --git a/src/bootstrap/native.rs b/src/bootstrap/native.rs
index cb9c86d..f5bacd6 100644
--- a/src/bootstrap/native.rs
+++ b/src/bootstrap/native.rs
@@ -358,7 +358,11 @@
     }
 
     cfg.build_arg("-j").build_arg(builder.jobs().to_string());
-    cfg.define("CMAKE_C_FLAGS", builder.cflags(target, GitRepo::Llvm).join(" "));
+    let mut cflags = builder.cflags(target, GitRepo::Llvm).join(" ");
+    if let Some(ref s) = builder.config.llvm_cxxflags {
+        cflags.push_str(&format!(" {}", s));
+    }
+    cfg.define("CMAKE_C_FLAGS", cflags);
     let mut cxxflags = builder.cflags(target, GitRepo::Llvm).join(" ");
     if builder.config.llvm_static_stdcpp &&
         !target.contains("windows") &&
@@ -366,6 +370,9 @@
     {
         cxxflags.push_str(" -static-libstdc++");
     }
+    if let Some(ref s) = builder.config.llvm_cxxflags {
+        cxxflags.push_str(&format!(" {}", s));
+    }
     cfg.define("CMAKE_CXX_FLAGS", cxxflags);
     if let Some(ar) = builder.ar(target) {
         if ar.is_absolute() {
@@ -383,6 +390,12 @@
         }
     }
 
+    if let Some(ref s) = builder.config.llvm_ldflags {
+        cfg.define("CMAKE_SHARED_LINKER_FLAGS", s);
+        cfg.define("CMAKE_MODULE_LINKER_FLAGS", s);
+        cfg.define("CMAKE_EXE_LINKER_FLAGS", s);
+    }
+
     if env::var_os("SCCACHE_ERROR_LOG").is_some() {
         cfg.env("RUST_LOG", "sccache=warn");
     }
diff --git a/src/ci/docker/dist-various-2/Dockerfile b/src/ci/docker/dist-various-2/Dockerfile
index 944c2a5..9062555 100644
--- a/src/ci/docker/dist-various-2/Dockerfile
+++ b/src/ci/docker/dist-various-2/Dockerfile
@@ -29,6 +29,10 @@
 COPY dist-various-2/build-solaris-toolchain.sh /tmp/
 RUN /tmp/build-solaris-toolchain.sh x86_64  amd64   solaris-i386
 RUN /tmp/build-solaris-toolchain.sh sparcv9 sparcv9 solaris-sparc
+COPY dist-various-2/build-x86_64-fortanix-unknown-sgx-toolchain.sh /tmp/
+# We pass the commit id of the port of LLVM's libunwind to the build script.
+# Any update to the commit id here, should cause the container image to be re-built from this point on.
+RUN /tmp/build-x86_64-fortanix-unknown-sgx-toolchain.sh "bbe23902411be88d7388f381becefadd6e3ef819"
 
 COPY scripts/sccache.sh /scripts/
 RUN sh /scripts/sccache.sh
@@ -65,6 +69,9 @@
 ENV TARGETS=$TARGETS,x86_64-sun-solaris
 ENV TARGETS=$TARGETS,x86_64-unknown-linux-gnux32
 ENV TARGETS=$TARGETS,x86_64-unknown-cloudabi
+ENV TARGETS=$TARGETS,x86_64-fortanix-unknown-sgx
+
+ENV X86_FORTANIX_SGX_LIBS="/x86_64-fortanix-unknown-sgx/lib/"
 
 ENV RUST_CONFIGURE_ARGS --enable-extended --enable-lld --disable-docs
 ENV SCRIPT python2.7 ../x.py dist --target $TARGETS
diff --git a/src/ci/docker/dist-various-2/build-x86_64-fortanix-unknown-sgx-toolchain.sh b/src/ci/docker/dist-various-2/build-x86_64-fortanix-unknown-sgx-toolchain.sh
new file mode 100755
index 0000000..7692131
--- /dev/null
+++ b/src/ci/docker/dist-various-2/build-x86_64-fortanix-unknown-sgx-toolchain.sh
@@ -0,0 +1,57 @@
+#!/bin/bash
+
+set -eu
+source shared.sh
+
+if [ -z "$1" ]; then
+    echo "Usage: ${0} <commit_id>"
+    exit -1
+fi
+
+target="x86_64-fortanix-unknown-sgx"
+url="https://github.com/fortanix/llvm-project/archive/${1}.tar.gz"
+repo_name="llvm-project"
+
+install_prereq()
+{
+    apt-get update
+    apt-get install -y --no-install-recommends \
+            build-essential \
+            ca-certificates \
+            cmake \
+            git
+}
+
+# Clone Fortanix's port of llvm-project to build libunwind that would link with this target.
+# The below method to download a single commit from llvm-project is based on fetch_submodule
+# from init_repo.sh
+fetch_llvm_commit()
+{
+    cached="download-${repo_name}.tar.gz"
+    curl -f -sSL -o ${cached} ${url}
+    tar -xvzf ${cached}
+    mkdir "./${repo_name}" && tar -xf ${cached} -C ${repo_name} --strip-components 1
+}
+
+build_unwind()
+{
+    dir_name="${target}_temp"
+    rm -rf "./${dir_name}"
+    mkdir -p ${dir_name}
+    cd ${dir_name}
+
+    retry fetch_llvm_commit
+    cd "${repo_name}/libunwind"
+
+    # Build libunwind
+    mkdir -p build
+    cd build
+    cmake -DCMAKE_BUILD_TYPE="RELEASE" -DRUST_SGX=1 -G "Unix Makefiles" -DLLVM_PATH=../../llvm/ ../
+    make unwind_static
+    install -D "lib/libunwind.a" "/${target}/lib/libunwind.a"
+    rm -rf ${dir_name}
+}
+
+set -x
+hide_output install_prereq
+hide_output build_unwind
diff --git a/src/ci/docker/dist-various-2/shared.sh b/src/ci/docker/dist-various-2/shared.sh
index 2b5eccb..fb917b0 100644
--- a/src/ci/docker/dist-various-2/shared.sh
+++ b/src/ci/docker/dist-various-2/shared.sh
@@ -13,3 +13,21 @@
   kill $PING_LOOP_PID
   set -x
 }
+
+function retry {
+  echo "Attempting with retry:" "$@"
+  local n=1
+  local max=5
+  while true; do
+    "$@" && break || {
+      if [[ $n -lt $max ]]; then
+        sleep $n  # don't retry immediately
+        ((n++))
+        echo "Command failed. Attempt $n/$max:"
+      else
+        echo "The command has failed after $n attempts."
+        return 1
+      fi
+    }
+  done
+}
diff --git a/src/doc/book b/src/doc/book
index 74d81d8..0e9061c 160000
--- a/src/doc/book
+++ b/src/doc/book
@@ -1 +1 @@
-Subproject commit 74d81d80052cb88925f0e73b12fbd0b73ab7b5a0
+Subproject commit 0e9061cbaf95adfb9f3ed36c6cef4c046f282e86
diff --git a/src/doc/reference b/src/doc/reference
index 60077ef..1c775a1 160000
--- a/src/doc/reference
+++ b/src/doc/reference
@@ -1 +1 @@
-Subproject commit 60077efda319c95a89fe39609803c5433567adbf
+Subproject commit 1c775a1dc5e29bc44b36604b510d6196d98077fa
diff --git a/src/doc/rustc/src/codegen-options/index.md b/src/doc/rustc/src/codegen-options/index.md
index 94f2104..a616409 100644
--- a/src/doc/rustc/src/codegen-options/index.md
+++ b/src/doc/rustc/src/codegen-options/index.md
@@ -187,7 +187,7 @@
 
 This flag lets you control the optimization level.
 
-* `0`: no optimizations
+* `0`: no optimizations, also turn on `cfg(debug_assertions)`.
 * `1`: basic optimizations
 * `2`: some optimizations
 * `3`: all optimizations
diff --git a/src/doc/rustc/src/contributing.md b/src/doc/rustc/src/contributing.md
index 3a1cafe..25a5c97 100644
--- a/src/doc/rustc/src/contributing.md
+++ b/src/doc/rustc/src/contributing.md
@@ -1,6 +1,12 @@
 # Contributing to rustc
 
 We'd love to have your help improving `rustc`! To that end, we've written [a
-whole book](https://rust-lang.github.io/rustc-guide/) on its
+whole book][rustc_guide] on its
 internals, how it works, and how to get started working on it. To learn
 more, you'll want to check that out.
+
+If you would like to contribute to _this_ book, you can find its source in the
+rustc source at [src/doc/rustc][rustc_book].
+
+[rustc_guide]: https://rust-lang.github.io/rustc-guide/
+[rustc_book]: https://github.com/rust-lang/rust/tree/master/src/doc/rustc
diff --git a/src/doc/rustdoc/src/unstable-features.md b/src/doc/rustdoc/src/unstable-features.md
index 905b064..d3eb8cb 100644
--- a/src/doc/rustdoc/src/unstable-features.md
+++ b/src/doc/rustdoc/src/unstable-features.md
@@ -417,3 +417,15 @@
 (grouping of crate docs generated into the same output directory, like with `cargo doc`). Per-crate
 files like the search index will still load from the documentation root, but anything that gets
 renamed with `--resource-suffix` will load from the given path.
+
+### `--persist-doctests`: persist doctest executables after running
+
+Using this flag looks like this:
+
+```bash
+$ rustdoc src/lib.rs --test -Z unstable-options --persist-doctests target/rustdoctest
+```
+
+This flag allows you to keep doctest executables around after they're compiled or run.
+Usually, rustdoc will immediately discard a compiled doctest after it's been tested, but
+with this option, you can keep those binaries around for farther testing.
\ No newline at end of file
diff --git a/src/doc/unstable-book/src/language-features/extern-in-paths.md b/src/doc/unstable-book/src/language-features/extern-in-paths.md
deleted file mode 100644
index 9979d77..0000000
--- a/src/doc/unstable-book/src/language-features/extern-in-paths.md
+++ /dev/null
@@ -1,40 +0,0 @@
-# `extern_in_paths`
-
-The tracking issue for this feature is: [#44660]
-
-[#44660]: https://github.com/rust-lang/rust/issues/44660
-
-------------------------
-
-The `extern_in_paths` feature allows to refer to names from other crates "inline", without
-introducing `extern crate` items, using keyword `extern`.
-
-For example, `extern::my_crat::a::b` will resolve to path `a::b` in crate `my_crate`.
-
-Absolute paths on 2018 edition (e.g. `::my_crate::a::b`) provide the same effect
-and resolve to extern crates (built-in or passed with `--extern`).
-
-```rust,ignore
-#![feature(extern_in_paths)]
-
-// Suppose we have a dependency crate `xcrate` available through `Cargo.toml`, or `--extern`
-// options, or standard Rust distribution, or some other means.
-
-use extern::xcrate::Z;
-
-fn f() {
-    use extern::xcrate;
-    use extern::xcrate as ycrate;
-    let s = xcrate::S;
-    assert_eq!(format!("{:?}", s), "S");
-    let z = ycrate::Z;
-    assert_eq!(format!("{:?}", z), "Z");
-}
-
-fn main() {
-    let s = extern::xcrate::S;
-    assert_eq!(format!("{:?}", s), "S");
-    let z = Z;
-    assert_eq!(format!("{:?}", z), "Z");
-}
-```
diff --git a/src/etc/platform-intrinsics/aarch64.json b/src/etc/platform-intrinsics/aarch64.json
deleted file mode 100644
index c8cda40..0000000
--- a/src/etc/platform-intrinsics/aarch64.json
+++ /dev/null
@@ -1,592 +0,0 @@
-{
-    "platform": "aarch64_v",
-    "intrinsic_prefix": "",
-    "llvm_prefix": "llvm.aarch64.neon.",
-    "number_info": {
-        "signed": {
-            "kind": "s",
-            "data_type": { "pattern": "s{bitwidth}" }
-        },
-        "unsigned": {
-            "kind": "u",
-            "data_type": { "pattern": "u{bitwidth}" }
-        },
-        "float": {
-            "kind": "f",
-            "data_type": { "pattern": "f{bitwidth}" }
-        }
-    },
-    "width_info": {
-        "64": { "width": "" },
-        "128": { "width": "q" }
-    },
-    "intrinsics": [
-        {
-            "intrinsic": "hadd{0.width}_{0.data_type}",
-            "width": [64, 128],
-            "llvm": "{0.kind}hadd.{0.llvm_name}",
-            "ret": "i(8-32)",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "rhadd{0.width}_{0.data_type}",
-            "width": [64, 128],
-            "llvm": "{0.kind}rhadd.{0.llvm_name}",
-            "ret": "i(8-32)",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "qadd{0.width}_{0.data_type}",
-            "width": [64, 128],
-            "llvm": "{0.kind}qadd.{0.llvm_name}",
-            "ret": "i(8-64)",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "uqadd_{0.data_type}",
-            "width": [128],
-            "llvm": "suqadd.{0.llvm_name}",
-            "ret": "s(8-64)",
-            "args": ["0", "0u"]
-        },
-        {
-            "intrinsic": "sqadd_{0.data_type}",
-            "width": [128],
-            "llvm": "usqadd.{0.llvm_name}",
-            "ret": "u(8-64)",
-            "args": ["0", "0s"]
-        },
-        {
-            "intrinsic": "raddhn_{1.data_type}",
-            "width": [64],
-            "llvm": "raddhn.{0.llvm_name}",
-            "ret": "i(8-32)",
-            "args": ["0w", "0w"]
-        },
-        {
-            "intrinsic": "fmulx{0.width}_{0.data_type}",
-            "width": [64, 128],
-            "llvm": "fmulx.{0.llvm_name}",
-            "ret": "f(32-64)",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "fma{0.width}_{0.data_type}",
-            "width": [64, 128],
-            "llvm": "!llvm.fma.{0.llvm_name}",
-            "ret": "f(32-64)",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "qdmulh{0.width}_{0.data_type}",
-            "width": [64, 128],
-            "llvm": "sqdmulh.{0.llvm_name}",
-            "ret": "s(16-32)",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "qrdmulh{0.width}_{0.data_type}",
-            "width": [64, 128],
-            "llvm": "sqrdmulh.{0.llvm_name}",
-            "ret": "s(16-32)",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "mull_{1.data_type}",
-            "width": [128],
-            "llvm": "{0.kind}mull.{0.llvm_name}",
-            "ret": "i(16-64)",
-            "args": ["0n", "0n"]
-        },
-        {
-            "intrinsic": "qdmull{0.width}_{1.data_type}",
-            "width": [128],
-            "llvm": "sqdmull.{0.llvm_name}",
-            "ret": "s(16-32)",
-            "args": ["0n", "0n"]
-        },
-        {
-            "intrinsic": "hsub{0.width}_{1.data_type}",
-            "width": [64, 128],
-            "llvm": "{0.kind}hsub.{0.llvm_name}",
-            "ret": "i(8-32)",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "qsub{0.width}_{1.data_type}",
-            "width": [64, 128],
-            "llvm": "{0.kind}qsub.{0.llvm_name}",
-            "ret": "i(8-64)",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "rsubhn_{1.data_type}",
-            "width": [64],
-            "llvm": "rsubhn.{0.llvm_name}",
-            "ret": "i(8-32)",
-            "args": ["0w", "0w"]
-        },
-        {
-            "intrinsic": "abd{0.width}_{1.data_type}",
-            "width": [64, 128],
-            "llvm": "{0.kind}abd.{0.llvm_name}",
-            "ret": ["i(8-32)","f(32-64)"],
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "max{0.width}_{0.data_type}",
-            "width": [64, 128],
-            "llvm": "{0.kind}max.{0.llvm_name}",
-            "ret": ["i(8-32)","f(32-64)"],
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "min{0.width}_{0.data_type}",
-            "width": [64, 128],
-            "llvm": "{0.kind}min.{0.llvm_name}",
-            "ret": ["i(8-32)","f(32-64)"],
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "maxnm{0.width}_{0.data_type}",
-            "width": [64, 128],
-            "llvm": "{0.kind}maxnm.{0.llvm_name}",
-            "ret": "f(32-64)",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "minnm{0.width}_{0.data_type}",
-            "width": [64, 128],
-            "llvm": "{0.kind}minnm.{0.llvm_name}",
-            "ret": "f(32-64)",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "shl{0.width}_{0.data_type}",
-            "width": [64, 128],
-            "llvm": "{0.kind}shl.{0.llvm_name}",
-            "ret": "i(8-64)",
-            "args": ["0", "0s"]
-        },
-        {
-            "intrinsic": "qshl{0.width}_{0.data_type}",
-            "width": [64, 128],
-            "llvm": "{0.kind}qshl.{0.llvm_name}",
-            "ret": "i(8-64)",
-            "args": ["0", "0s"]
-        },
-        {
-            "intrinsic": "rshl{0.width}_{0.data_type}",
-            "width": [64, 128],
-            "llvm": "{0.kind}rshl.{0.llvm_name}",
-            "ret": "i(8-64)",
-            "args": ["0", "0s"]
-        },
-        {
-            "intrinsic": "qrshl{0.width}_{0.data_type}",
-            "width": [64, 128],
-            "llvm": "{0.kind}qrshl.{0.llvm_name}",
-            "ret": "i(8-64)",
-            "args": ["0", "0s"]
-        },
-        {
-            "intrinsic": "qshrun_n_{1.data_type}",
-            "width": [64],
-            "llvm": "sqshrun.{0.llvm_name}",
-            "ret": "s(8-32)",
-            "args": ["0w", "U32"]
-        },
-        {
-            "intrinsic": "qrshrun_n_{1.data_type}",
-            "width": [64],
-            "llvm": "sqrshrun.{0.llvm_name}",
-            "ret": "s(8-32)",
-            "args": ["0w", "U32"]
-        },
-        {
-            "intrinsic": "qshrn_n_{1.data_type}",
-            "width": [64],
-            "llvm": "{0.kind}qshrn.{0.llvm_name}",
-            "ret": "i(8-32)",
-            "args": ["0w", "U32"]
-        },
-        {
-            "intrinsic": "rshrn_n_{1.data_type}",
-            "width": [64],
-            "llvm": "rshrn.{0.llvm_name}",
-            "ret": "i(8-32)",
-            "args": ["0w", "U32"]
-        },
-        {
-            "intrinsic": "qrshrn_n_{1.data_type}",
-            "width": [64],
-            "llvm": "{0.kind}qrshrn.{0.llvm_name}",
-            "ret": "i(8-32)",
-            "args": ["0w", "U32"]
-        },
-        {
-            "intrinsic": "sri{0.width}_{0.data_type}",
-            "width": [64, 128],
-            "llvm": "vsri.{0.llvm_name}",
-            "ret": "i(8-64)",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "sli{0.width}_{0.data_type}",
-            "width": [64, 128],
-            "llvm": "vsli.{0.llvm_name}",
-            "ret": "i(8-64)",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "vqmovn_{1.data_type}",
-            "width": [64],
-            "llvm": "{0.kind}qxtn.{0.llvm_name}",
-            "ret": "i(8-32)",
-            "args": ["0w"]
-        },
-        {
-            "intrinsic": "abs{0.width}_{0.data_type}",
-            "width": [64,128],
-            "llvm": "abs.{0.llvm_name}",
-            "ret": "s(8-64)",
-            "args": ["0"]
-        },
-        {
-            "intrinsic": "abs{0.width}_{0.data_type}",
-            "width": [64, 128],
-            "llvm": "!llvm.fabs.{0.llvm_name}",
-            "ret": "f(32-64)",
-            "args": ["0"]
-        },
-        {
-            "intrinsic": "qabs{0.width}_{0.data_type}",
-            "width": [64,128],
-            "llvm": "sqabs.{0.llvm_name}",
-            "ret": "s(8-64)",
-            "args": ["0"]
-        },
-        {
-            "intrinsic": "qneg{0.width}_{0.data_type}",
-            "width": [64, 128],
-            "llvm": "sqneg.{0.llvm_name}",
-            "ret": "s(8-64)",
-            "args": ["0"]
-        },
-        {
-            "intrinsic": "clz{0.width}_{0.data_type}",
-            "width": [64, 128],
-            "llvm": "!llvm.ctlz.{0.llvm_name}",
-            "ret": "i(8-32)",
-            "args": ["0"]
-        },
-        {
-            "intrinsic": "cls{0.width}_{0.data_type}",
-            "width": [64, 128],
-            "llvm": "cls.{0.llvm_name}",
-            "ret": "i(8-32)",
-            "args": ["0"]
-        },
-        {
-            "intrinsic": "cnt{0.width}_{0.data_type}",
-            "width": [64, 128],
-            "llvm": "!llvm.ctpop.{0.llvm_name}",
-            "ret": "i8",
-            "args": ["0"]
-        },
-        {
-            "intrinsic": "recpe{0.width}_{0.data_type}",
-            "width": [64, 128],
-            "llvm": "{0.kind}recpe.{0.llvm_name}",
-            "ret": ["u32","f(32-64)"],
-            "args": ["0"]
-        },
-        {
-            "intrinsic": "recps{0.width}_{0.data_type}",
-            "width": [64,128],
-            "llvm": "frecps.{0.llvm_name}",
-            "ret": "f(32-64)",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "sqrt{0.width}_{0.data_type}",
-            "width": [64, 128],
-            "llvm": "!llvm.sqrt.{0.llvm_name}",
-            "ret": "f(32-64)",
-            "args": ["0"]
-        },
-        {
-            "intrinsic": "rsqrte{0.width}_{0.data_type}",
-            "width": [64, 128],
-            "llvm": "{0.kind}rsqrte.{0.llvm_name}",
-            "ret": ["u32","f(32-64)"],
-            "args": ["0"]
-        },
-        {
-            "intrinsic": "rsqrts{0.width}_{0.data_type}",
-            "width": [64,128],
-            "llvm": "frsqrts.{0.llvm_name}",
-            "ret": "f(32-64)",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "rbit{0.width}_{0.data_type}",
-            "width": [64, 128],
-            "llvm": "rbit.{0.llvm_name}",
-            "ret": "i8",
-            "args": ["0"]
-        },
-        {
-            "intrinsic": "ld2{0[0].width}_{0[0].data_type}",
-            "width": [64, 128],
-            "llvm": "ld2.{0[0].llvm_name}.{1.llvm_name}",
-            "ret": ["[i(8-64);2]","[f(32-64);2]"],
-            "args": ["0.0SPc/0.0"]
-        },
-        {
-            "intrinsic": "ld3{0[0].width}_{0[0].data_type}",
-            "width": [64, 128],
-            "llvm": "ld3.{0[0].llvm_name}.{1.llvm_name}",
-            "ret": ["[i(8-64);3]","[f(32-64);3]"],
-            "args": ["0.0SPc/0.0"]
-        },
-        {
-            "intrinsic": "ld4{0[0].width}_{0[0].data_type}",
-            "width": [64, 128],
-            "llvm": "ld4.{0[0].llvm_name}.{1.llvm_name}",
-            "ret": ["[i(8-64);4]","[f(32-64);4]"],
-            "args": ["0.0SPc/0.0"]
-        },
-        {
-            "intrinsic": "ld2{0[0].width}_dup_{0[0].data_type}",
-            "width": [64, 128],
-            "llvm": "ld2.{0[0].llvm_name}.{1.llvm_name}",
-            "ret": ["[i(8-64);2]","[f(32-64);2]"],
-            "args": ["0.0SPc"]
-        },
-        {
-            "intrinsic": "ld3{0[0].width}_dup_{0[0].data_type}",
-            "width": [64, 128],
-            "llvm": "ld3.{0[0].llvm_name}.{1.llvm_name}",
-            "ret": ["[i(8-64);3]","[f(32-64);3]"],
-            "args": ["0.0SPc"]
-        },
-        {
-            "intrinsic": "ld4{0[0].width}_dup_{0[0].data_type}",
-            "width": [64, 128],
-            "llvm": "ld4.{0[0].llvm_name}.{1.llvm_name}",
-            "ret": ["[i(8-64);4]","[f(32-64);4]"],
-            "args": ["0.0SPc"]
-        },
-        {
-            "intrinsic": "padd{0.width}_{0.data_type}",
-            "width": [64, 128],
-            "llvm": "addp.{0.llvm_name}",
-            "ret": ["i(8-32)","f32"],
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "padd{0.width}_{0.data_type}",
-            "width": [128],
-            "llvm": "addp.{0.llvm_name}",
-            "ret": ["i64","f64"],
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "paddl{0.width}_{0.data_type}",
-            "width": [64, 128],
-            "llvm": "{0.kind}addlp.{0.llvm_name}.{1.llvm_name}",
-            "ret": "i(16-64)",
-            "args": ["0dn"]
-        },
-        {
-            "intrinsic": "pmax{0.width}_{0.data_type}",
-            "width": [64, 128],
-            "llvm": "{0.kind}maxp.{0.llvm_name}",
-            "ret": ["i(8-32)","f32"],
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "pmax{0.width}_{0.data_type}",
-            "width": [128],
-            "llvm": "{0.kind}maxp.{0.llvm_name}",
-            "ret": ["i64","f64"],
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "pmin{0.width}_{0.data_type}",
-            "width": [64, 128],
-            "llvm": "{0.kind}minp.{0.llvm_name}",
-            "ret": ["i(8-32)","f32"],
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "pmin{0.width}_{0.data_type}",
-            "width": [128],
-            "llvm": "{0.kind}minp.{0.llvm_name}",
-            "ret": ["i64","f64"],
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "pmaxnm{0.width}_{0.data_type}",
-            "width": [64, 128],
-            "llvm": "{0.kind}maxnmp.{0.llvm_name}",
-            "ret": ["i(8-32)","f32"],
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "pmaxnm{0.width}_{0.data_type}",
-            "width": [128],
-            "llvm": "{0.kind}maxnmp.{0.llvm_name}",
-            "ret": ["i64","f64"],
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "pminnm{0.width}_{0.data_type}",
-            "width": [64, 128],
-            "llvm": "{0.kind}minnmp.{0.llvm_name}",
-            "ret": "f32",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "pminnm{0.width}_{0.data_type}",
-            "width": [128],
-            "llvm": "{0.kind}minnmp.{0.llvm_name}",
-            "ret": "f64",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "addv{1.width}_{0.data_type}",
-            "width": [64, 128],
-            "llvm": "{0.kind}addv.{0.llvm_name}.{1.llvm_name}",
-            "ret": ["I(8-32)","F32"],
-            "args": ["0v"]
-        },
-        {
-            "intrinsic": "addv{1.width}_{0.data_type}",
-            "width": [128],
-            "llvm": "{0.kind}addv.{0.llvm_name}.{1.llvm_name}",
-            "ret": ["I64","F64"],
-            "args": ["0v"]
-        },
-        {
-            "intrinsic": "addlv{1.width}_{1.data_type}",
-            "width": [64, 128],
-            "llvm": "{0.kind}addlv.{0.llvm_name}.{1.llvm_name}",
-            "ret": "I(16-64)",
-            "args": ["0vdn"]
-        },
-        {
-            "intrinsic": "maxv{1.width}_{0.data_type}",
-            "width": [64, 128],
-            "llvm": "{0.kind}maxv.{0.llvm_name}.{1.llvm_name}",
-            "ret": ["I(8-32)","F32"],
-            "args": ["0v"]
-        },
-        {
-            "intrinsic": "maxv{1.width}_{0.data_type}",
-            "width": [128],
-            "llvm": "{0.kind}maxv.{0.llvm_name}.{1.llvm_name}",
-            "ret": "F64",
-            "args": ["0v"]
-        },
-        {
-            "intrinsic": "minv{1.width}_{0.data_type}",
-            "width": [64, 128],
-            "llvm": "{0.kind}minv.{0.llvm_name}.{1.llvm_name}",
-            "ret": ["I(8-32)","F32"],
-            "args": ["0v"]
-        },
-        {
-            "intrinsic": "minv{1.width}_{0.data_type}",
-            "width": [128],
-            "llvm": "{0.kind}minv.{0.llvm_name}.{1.llvm_name}",
-            "ret": "F64",
-            "args": ["0v"]
-        },
-        {
-            "intrinsic": "maxnmv{1.width}_{0.data_type}",
-            "width": [64, 128],
-            "llvm": "{0.kind}maxnmv.{0.llvm_name}.{1.llvm_name}",
-            "ret": "F32",
-            "args": ["0v"]
-        },
-        {
-            "intrinsic": "maxnmv{1.width}_{0.data_type}",
-            "width": [128],
-            "llvm": "{0.kind}maxnmv.{0.llvm_name}.{1.llvm_name}",
-            "ret": "F64",
-            "args": ["0v"]
-        },
-        {
-            "intrinsic": "minnmv{1.width}_{0.data_type}",
-            "width": [64, 128],
-            "llvm": "{0.kind}minnmv.{0.llvm_name}.{1.llvm_name}",
-            "ret": "F32",
-            "args": ["0v"]
-        },
-        {
-            "intrinsic": "minnmv{1.width}_{0.data_type}",
-            "width": [128],
-            "llvm": "{0.kind}minnmv.{0.llvm_name}.{1.llvm_name}",
-            "ret": "F64",
-            "args": ["0v"]
-        },
-        {
-            "intrinsic": "qtbl1{0.width}_{0.data_type}",
-            "width": [64, 128],
-            "llvm": "tbl1.{0.llvm_name}",
-            "ret": "i8",
-            "args": ["0x128", "0u"]
-        },
-        {
-            "intrinsic": "qtbx1{0.width}_{0.data_type}",
-            "width": [64, 128],
-            "llvm": "tbx1.{0.llvm_name}",
-            "ret": "i8",
-            "args": ["0", "0x128", "0u"]
-        },
-        {
-            "intrinsic": "qtbl2{0.width}_{0.data_type}",
-            "width": [64, 128],
-            "llvm": "tbl2.{0.llvm_name}",
-            "ret": "i8",
-            "args": ["(0x128,0x128)f", "0u"]
-        },
-        {
-            "intrinsic": "qtbx2{0.width}_{0.data_type}",
-            "width": [64, 128],
-            "llvm": "tbx2.{0.llvm_name}",
-            "ret": "i8",
-            "args": ["(0x128,0x128)f", "0u"]
-        },
-        {
-            "intrinsic": "qtbl3{0.width}_{0.data_type}",
-            "width": [64, 128],
-            "llvm": "tbl3.{0.llvm_name}",
-            "ret": "i8",
-            "args": ["(0x128,0x128,0x128)f", "0u"]
-        },
-        {
-            "intrinsic": "qtbx3{0.width}_{0.data_type}",
-            "width": [64, 128],
-            "llvm": "tbx3.{0.llvm_name}",
-            "ret": "i8",
-            "args": ["0", "(0x128,0x128,0x128)f", "0u"]
-        },
-        {
-            "intrinsic": "qtbl4{0.width}_{0.data_type}",
-            "width": [64, 128],
-            "llvm": "tbl4.{0.llvm_name}",
-            "ret": "i8",
-            "args": ["(0x128,0x128,0x128,0x128)f", "0u"]
-        },
-        {
-            "intrinsic": "qtbx4{0.width}_{0.data_type}",
-            "width": [64, 128],
-            "llvm": "tbx4.{0.llvm_name}",
-            "ret": "i8",
-            "args": ["0", "(0x128,0x128,0x128,0x128)f", "0u"]
-        }
-    ]
-}
diff --git a/src/etc/platform-intrinsics/arm.json b/src/etc/platform-intrinsics/arm.json
deleted file mode 100644
index d008320..0000000
--- a/src/etc/platform-intrinsics/arm.json
+++ /dev/null
@@ -1,396 +0,0 @@
-{
-    "platform": "arm_v",
-    "intrinsic_prefix": "",
-    "llvm_prefix": "llvm.arm.neon.v",
-    "number_info": {
-        "signed": {
-            "kind": "s",
-            "data_type": { "pattern": "s{bitwidth}" }
-        },
-        "unsigned": {
-            "kind": "u",
-            "data_type": { "pattern": "u{bitwidth}" }
-        },
-        "float": {
-            "kind": "f",
-            "data_type": { "pattern": "f{bitwidth}" }
-        }
-    },
-    "width_info": {
-        "64": { "width": "" },
-        "128": { "width": "q" }
-    },
-    "intrinsics": [
-        {
-            "intrinsic": "hadd{0.width}_{0.data_type}",
-            "width": [64, 128],
-            "llvm": "hadd{0.kind}.{0.llvm_name}",
-            "ret": "i(8-32)",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "rhadd{0.width}_{0.data_type}",
-            "width": [64, 128],
-            "llvm": "rhadd{0.kind}.{0.llvm_name}",
-            "ret": "i(8-32)",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "qadd{0.width}_{0.data_type}",
-            "width": [64, 128],
-            "llvm": "qadd{0.kind}.{0.llvm_name}",
-            "ret": "i(8-64)",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "raddhn_{1.data_type}",
-            "width": [64],
-            "llvm": "raddhn.{0.llvm_name}",
-            "ret": "i(8-32)",
-            "args": ["0w", "0w"]
-        },
-        {
-            "intrinsic": "fma{0.width}_{0.data_type}",
-            "width": [64, 128],
-            "llvm": "!llvm.fma.{0.llvm_name}",
-            "ret": "f32",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "qdmulh{0.width}_{0.data_type}",
-            "width": [64, 128],
-            "llvm": "sqdmulh.{0.llvm_name}",
-            "ret": "s(16-32)",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "qrdmulh{0.width}_{0.data_type}",
-            "width": [64, 128],
-            "llvm": "sqrdmulh.{0.llvm_name}",
-            "ret": "s(16-32)",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "mull_{1.data_type}",
-            "width": [128],
-            "llvm": "mull{0.kind}.{0.llvm_name}",
-            "ret": "i(16-64)",
-            "args": ["0n", "0n"]
-        },
-        {
-            "intrinsic": "qdmull{0.width}_{1.data_type}",
-            "width": [128],
-            "llvm": "sqdmull.{0.llvm_name}",
-            "ret": "s(16-32)",
-            "args": ["0n", "0n"]
-        },
-        {
-            "intrinsic": "hsub{0.width}_{1.data_type}",
-            "width": [64, 128],
-            "llvm": "hsub{0.kind}.{0.llvm_name}",
-            "ret": "i(8-32)",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "qsub{0.width}_{1.data_type}",
-            "width": [64, 128],
-            "llvm": "qsub{0.kind}.{0.llvm_name}",
-            "ret": "i(8-64)",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "rsubhn_{1.data_type}",
-            "width": [64],
-            "llvm": "rsubhn.{0.llvm_name}",
-            "ret": "i(8-32)",
-            "args": ["0w", "0w"]
-        },
-        {
-            "intrinsic": "abd{0.width}_{1.data_type}",
-            "width": [64, 128],
-            "llvm": "abd{0.kind}.{0.llvm_name}",
-            "ret": ["i(8-32)","f32"],
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "max{0.width}_{0.data_type}",
-            "width": [64, 128],
-            "llvm": "max{0.kind}.{0.llvm_name}",
-            "ret": ["i(8-32)","f32"],
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "min{0.width}_{0.data_type}",
-            "width": [64, 128],
-            "llvm": "min{0.kind}.{0.llvm_name}",
-            "ret": ["i(8-32)","f32"],
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "shl{0.width}_{0.data_type}",
-            "width": [64, 128],
-            "llvm": "shl{0.kind}.{0.llvm_name}",
-            "ret": "i(8-64)",
-            "args": ["0", "0s"]
-        },
-        {
-            "intrinsic": "qshl{0.width}_{0.data_type}",
-            "width": [64, 128],
-            "llvm": "qshl{0.kind}.{0.llvm_name}",
-            "ret": "i(8-64)",
-            "args": ["0", "0s"]
-        },
-        {
-            "intrinsic": "rshl{0.width}_{0.data_type}",
-            "width": [64, 128],
-            "llvm": "rshl{0.kind}.{0.llvm_name}",
-            "ret": "i(8-64)",
-            "args": ["0", "0s"]
-        },
-        {
-            "intrinsic": "qrshl{0.width}_{0.data_type}",
-            "width": [64, 128],
-            "llvm": "qrshl{0.kind}.{0.llvm_name}",
-            "ret": "i(8-64)",
-            "args": ["0", "0s"]
-        },
-        {
-            "intrinsic": "qshrun_n_{1.data_type}",
-            "width": [64],
-            "llvm": "sqshrun.{0.llvm_name}",
-            "ret": "s(8-32)",
-            "args": ["0w", "U32"]
-        },
-        {
-            "intrinsic": "qrshrun_n_{1.data_type}",
-            "width": [64],
-            "llvm": "sqrshrun.{0.llvm_name}",
-            "ret": "s(8-32)",
-            "args": ["0w", "U32"]
-        },
-        {
-            "intrinsic": "qshrn_n_{1.data_type}",
-            "width": [64],
-            "llvm": "qshrn{0.kind}.{0.llvm_name}",
-            "ret": "i(8-32)",
-            "args": ["0w", "U32"]
-        },
-        {
-            "intrinsic": "rshrn_n_{1.data_type}",
-            "width": [64],
-            "llvm": "rshrn.{0.llvm_name}",
-            "ret": "i(8-32)",
-            "args": ["0w", "U32"]
-        },
-        {
-            "intrinsic": "qrshrn_n_{1.data_type}",
-            "width": [64],
-            "llvm": "qrshrn{0.kind}.{0.llvm_name}",
-            "ret": "i(8-32)",
-            "args": ["0w", "U32"]
-        },
-        {
-            "intrinsic": "sri{0.width}_{0.data_type}",
-            "width": [64, 128],
-            "llvm": "vsri.{0.llvm_name}",
-            "ret": "i(8-64)",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "sli{0.width}_{0.data_type}",
-            "width": [64, 128],
-            "llvm": "vsli.{0.llvm_name}",
-            "ret": "i(8-64)",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "vqmovn_{1.data_type}",
-            "width": [64],
-            "llvm": "qxtn{0.kind}.{0.llvm_name}",
-            "ret": "i(8-32)",
-            "args": ["0w"]
-        },
-        {
-            "intrinsic": "abs{0.width}_{0.data_type}",
-            "width": [64,128],
-            "llvm": "abs.{0.llvm_name}",
-            "ret": "s(8-32)",
-            "args": ["0"]
-        },
-        {
-            "intrinsic": "abs{0.width}_{0.data_type}",
-            "width": [64, 128],
-            "llvm": "!llvm.fabs.{0.llvm_name}",
-            "ret": "f32",
-            "args": ["0"]
-        },
-        {
-            "intrinsic": "qabs{0.width}_{0.data_type}",
-            "width": [64,128],
-            "llvm": "sqabs.{0.llvm_name}",
-            "ret": "s(8-32)",
-            "args": ["0"]
-        },
-        {
-            "intrinsic": "qneg{0.width}_{0.data_type}",
-            "width": [64, 128],
-            "llvm": "sqneg.{0.llvm_name}",
-            "ret": "s(8-32)",
-            "args": ["0"]
-        },
-        {
-            "intrinsic": "clz{0.width}_{0.data_type}",
-            "width": [64, 128],
-            "llvm": "!llvm.ctlz.{0.llvm_name}",
-            "ret": "i(8-32)",
-            "args": ["0"]
-        },
-        {
-            "intrinsic": "cls{0.width}_{0.data_type}",
-            "width": [64, 128],
-            "llvm": "cls.{0.llvm_name}",
-            "ret": "i(8-32)",
-            "args": ["0"]
-        },
-        {
-            "intrinsic": "cnt{0.width}_{0.data_type}",
-            "width": [64, 128],
-            "llvm": "!llvm.ctpop.{0.llvm_name}",
-            "ret": "i8",
-            "args": ["0"]
-        },
-        {
-            "intrinsic": "recpe{0.width}_{0.data_type}",
-            "width": [64, 128],
-            "llvm": "recpe.{0.llvm_name}",
-            "ret": ["u32","f32"],
-            "args": ["0"]
-        },
-        {
-            "intrinsic": "recps{0.width}_{0.data_type}",
-            "width": [64,128],
-            "llvm": "frecps.{0.llvm_name}",
-            "ret": "f32",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "sqrt{0.width}_{0.data_type}",
-            "width": [64, 128],
-            "llvm": "!llvm.sqrt.{0.llvm_name}",
-            "ret": "f32",
-            "args": ["0"]
-        },
-        {
-            "intrinsic": "rsqrte{0.width}_{0.data_type}",
-            "width": [64, 128],
-            "llvm": "rsqrte.{0.llvm_name}",
-            "ret": ["u32","f32"],
-            "args": ["0"]
-        },
-        {
-            "intrinsic": "rsqrts{0.width}_{0.data_type}",
-            "width": [64,128],
-            "llvm": "rsqrts.{0.llvm_name}",
-            "ret": "f32",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "bsl{0.width}_{0.data_type}",
-            "width": [64, 128],
-            "llvm": "bsl.{0.llvm_name}",
-            "ret": "i(8-64)",
-            "args": ["0u", "0"]
-        },
-        {
-            "intrinsic": "padd{0.width}_{0.data_type}",
-            "width": [64],
-            "llvm": "padd.{0.llvm_name}",
-            "ret": ["i(8-32)","f32"],
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "paddl{0.width}_{0.data_type}",
-            "width": [64, 128],
-            "llvm": "paddl{0.kind}.{0.llvm_name}.{1.llvm_name}",
-            "ret": "i(16-64)",
-            "args": ["0dn"]
-        },
-        {
-            "intrinsic": "padal{0.width}_{0.data_type}",
-            "width": [64, 128],
-            "llvm": "padal{0.kind}.{0.llvm_name}.{1.llvm_name}",
-            "ret": "i(16-64)",
-            "args": ["0", "0dn"]
-        },
-        {
-            "intrinsic": "pmax{0.width}_{0.data_type}",
-            "width": [64],
-            "llvm": "pmax{0.kind}.{0.llvm_name}",
-            "ret": ["i(8-32)","f32"],
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "pmin{0.width}_{0.data_type}",
-            "width": [64, 128],
-            "llvm": "pmin{0.kind}.{0.llvm_name}",
-            "ret": ["i(8-32)","f32"],
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "tbl1_{0.data_type}",
-            "width": [64],
-            "llvm": "tbl1",
-            "ret": "i8",
-            "args": ["0", "0u"]
-        },
-        {
-            "intrinsic": "tbx1_{0.data_type}",
-            "width": [64],
-            "llvm": "tbx1",
-            "ret": "i8",
-            "args": ["0", "0", "0u"]
-        },
-        {
-            "intrinsic": "tbl2_{0.data_type}",
-            "width": [64],
-            "llvm": "tbl2",
-            "ret": "i8",
-            "args": ["(0,0)f", "0u"]
-        },
-        {
-            "intrinsic": "tbx2_{0.data_type}",
-            "width": [64],
-            "llvm": "tbx2",
-            "ret": "i8",
-            "args": ["(0,0)f", "0u"]
-        },
-        {
-            "intrinsic": "tbl3_{0.data_type}",
-            "width": [64],
-            "llvm": "tbl3",
-            "ret": "i8",
-            "args": ["(0,0,0)f", "0u"]
-        },
-        {
-            "intrinsic": "tbx3_{0.data_type}",
-            "width": [64],
-            "llvm": "tbx3",
-            "ret": "i8",
-            "args": ["0", "(0,0,0)f", "0u"]
-        },
-        {
-            "intrinsic": "tbl4_{0.data_type}",
-            "width": [64],
-            "llvm": "tbl4",
-            "ret": "i8",
-            "args": ["(0,0,0,0)f", "0u"]
-        },
-        {
-            "intrinsic": "tbx4_{0.data_type}",
-            "width": [64],
-            "llvm": "tbx4",
-            "ret": "i8",
-            "args": ["0", "(0,0,0,0)f", "0u"]
-        }
-    ]
-}
diff --git a/src/etc/platform-intrinsics/generator.py b/src/etc/platform-intrinsics/generator.py
deleted file mode 100644
index fa97131..0000000
--- a/src/etc/platform-intrinsics/generator.py
+++ /dev/null
@@ -1,854 +0,0 @@
-from __future__ import division, print_function
-import json
-import argparse
-import sys
-import re
-import textwrap
-import itertools
-
-SPEC = re.compile(
-    r'^(?:(?P<void>V)|(?P<id>[iusfIUSF])(?:\((?P<start>\d+)-(?P<end>\d+)\)|'
-    r'(?P<width>\d+)(:?/(?P<llvm_width>\d+))?)'
-    r'|(?P<reference>\d+))(?P<index>\.\d+)?(?P<modifiers>[vShdnwusfDMCNW]*)(?P<force_width>x\d+)?'
-    r'(?:(?P<pointer>Pm|Pc)(?P<llvm_pointer>/.*)?|(?P<bitcast>->.*))?$'
-)
-
-class PlatformInfo(object):
-    def __init__(self, json):
-        self._platform = json['platform']
-
-    def platform_prefix(self):
-        return self._platform
-
-class IntrinsicSet(object):
-    def __init__(self, platform, json):
-        self._llvm_prefix = json['llvm_prefix']
-        self._type_info = json['number_info']
-        self._intrinsics = json['intrinsics']
-        self._widths = json['width_info']
-        self._platform = platform
-        self._intrinsic_prefix = json['intrinsic_prefix']
-
-    def intrinsics(self):
-        for raw in self._intrinsics:
-            yield GenericIntrinsic(self,
-                                   raw['intrinsic'], raw['width'], raw['llvm'],
-                                   raw['ret'], raw['args'])
-
-    def platform(self):
-        return self._platform
-
-    def intrinsic_prefix(self):
-        return self._intrinsic_prefix
-
-    def llvm_prefix(self):
-        return self._llvm_prefix
-
-    def width_info(self, bitwidth):
-        return self._widths[str(bitwidth)]
-
-    def number_type_info(self, value):
-        data = self._type_info[value.__class__.__name__.lower()]
-        bitwidth = value.bitwidth()
-        def lookup(raw):
-            if not isinstance(raw, dict):
-                return raw
-
-            try:
-                return raw[str(bitwidth)]
-            except KeyError:
-                return raw['pattern'].format(bitwidth = bitwidth)
-
-        return PlatformTypeInfo(value.llvm_name(),
-                                {k: lookup(v) for k, v in data.items()})
-
-class PlatformTypeInfo(object):
-    def __init__(self, llvm_name, properties, elems = None):
-        if elems is None:
-            self.properties = properties
-            self.llvm_name = llvm_name
-        else:
-            assert properties is None and llvm_name is None
-            self.properties = {}
-            self.elems = elems
-
-    def __repr__(self):
-        return '<PlatformTypeInfo {}, {}>'.format(self.llvm_name, self.properties)
-
-    def __getattr__(self, name):
-        return self.properties[name]
-
-    def __getitem__(self, idx):
-        return self.elems[idx]
-
-    def vectorize(self, length, width_info):
-        props = self.properties.copy()
-        props.update(width_info)
-        return PlatformTypeInfo('v{}{}'.format(length, self.llvm_name), props)
-
-    def pointer(self, llvm_elem):
-        name = self.llvm_name if llvm_elem is None else llvm_elem.llvm_name
-        return PlatformTypeInfo('p0{}'.format(name), self.properties)
-
-BITWIDTH_POINTER = '<pointer>'
-
-class Type(object):
-    def __init__(self, bitwidth):
-        self._bitwidth = bitwidth
-
-    def bitwidth(self):
-        return self._bitwidth
-
-    def modify(self, spec, width, previous):
-        raise NotImplementedError()
-
-    def __ne__(self, other):
-        return not (self == other)
-
-class Void(Type):
-    def __init__(self):
-        Type.__init__(self, 0)
-
-    @staticmethod
-    def compiler_ctor():
-        return '::VOID'
-
-    def compiler_ctor_ref(self):
-        return '&' + self.compiler_ctor()
-
-    @staticmethod
-    def rust_name():
-        return '()'
-
-    @staticmethod
-    def type_info(platform_info):
-        return None
-
-    def __eq__(self, other):
-        return isinstance(other, Void)
-
-class Number(Type):
-    def __init__(self, bitwidth):
-        Type.__init__(self, bitwidth)
-
-    def modify(self, spec, width, previous):
-        if spec == 'u':
-            return Unsigned(self.bitwidth())
-        elif spec == 's':
-            return Signed(self.bitwidth())
-        elif spec == 'f':
-            return Float(self.bitwidth())
-        elif spec == 'w':
-            return self.__class__(self.bitwidth() * 2)
-        elif spec == 'n':
-            return self.__class__(self.bitwidth() // 2)
-        elif spec == 'v':
-            return Vector(self, width // self.bitwidth())
-        else:
-            raise ValueError('unknown modification spec {}', spec)
-
-    def type_info(self, platform_info):
-        return platform_info.number_type_info(self)
-
-    def __eq__(self, other):
-        # print(self, other)
-        return self.__class__ == other.__class__ and self.bitwidth() == other.bitwidth()
-
-class Signed(Number):
-    def __init__(self, bitwidth, llvm_bitwidth = None):
-        Number.__init__(self, bitwidth)
-        self._llvm_bitwidth = llvm_bitwidth
-
-
-    def compiler_ctor(self):
-        if self._llvm_bitwidth is None:
-            return '::I{}'.format(self.bitwidth())
-        else:
-            return '::I{}_{}'.format(self.bitwidth(), self._llvm_bitwidth)
-
-    def compiler_ctor_ref(self):
-        return '&' + self.compiler_ctor()
-
-    def llvm_name(self):
-        bw = self._llvm_bitwidth or self.bitwidth()
-        return 'i{}'.format(bw)
-
-    def rust_name(self):
-        return 'i{}'.format(self.bitwidth())
-
-class Unsigned(Number):
-    def __init__(self, bitwidth, llvm_bitwidth = None):
-        Number.__init__(self, bitwidth)
-        self._llvm_bitwidth = llvm_bitwidth
-
-    def compiler_ctor(self):
-        if self._llvm_bitwidth is None:
-            return '::U{}'.format(self.bitwidth())
-        else:
-            return '::U{}_{}'.format(self.bitwidth(), self._llvm_bitwidth)
-
-    def compiler_ctor_ref(self):
-        return '&' + self.compiler_ctor()
-
-    def llvm_name(self):
-        bw = self._llvm_bitwidth or self.bitwidth()
-        return 'i{}'.format(bw)
-
-    def rust_name(self):
-        return 'u{}'.format(self.bitwidth())
-
-class Float(Number):
-    def __init__(self, bitwidth):
-        assert bitwidth in (32, 64)
-        Number.__init__(self, bitwidth)
-
-    def compiler_ctor(self):
-        return '::F{}'.format(self.bitwidth())
-
-    def compiler_ctor_ref(self):
-        return '&' + self.compiler_ctor()
-
-    def llvm_name(self):
-        return 'f{}'.format(self.bitwidth())
-
-    def rust_name(self):
-        return 'f{}'.format(self.bitwidth())
-
-class Vector(Type):
-    def __init__(self, elem, length, bitcast = None):
-        assert isinstance(elem, Type) and not isinstance(elem, Vector)
-        Type.__init__(self,
-                      elem.bitwidth() * length)
-        self._length = length
-        self._elem = elem
-        assert bitcast is None or (isinstance(bitcast, Vector) and
-                                   bitcast._bitcast is None and
-                                   bitcast._elem.bitwidth() == elem.bitwidth())
-        if bitcast is not None and bitcast._elem != elem:
-            self._bitcast = bitcast._elem
-        else:
-            self._bitcast = None
-
-    def modify(self, spec, width, previous):
-        if spec == 'S':
-            return self._elem
-        elif spec == 'h':
-            return Vector(self._elem, self._length // 2)
-        elif spec == 'd':
-            return Vector(self._elem, self._length * 2)
-        elif spec == 'N':
-            elem = self._elem.__class__(self._elem.bitwidth() // 2)
-            return Vector(elem, self._length * 2)
-        elif spec == 'W':
-            elem = self._elem.__class__(self._elem.bitwidth() * 2)
-            return Vector(elem, self._length // 2)
-        elif spec.startswith('x'):
-            new_bitwidth = int(spec[1:])
-            return Vector(self._elem, new_bitwidth // self._elem.bitwidth())
-        elif spec.startswith('->'):
-            bitcast_to = TypeSpec(spec[2:])
-            choices = list(bitcast_to.enumerate(width, previous))
-            assert len(choices) == 1
-            bitcast_to = choices[0]
-            return Vector(self._elem, self._length, bitcast_to)
-        else:
-            return Vector(self._elem.modify(spec, width, previous), self._length)
-
-    def compiler_ctor(self):
-        if self._bitcast is None:
-            return '{}x{}'.format(self._elem.compiler_ctor(),
-                                     self._length)
-        else:
-            return '{}x{}_{}'.format(self._elem.compiler_ctor(),
-                                     self._length,
-                                     self._bitcast.compiler_ctor()
-                                         .replace('::', ''))
-
-    def compiler_ctor_ref(self):
-        return '&' + self.compiler_ctor()
-
-    def rust_name(self):
-        return '{}x{}'.format(self._elem.rust_name(), self._length)
-
-    def type_info(self, platform_info):
-        elem_info = self._elem.type_info(platform_info)
-        return elem_info.vectorize(self._length,
-                                   platform_info.width_info(self.bitwidth()))
-
-    def __eq__(self, other):
-        return isinstance(other, Vector) and self._length == other._length and \
-            self._elem == other._elem and self._bitcast == other._bitcast
-
-class Pointer(Type):
-    def __init__(self, elem, llvm_elem, const):
-        self._elem = elem
-        self._llvm_elem = llvm_elem
-        self._const = const
-        Type.__init__(self, BITWIDTH_POINTER)
-
-    def modify(self, spec, width, previous):
-        if spec == 'D':
-            return self._elem
-        elif spec == 'M':
-            return Pointer(self._elem, self._llvm_elem, False)
-        elif spec == 'C':
-            return Pointer(self._elem, self._llvm_elem, True)
-        else:
-            return Pointer(self._elem.modify(spec, width, previous), self._llvm_elem, self._const)
-
-    def compiler_ctor(self):
-        if self._llvm_elem is None:
-            llvm_elem = 'None'
-        else:
-            llvm_elem = 'Some({})'.format(self._llvm_elem.compiler_ctor_ref())
-        return 'Type::Pointer({}, {}, {})'.format(self._elem.compiler_ctor_ref(),
-                                                  llvm_elem,
-                                                  'true' if self._const else 'false')
-
-    def compiler_ctor_ref(self):
-        return "{{ static PTR: Type = {}; &PTR }}".format(self.compiler_ctor())
-
-
-    def rust_name(self):
-        return '*{} {}'.format('const' if self._const else 'mut',
-                               self._elem.rust_name())
-
-    def type_info(self, platform_info):
-        if self._llvm_elem is None:
-            llvm_elem = None
-        else:
-            llvm_elem = self._llvm_elem.type_info(platform_info)
-        return self._elem.type_info(platform_info).pointer(llvm_elem)
-
-    def __eq__(self, other):
-        return isinstance(other, Pointer) and self._const == other._const \
-            and self._elem == other._elem and self._llvm_elem == other._llvm_elem
-
-class Aggregate(Type):
-    def __init__(self, flatten, elems):
-        self._flatten = flatten
-        self._elems = elems
-        Type.__init__(self, sum(elem.bitwidth() for elem in elems))
-
-    def __repr__(self):
-        return '<Aggregate {}>'.format(self._elems)
-
-    def modify(self, spec, width, previous):
-        if spec.startswith('.'):
-            num = int(spec[1:])
-            return self._elems[num]
-        else:
-            print(spec)
-            raise NotImplementedError()
-
-    def compiler_ctor(self):
-        parts = "{{ static PARTS: [&'static Type; {}] = [{}]; &PARTS }}"
-        elems = ', '.join(elem.compiler_ctor_ref() for elem in self._elems)
-        parts = parts.format(len(self._elems), elems)
-        return 'Type::Aggregate({}, {})'.format('true' if self._flatten else 'false',
-                                                parts)
-
-    def compiler_ctor_ref(self):
-        return "{{ static AGG: Type = {}; &AGG }}".format(self.compiler_ctor())
-
-    def rust_name(self):
-        return '({})'.format(', '.join(elem.rust_name() for elem in self._elems))
-
-    def type_info(self, platform_info):
-        return PlatformTypeInfo(None, None, [elem.type_info(platform_info) for elem in self._elems])
-
-    def __eq__(self, other):
-        return isinstance(other, Aggregate) and self._flatten == other._flatten and \
-            self._elems == other._elems
-
-
-TYPE_ID_LOOKUP = {'i': [Signed, Unsigned],
-                  's': [Signed],
-                  'u': [Unsigned],
-                  'f': [Float]}
-
-def ptrify(match, elem, width, previous):
-    ptr = match.group('pointer')
-    if ptr is None:
-        return elem
-    else:
-        llvm_ptr = match.group('llvm_pointer')
-        if llvm_ptr is None:
-            llvm_elem = None
-        else:
-            assert llvm_ptr.startswith('/')
-            options = list(TypeSpec(llvm_ptr[1:]).enumerate(width, previous))
-            assert len(options) == 1
-            llvm_elem = options[0]
-        assert ptr in ('Pc', 'Pm')
-        return Pointer(elem, llvm_elem, ptr == 'Pc')
-
-class TypeSpec(object):
-    def __init__(self, spec):
-        if not isinstance(spec, list):
-            spec = [spec]
-
-        self.spec = spec
-
-    def enumerate(self, width, previous):
-        for spec in self.spec:
-            match = SPEC.match(spec)
-            if match is not None:
-                id = match.group('id')
-                reference = match.group('reference')
-
-                modifiers = []
-                index = match.group('index')
-                if index is not None:
-                    modifiers.append(index)
-                modifiers += list(match.group('modifiers') or '')
-                force = match.group('force_width')
-                if force is not None:
-                    modifiers.append(force)
-                bitcast = match.group('bitcast')
-                if bitcast is not None:
-                    modifiers.append(bitcast)
-
-                if match.group('void') is not None:
-                    assert spec == 'V'
-                    yield Void()
-                elif id is not None:
-                    is_vector = id.islower()
-                    type_ctors = TYPE_ID_LOOKUP[id.lower()]
-
-                    start = match.group('start')
-                    if start is not None:
-                        end = match.group('end')
-                        llvm_width = None
-                    else:
-                        start = end = match.group('width')
-                        llvm_width = match.group('llvm_width')
-                    start = int(start)
-                    end = int(end)
-
-                    bitwidth = start
-                    while bitwidth <= end:
-                        for ctor in type_ctors:
-                            if llvm_width is not None:
-                                assert not is_vector
-                                llvm_width = int(llvm_width)
-                                assert llvm_width < bitwidth
-                                scalar = ctor(bitwidth, llvm_width)
-                            else:
-                                scalar = ctor(bitwidth)
-
-                            if is_vector:
-                                elem = Vector(scalar, width // bitwidth)
-                            else:
-                                assert bitcast is None
-                                elem = scalar
-
-                            for x in modifiers:
-                                elem = elem.modify(x, width, previous)
-                            yield ptrify(match, elem, width, previous)
-                        bitwidth *= 2
-                elif reference is not None:
-                    reference = int(reference)
-                    assert reference < len(previous), \
-                        'referring to argument {}, but only {} are known'.format(reference,
-                                                                                 len(previous))
-                    ret = previous[reference]
-                    for x in modifiers:
-                        ret = ret.modify(x, width, previous)
-                    yield ptrify(match, ret, width, previous)
-                else:
-                    assert False, 'matched `{}`, but didn\'t understand it?'.format(spec)
-            elif spec.startswith('('):
-                if spec.endswith(')'):
-                    true_spec = spec[1:-1]
-                    flatten = False
-                elif spec.endswith(')f'):
-                    true_spec = spec[1:-2]
-                    flatten = True
-                else:
-                    assert False, 'found unclosed aggregate `{}`'.format(spec)
-
-                for elems in itertools.product(*(TypeSpec(subspec).enumerate(width, previous)
-                                                 for subspec in true_spec.split(','))):
-                    yield Aggregate(flatten, elems)
-            elif spec.startswith('['):
-                if spec.endswith(']'):
-                    true_spec = spec[1:-1]
-                    flatten = False
-                elif spec.endswith(']f'):
-                    true_spec = spec[1:-2]
-                    flatten = True
-                else:
-                    assert False, 'found unclosed aggregate `{}`'.format(spec)
-                elem_spec, count = true_spec.split(';')
-
-                count = int(count)
-                for elem in TypeSpec(elem_spec).enumerate(width, previous):
-                    yield Aggregate(flatten, [elem] * count)
-            else:
-                assert False, 'Failed to parse `{}`'.format(spec)
-
-class GenericIntrinsic(object):
-    def __init__(self, platform, intrinsic, widths, llvm_name, ret, args):
-        self._platform = platform
-        self.intrinsic = intrinsic
-        self.widths = map(int, widths)
-        self.llvm_name = llvm_name
-        self.ret = TypeSpec(ret)
-        self.args = list(map(TypeSpec, args))
-
-    def monomorphise(self):
-        for width in self.widths:
-            # must be a power of two
-            assert width & (width - 1) == 0
-            def recur(processed, untouched):
-                if not untouched:
-                    ret = processed[0]
-                    args = processed[1:]
-                    yield MonomorphicIntrinsic(self._platform, self.intrinsic, width,
-                                               self.llvm_name,
-                                               ret, args)
-                else:
-                    raw_arg = untouched[0]
-                    rest = untouched[1:]
-                    for arg in raw_arg.enumerate(width, processed):
-                        for intr in recur(processed + [arg], rest):
-                            yield intr
-
-            for x in recur([], [self.ret] + self.args):
-                yield x
-
-class MonomorphicIntrinsic(object):
-    def __init__(self, platform, intrinsic, width, llvm_name, ret, args):
-        self._platform = platform
-        self._intrinsic = intrinsic
-        self._width = '' if width == 64 else 'q'
-        self._llvm_name = llvm_name
-        self._ret_raw = ret
-        self._ret = ret.type_info(platform)
-        self._args_raw = args
-        self._args = [arg.type_info(platform) for arg in args]
-
-    def llvm_name(self):
-        if self._llvm_name.startswith('!'):
-            return self._llvm_name[1:].format(self._ret, *self._args)
-        else:
-            return self._platform.llvm_prefix() + self._llvm_name.format(self._ret, *self._args)
-
-    def intrinsic_suffix(self):
-        return self._intrinsic.format(self._ret,
-                                      *self._args,
-                                      width = self._width)
-
-    def platform_prefix(self):
-        return self._platform.platform().platform_prefix()
-
-    def intrinsic_set_name(self):
-        return self._platform.intrinsic_prefix()
-
-    def intrinsic_name(self):
-        return self._platform.intrinsic_prefix() + self.intrinsic_suffix()
-
-    def compiler_args(self):
-        return ', '.join(arg.compiler_ctor_ref() for arg in self._args_raw)
-
-    def compiler_ret(self):
-        return self._ret_raw.compiler_ctor_ref()
-
-    def compiler_signature(self):
-        return '({}) -> {}'.format(self.compiler_args(), self.compiler_ret())
-
-    def intrinsic_signature(self):
-        names = 'xyzwabcdef'
-        return '({}) -> {}'.format(', '.join('{}: {}'.format(name, arg.rust_name())
-                                             for name, arg in zip(names, self._args_raw)),
-                                   self._ret_raw.rust_name())
-
-def parse_args():
-    parser = argparse.ArgumentParser(
-        formatter_class = argparse.RawDescriptionHelpFormatter,
-        description = 'Render an intrinsic definition JSON to various formats.',
-        epilog = textwrap.dedent('''\
-        Quick How-To:
-
-        There are two operating modes: single file and multiple files.
-
-        For example, ARM is specified as a single file. To generate the
-        compiler-definitions for ARM just pass the script the "arm.json" file:
-
-        python generator.py --format compiler-defs arm.json
-
-        The X86 architecture is specified as multiple files (for the different
-        instruction sets that x86 supports). To generate the compiler
-        definitions one needs to pass the script a "platform information file"
-        (with the -i flag) next to the files of the different instruction sets.
-        For example, to generate the X86 compiler-definitions for SSE4.2, just:
-
-        python generator.py --format compiler-defs -i x86/info.json sse42.json
-
-        And to generate the compiler-definitions for SSE4.1 and SSE4.2, just:
-
-        python generator.py --format compiler-defs -i x86/info.json sse41.json sse42.json
-
-        An intrinsic definition consists of a map with fields:
-        - intrinsic: pattern for the name(s) of the vendor's C intrinsic(s)
-        - llvm: pattern for the name(s) of the internal llvm intrinsic(s)
-        - width: a vector of vector bit-widths the pattern works with
-        - ret: type specifier for the return value
-        - arguments: vector of type specifiers for arguments
-
-        The width and types describe a range of possible intrinsics,
-        and these are fed back into the intrinsic and llvm patterns to
-        create the appropriate definitions.
-
-        ## Type specifier grammar
-
-        ```
-        type := core_type modifier* suffix?
-
-        core_type := void | vector | scalar | aggregate | reference
-
-        modifier := 'v' | 'h' | 'd' | 'n' | 'w' | 'u' | 's' |
-                     'x' number | '.' number
-        suffix := pointer | bitcast
-        pointer := 'Pm' llvm_pointer? | 'Pc' llvm_pointer?
-        llvm_pointer := '/' type
-        bitcast := '->' type
-
-        void := 'V'
-
-        vector := vector_elem width |
-        vector_elem := 'i' | 'u' | 's' | 'f'
-
-        scalar := scalar_type number llvm_width?
-        scalar_type := 'U' | 'S' | 'F'
-        llvm_width := '/' number
-
-        aggregate := '(' (type),* ')' 'f'? | '[' type ';' number ']' 'f'?
-
-        reference := number
-
-        width = number | '(' number '-' number ')'
-
-        number = [0-9]+
-        ```
-
-        ## Void
-
-        The `V` type corresponds to `void` in LLVM (`()` in
-        Rust). It's likely to only work in return position.
-
-        ## Vectors
-
-        The vector grammar is a pattern describing many possibilities
-        for arguments/return value. The `vector_elem` describes the
-        types of elements to use, and the `width` describes the (range
-        of) widths for those elements, which are then placed into a
-        vector with the `width` bitwidth. E.g. if an intrinsic has a
-        `width` that includes 128, and the return value is `i(8-32)`,
-        then some instantiation of that intrinsic will be `u8x16`,
-        `u32x4`, `i32x4`, etc.
-
-        ### Elements
-
-        - i: integer, both signed and unsigned
-        - u: unsigned integer
-        - s: signed integer
-        - f: float
-
-        ## Scalars
-
-        Similar to vectors, but these describe a single concrete type,
-        not a range. The number is the bitwidth. The optional
-        `llvm_width` is the bitwidth of the integer that should be
-        passed to LLVM (by truncating the Rust argument): this only
-        works with scalar integers and the LLVM width must be smaller
-        than the Rust width.
-
-        ### Types
-
-        - U: unsigned integer
-        - S: signed integer
-        - F: float
-
-        ## Aggregates
-
-        An aggregate is a collection of multiple types; a tuple in
-        Rust terms, or an unnamed struct in LLVM. The `f` modifiers
-        forces the tuple to be flattened in the LLVM
-        intrinsic. E.g. if `llvm.foo` takes `(F32,S32)`:
-
-        - no `f` corresponds to `declare ... @llvm.foo({float, i32})`.
-        - having an `f` corresponds to `declare ... @llvm.foo(float, i32)`.
-
-        The `[type;number]` form is a just shorter way to write
-        `(...)`, except avoids doing a cartesian product of generic
-        types, e.g. `[S32;2]` is the same as `(S32, S32)`, while
-        `[I32;2]` is describing just the two types `(S32,S32)` and
-        `(U32,U32)` (i.e. doesn't include `(S32,U32)`, `(U32,S32)` as
-        `(I32,I32)` would).
-
-        (Currently aggregates can not contain other aggregates.)
-
-        ## References
-
-        A reference uses the type of another argument, with possible
-        modifications. The number refers to the type to use, starting
-        with 0 == return value, 1 == first argument, 2 == second
-        argument, etc.
-
-        ## Affixes
-
-        The `modifier` and `suffix` adaptors change the precise
-        representation.
-
-        ### Modifiers
-
-        - 'v': put a scalar into a vector of the current width (u32 -> u32x4, when width == 128)
-        - 'S': get the scalar element of a vector (u32x4 -> u32)
-        - 'h': half the length of the vector (u32x4 -> u32x2)
-        - 'd': double the length of the vector (u32x2 -> u32x4)
-        - 'n': narrow the element of the vector (u32x4 -> u16x4)
-        - 'w': widen the element of the vector (u16x4 -> u32x4)
-        - 'N': half the length of the vector element (u32x4 -> u16x8)
-        - 'W': double the length of the vector element (u16x8 -> u32x4)
-        - 'u': force a number (vector or scalar) to be unsigned int (f32x4 -> u32x4)
-        - 's': force a number (vector or scalar) to be signed int (u32x4 -> i32x4)
-        - 'f': force a number (vector or scalar) to be float (u32x4 -> f32x4)
-        - 'x' number: force the type to be a vector of bitwidth `number`.
-        - '.' number: get the `number`th element of an aggregate
-        - 'D': dereference a pointer (*mut u32 -> u32)
-        - 'C': make a pointer const (*mut u32 -> *const u32)
-        - 'M': make a pointer mut (*const u32 -> *mut u32)
-
-        ### Pointers
-
-        Pointers can be created of any type by appending a `P*`
-        suffix. The `m` vs. `c` chooses mut vs. const. e.g. `S32Pm`
-        corresponds to `*mut i32`, and `i32Pc` corresponds (with width
-        128) to `*const i8x16`, `*const u32x4`, etc.
-
-        The type after the `/` (optional) represents the type used
-        internally to LLVM, e.g. `S32pm/S8` is exposed as `*mut i32`
-        in Rust, but is `i8*` in LLVM. (This defaults to the main
-        type).
-
-        ### Bitcast
-
-        The `'->' type` bitcast suffix will cause the value to be
-        bitcast to the right-hand type when calling the intrinsic,
-        e.g. `s32->f32` will expose the intrinsic as `i32x4` at the
-        Rust level, but will cast that vector to `f32x4` when calling
-        the LLVM intrinsic.
-        '''))
-    parser.add_argument('--format', choices=FORMATS, required=True,
-                        help = 'Output format.')
-    parser.add_argument('-o', '--out', type=argparse.FileType('w'), default=sys.stdout,
-                        help = 'File to output to (default stdout).')
-    parser.add_argument('-i', '--info', type=argparse.FileType('r'),
-                        help = 'File containing platform specific information to merge into '
-                                'the input files\' header.')
-    parser.add_argument('in_', metavar="FILE", type=argparse.FileType('r'), nargs='+',
-                        help = 'JSON files to load')
-    return parser.parse_args()
-
-
-class ExternBlock(object):
-    def __init__(self):
-        pass
-
-    @staticmethod
-    def open(platform):
-        return 'extern "platform-intrinsic" {'
-
-    @staticmethod
-    def render(mono):
-        return '    fn {}{}{};'.format(mono.platform_prefix(),
-                                       mono.intrinsic_name(),
-                                       mono.intrinsic_signature())
-
-    @staticmethod
-    def close():
-        return '}'
-
-class CompilerDefs(object):
-    def __init__(self):
-        pass
-
-    @staticmethod
-    def open(platform):
-        return '''\
-// DO NOT EDIT: autogenerated by etc/platform-intrinsics/generator.py
-// ignore-tidy-linelength
-
-#![allow(unused_imports)]
-
-use {{Intrinsic, Type}};
-use IntrinsicDef::Named;
-
-pub fn find(name: &str) -> Option<Intrinsic> {{
-    if !name.starts_with("{0}") {{ return None }}
-    Some(match &name["{0}".len()..] {{'''.format(platform.platform_prefix())
-
-    @staticmethod
-    def render(mono):
-        return '''\
-        "{}" => Intrinsic {{
-            inputs: {{ static INPUTS: [&'static Type; {}] = [{}]; &INPUTS }},
-            output: {},
-            definition: Named("{}")
-        }},'''.format(mono.intrinsic_set_name() + mono.intrinsic_suffix(),
-                      len(mono._args_raw),
-                      mono.compiler_args(),
-                      mono.compiler_ret(),
-                      mono.llvm_name())
-
-    @staticmethod
-    def close():
-        return '''\
-        _ => return None,
-    })
-}'''
-
-FORMATS = {
-    'extern-block': ExternBlock(),
-    'compiler-defs': CompilerDefs(),
-}
-
-
-def main():
-    args = parse_args()
-    ins = args.in_
-    out = args.out
-    out_format = FORMATS[args.format]
-    info = args.info
-    one_file_no_info = False
-    if len(ins) > 1 and info is None:
-        print('error: cannot have multiple inputs without an info header.', file=sys.stderr)
-        sys.exit(1)
-
-    elif info is None:
-        info = ins[0]
-        one_file_no_info = True
-    info_json = json.load(info)
-    platform = PlatformInfo(info_json)
-
-    print(out_format.open(platform), file=out)
-
-    for in_ in ins:
-
-        if one_file_no_info:
-            data = info_json
-        else:
-            data = json.load(in_)
-            data.update(info_json)
-
-        intrinsics = IntrinsicSet(platform, data)
-        for intr in intrinsics.intrinsics():
-            for mono in intr.monomorphise():
-                print(out_format.render(mono), file=out)
-
-    print(out_format.close(), file=out)
-
-if __name__ == '__main__':
-    main()
diff --git a/src/etc/platform-intrinsics/hexagon/hvx_v60.json b/src/etc/platform-intrinsics/hexagon/hvx_v60.json
deleted file mode 100644
index a1897e6..0000000
--- a/src/etc/platform-intrinsics/hexagon/hvx_v60.json
+++ /dev/null
@@ -1,1326 +0,0 @@
-{
-    "platform": "Q6_",
-    "intrinsic_prefix": "",
-    "llvm_prefix": "llvm.hexagon.V6.",
-    "number_info": {
-        "signed": {
-            "kind": "s",
-            "data_type": { "8": "b", "16": "h", "32": "w" },
-            "data_type_plain": { "8": "b", "16": "h", "32": "w" }
-        },
-        "unsigned": {
-            "kind": "u",
-            "data_type": { "8": "ub", "16": "uh", "32": "uw" },
-            "data_type_plain": { "8": "b", "16": "h", "32": "w" }
-        },
-        "float": {
-            "kind": "f",
-            "data_type": { "8": "b", "16": "h", "32": "w" },
-            "data_type_plain": { "8": "b", "16": "h", "32": "w" }
-        }
-    },
-    "width_info": {
-        "64": { "width_b": "64", "width_suffix": "" },
-        "128": { "width_b": "128", "width_suffix": ".128B" },
-        "512": { "width_b": "64", "width_suffix": "" },
-        "1024": { "widthd_b": "64", "width_b": "128", "width_suffix": ".128B",  "widthd_suffix": "" },
-        "2048": { "widthd_b": "128", "widthd_suffix": ".128B" }
-    },
-    "intrinsics": [
-        {
-            "intrinsic": "R_vextract{1.width_b}",
-            "width": [512, 1024],
-            "llvm": "extractw{1.width_suffix}",
-            "ret": "U32",
-            "args": ["u32", "U32"]
-        },
-        {
-            "intrinsic": "V_lo{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "lo{0.width_suffix}",
-            "ret": "u32",
-            "args": ["0d"]
-        },
-        {
-            "intrinsic": "V_hi{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "hi{0.width_suffix}",
-            "ret": "u32",
-            "args": ["0d"]
-        },
-        {
-            "intrinsic": "V_vsplat_R{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "lvsplat{1.data_type}{0.width_suffix}",
-            "ret": "u32",
-            "args": ["0S"]
-        },
-        {
-            "intrinsic": "Q_and_QQ{0.width_b}",
-            "width": [64, 128],
-            "llvm": "pred.and{0.width_suffix}",
-            "ret": "u32",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "Q_not_Q{0.width_b}",
-            "width": [64, 128],
-            "llvm": "pred.not{0.width_suffix}",
-            "ret": "u32",
-            "args": ["0"]
-        },
-        {
-            "intrinsic": "Q_or_QQ{0.width_b}",
-            "width": [64, 128],
-            "llvm": "pred.or{0.width_suffix}",
-            "ret": "u32",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "Q_xor_QQ{0.width_b}",
-            "width": [64, 128],
-            "llvm": "pred.xor{0.width_suffix}",
-            "ret": "u32",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vabsdiff_V{1.data_type}V{2.data_type}{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vabsdiff{1.data_type}{0.width_suffix}",
-            "ret": "u(8-16)",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vabsdiff_V{1.data_type}V{2.data_type}{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vabsdiff{1.data_type}{0.width_suffix}",
-            "ret": "u(16-32)",
-            "args": ["0s", "0s"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vabs_V{1.data_type}{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vabs{1.data_type}{0.width_suffix}",
-            "ret": "s(16-32)",
-            "args": ["0"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vabs_V{1.data_type}_sat{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vabs{1.data_type}.sat{0.width_suffix}",
-            "ret": "s(16-32)",
-            "args": ["0"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vadd_V{1.data_type}V{2.data_type}{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vadd{0.data_type}{0.width_suffix}",
-            "ret": "s(8-32)",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vadd_V{1.data_type}V{2.data_type}_sat{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vadd{0.data_type}sat{0.width_suffix}",
-            "ret": "s(16-32)",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vadd_V{1.data_type}V{2.data_type}_sat{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vadd{0.data_type}sat{0.width_suffix}",
-            "ret": "u(8-16)",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "W{0.data_type}_vadd_W{1.data_type}W{2.data_type}{0.widthd_b}",
-            "width": [512, 1024],
-            "llvm": "vadd{0.data_type}.dv{0.widthd_suffix}",
-            "ret": "s(8-32)d",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "W{0.data_type}_vadd_W{1.data_type}W{2.data_type}_sat{0.widthd_b}",
-            "width": [512, 1024],
-            "llvm": "vadd{0.data_type}sat.dv{0.widthd_suffix}",
-            "ret": "s(16-32)d",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "W{0.data_type}_vadd_W{1.data_type}W{2.data_type}_sat{0.widthd_b}",
-            "width": [512, 1024],
-            "llvm": "vadd{0.data_type}sat.dv{0.widthd_suffix}",
-            "ret": "u(8-16)d",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "V_valign_VVR{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "valignb{0.width_suffix}",
-            "ret": "u8",
-            "args": ["0", "0", "U32"]
-        },
-        {
-            "intrinsic": "V_valign_VVI{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "valignbi{0.width_suffix}",
-            "ret": "u8",
-            "args": ["0", "0", "U32"]
-        },
-        {
-            "intrinsic": "V_vlalign_VVR{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vlalignb{0.width_suffix}",
-            "ret": "u8",
-            "args": ["0", "0", "U32"]
-        },
-        {
-            "intrinsic": "V_vlalign_VVI{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vlalignbi{0.width_suffix}",
-            "ret": "u8",
-            "args": ["0", "0", "U32"]
-        },
-        {
-            "intrinsic": "V_vand_VV{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vand{0.width_suffix}",
-            "ret": "u16",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "V_vand_QR{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vandqrt{0.width_suffix}",
-            "ret": "u8",
-            "args": ["u32hhh", "U32"]
-        },
-        {
-            "intrinsic": "V_vandor_VQR{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vandqrt.acc{0.width_suffix}",
-            "ret": "u8",
-            "args": ["0", "u32hhh", "U32"]
-        },
-        {
-            "intrinsic": "Q_vand_VR{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vandvrt{0.width_suffix}",
-            "ret": "u32hhh",
-            "args": ["u8", "U32"]
-        },
-        {
-            "intrinsic": "Q_vandor_QVR{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vandvrt{0.width_suffix}",
-            "ret": "u32hhh",
-            "args": ["0", "u8", "U32"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vasl_V{1.data_type}R{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vasl{0.data_type}{0.width_suffix}",
-            "ret": "s(16-32)",
-            "args": ["0", "U32"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vasl_V{1.data_type}V{2.data_type}{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vasl{0.data_type}v{0.width_suffix}",
-            "ret": "s(16-32)",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vaslacc_V{1.data_type}V{2.data_type}R{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vasl{0.data_type}.acc{0.width_suffix}",
-            "ret": "s32",
-            "args": ["0", "0", "U32"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vasr_V{1.data_type}R{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vasr{0.data_type}{0.width_suffix}",
-            "ret": "s(16-32)",
-            "args": ["0", "U32"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vasr_V{1.data_type}V{2.data_type}{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vasr{0.data_type}v{0.width_suffix}",
-            "ret": "s(16-32)",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vasracc_V{1.data_type}V{2.data_type}R{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vasr{0.data_type}.acc{0.width_suffix}",
-            "ret": "s32",
-            "args": ["0", "0", "U32"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vasr_V{1.data_type}V{2.data_type}R{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vasr{0.data_type}{1.data_type}{0.width_suffix}",
-            "ret": "s16",
-            "args": ["0hw", "0hw", "U32"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vasr_V{1.data_type}V{2.data_type}R_sat{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vasr{1.data_type}{0.data_type_plain}sat{0.width_suffix}",
-            "ret": "i(8-16)",
-            "args": ["0hws", "0hws", "U32"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vasr_V{1.data_type}V{2.data_type}R_rnd_sat{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vasr{1.data_type}{0.data_type_plain}rndsat{0.width_suffix}",
-            "ret": "i(8-16)",
-            "args": ["0hws", "0hws", "U32"]
-        },
-        {
-            "intrinsic": "V_equals_V{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vassign{0.width_suffix}",
-            "ret": "u32",
-            "args": ["0"]
-        },
-        {
-            "intrinsic": "W_equals_W{0.widthd_b}",
-            "width": [512, 1024],
-            "llvm": "vassignp{0.widthd_suffix}",
-            "ret": "u32d",
-            "args": ["0"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vavg_V{1.data_type}V{2.data_type}{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vavg{0.data_type}{0.width_suffix}",
-            "ret": "s(16-32)",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vavg_V{1.data_type}V{2.data_type}{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vavg{0.data_type}{0.width_suffix}",
-            "ret": "u(8-16)",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vavg_V{1.data_type}V{2.data_type}_rnd{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vavgrnd{0.data_type}{0.width_suffix}",
-            "ret": "s(16-32)",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vavg_V{1.data_type}V{2.data_type}_rnd{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vavgrnd{0.data_type}{0.width_suffix}",
-            "ret": "u(8-16)",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vcl0_V{1.data_type}{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vcl0{0.data_type_plain}{0.width_suffix}",
-            "ret": "u(16-32)",
-            "args": ["0"]
-        },
-        {
-            "intrinsic": "W_vcombine_VV{0.widthd_b}",
-            "width": [512, 1024],
-            "llvm": "vcombine{0.widthd_suffix}",
-            "ret": "u8d",
-            "args": ["0h", "0h"]
-        },
-        {
-            "intrinsic": "V_vzero{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vd0{0.width_suffix}",
-            "ret": "u32",
-            "args": []
-        },
-        {
-            "intrinsic": "V{0.data_type}_vdeal_V{1.data_type}{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vdeal{1.data_type}{0.width_suffix}",
-            "ret": "s(8-16)",
-            "args": ["0"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vdeale_V{1.data_type}V{2.data_type}{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vdeal{1.data_type}4w{0.width_suffix}",
-            "ret": "s8",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "W_vdeal_VVR{0.widthd_b}",
-            "width": [512, 1024],
-            "llvm": "vdealvdd{0.widthd_suffix}",
-            "ret": "u8d",
-            "args": ["0h", "0h", "U32"]
-        },
-        {
-            "intrinsic": "V_vdelta_VV{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vdelta{0.width_suffix}",
-            "ret": "u8",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vdmpy_V{1.data_type}Rb{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vdmpybus{0.width_suffix}",
-            "ret": "s16",
-            "args": ["u8", "U32"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vdmpyacc_V{1.data_type}V{2.data_type}Rb{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vdmpybus.acc{0.width_suffix}",
-            "ret": "s16",
-            "args": ["s16", "u8", "U32"]
-        },
-        {
-            "intrinsic": "W{0.data_type}_vdmpy_W{1.data_type}Rb{0.widthd_b}",
-            "width": [512, 1024],
-            "llvm": "vdmpybus.dv{0.widthd_suffix}",
-            "ret": "s16d",
-            "args": ["u8d", "U32"]
-        },
-        {
-            "intrinsic": "W{0.data_type}_vdmpyacc_W{1.data_type}W{2.data_type}Rb{0.widthd_b}",
-            "width": [512, 1024],
-            "llvm": "vdmpybus.dv.acc{0.widthd_suffix}",
-            "ret": "s16d",
-            "args": ["s16d", "u8d", "U32"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vdmpy_V{1.data_type}Rb{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vdmpyhb{0.width_suffix}",
-            "ret": "s32",
-            "args": ["s16", "U32"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vdmpyacc_V{1.data_type}V{2.data_type}Rb{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vdmpyhb.acc{0.width_suffix}",
-            "ret": "s32",
-            "args": ["s32", "s16", "U32"]
-        },
-        {
-            "intrinsic": "W{0.data_type}_vdmpy_W{1.data_type}Rb{0.widthd_b}",
-            "width": [512, 1024],
-            "llvm": "vdmpyhb.dv{0.widthd_suffix}",
-            "ret": "s32d",
-            "args": ["s16d", "U32"]
-        },
-        {
-            "intrinsic": "W{0.data_type}_vdmpyacc_W{1.data_type}W{2.data_type}Rb{0.widthd_b}",
-            "width": [512, 1024],
-            "llvm": "vdmpyhb.dv.acc{0.widthd_suffix}",
-            "ret": "s32d",
-            "args": ["s32d", "s16d", "U32"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vdmpy_W{1.data_type}Rh_sat{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vdmpyhisat{0.width_suffix}",
-            "ret": "s32",
-            "args": ["0d", "U32"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vdmpy_V{1.data_type}Rh_sat{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vdmpyhsat{0.width_suffix}",
-            "ret": "s32",
-            "args": ["s16", "U32"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vdmpy_W{1.data_type}Ruh_sat{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vdmpyhsuisat{0.width_suffix}",
-            "ret": "s32",
-            "args": ["s16d", "U32"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vdmpy_V{1.data_type}Ruh_sat{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vdmpyhsusat{0.width_suffix}",
-            "ret": "s32",
-            "args": ["s16", "U32"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vdmpy_V{1.data_type}V{2.data_type}_sat{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vdmpyhvsat{0.width_suffix}",
-            "ret": "s32",
-            "args": ["s16", "s16"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vdmpyacc_V{1.data_type}W{2.data_type}Rh_sat{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vdmpyhisat_acc{0.width_suffix}",
-            "ret": "s32",
-            "args": ["0", "0d", "U32"]
-        },
-        {
-            "intrinsic": "W{0.data_type}_vdsad_W{1.data_type}Ruh{0.widthd_b}",
-            "width": [512, 1024],
-            "llvm": "vdsaduh{0.widthd_suffix}",
-            "ret": "u32d",
-            "args": ["u16d", "U32"]
-        },
-        {
-            "intrinsic": "W{0.data_type}_vdsadacc_W{1.data_type}W{2.data_type}Ruh{0.widthd_b}",
-            "width": [512, 1024],
-            "llvm": "vdsaduh.acc{0.widthd_suffix}",
-            "ret": "u32d",
-            "args": ["0", "u16d", "U32"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vdmpyacc_V{1.data_type}V{2.data_type}Rh_sat{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vdmpyhsat_acc{0.width_suffix}",
-            "ret": "s32",
-            "args": ["0", "s16", "U32"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vdmpyacc_V{1.data_type}W{2.data_type}Ruh_sat{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vdmpyhsuisat_acc{0.width_suffix}",
-            "ret": "s32",
-            "args": ["0", "s16d", "U32"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vdmpyacc_V{1.data_type}V{2.data_type}Ruh_sat{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vdmpyhsusat_acc{0.width_suffix}",
-            "ret": "s32",
-            "args": ["0", "s16", "U32"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vdmpyacc_V{1.data_type}V{2.data_type}V{3.data_type}_sat{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vdmpyhvsat_acc{0.width_suffix}",
-            "ret": "s32",
-            "args": ["0", "s16", "s16"]
-        },
-        {
-            "intrinsic": "Q_vcmp_eq_V{1.data_type}V{2.data_type}{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "veq{1.data_type}{0.width_suffix}",
-            "ret": "u32hhh",
-            "args": ["s(8-32)", "1"]
-        },
-        {
-            "intrinsic": "Q_vcmp_eqand_QV{2.data_type}V{3.data_type}{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "veq{2.data_type}.and{0.width_suffix}",
-            "ret": "u32hhh",
-            "args": ["0", "s(8-32)", "2"]
-        },
-        {
-            "intrinsic": "Q_vcmp_eqor_QV{2.data_type}V{3.data_type}{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "veq{2.data_type}.or{0.width_suffix}",
-            "ret": "u32hhh",
-            "args": ["0", "s(8-32)", "2"]
-        },
-        {
-            "intrinsic": "Q_vcmp_eqxacc_QV{2.data_type}V{3.data_type}{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "veq{2.data_type}.xor{0.width_suffix}",
-            "ret": "u32hhh",
-            "args": ["0", "s(8-32)", "2"]
-        },
-        {
-            "intrinsic": "Q_vcmp_gt_V{1.data_type}V{2.data_type}{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vgt{1.data_type}{0.width_suffix}",
-            "ret": "u32hhh",
-            "args": ["s(8-32)", "1"]
-        },
-        {
-            "intrinsic": "Q_vcmp_gt_V{1.data_type}V{2.data_type}{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vgt{1.data_type}{0.width_suffix}",
-            "ret": "u32hhh",
-            "args": ["u(8-16)", "1"]
-        },
-        {
-            "intrinsic": "Q_vcmp_gtand_QV{2.data_type}V{3.data_type}{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vgt{2.data_type}.and{0.width_suffix}",
-            "ret": "u32hhh",
-            "args": ["0", "s(8-32)", "2"]
-        },
-        {
-            "intrinsic": "Q_vcmp_gtand_QV{2.data_type}V{3.data_type}{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vgt{2.data_type}.and{0.width_suffix}",
-            "ret": "u32hhh",
-            "args": ["0", "u(8-16)", "2"]
-        },
-        {
-            "intrinsic": "Q_vcmp_gtor_QV{2.data_type}V{3.data_type}{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vgt{2.data_type}.or{0.width_suffix}",
-            "ret": "u32hhh",
-            "args": ["0", "s(8-32)", "2"]
-        },
-        {
-            "intrinsic": "Q_vcmp_gtor_QV{2.data_type}V{3.data_type}{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vgt{2.data_type}.or{0.width_suffix}",
-            "ret": "u32hhh",
-            "args": ["0", "u(8-16)", "2"]
-        },
-        {
-            "intrinsic": "Q_vcmp_gtxacc_QV{2.data_type}V{3.data_type}{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vgt{2.data_type}.xor{0.width_suffix}",
-            "ret": "u32hhh",
-            "args": ["0", "s(8-32)", "2"]
-        },
-        {
-            "intrinsic": "Q_vcmp_gtxacc_QV{2.data_type}V{3.data_type}{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vgt{2.data_type}.xor{0.width_suffix}",
-            "ret": "u32hhh",
-            "args": ["0", "u(8-16)", "2"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vinsert_V{1.data_type}R{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vinsertwr{0.width_suffix}",
-            "ret": "s32",
-            "args": ["S32"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vlsr_V{1.data_type}R{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vlsr{0.data_type_plain}{0.width_suffix}",
-            "ret": "u(16-32)",
-            "args": ["0", "U32"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vlsr_V{1.data_type}V{2.data_type}{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vlsr{0.data_type}v{0.width_suffix}",
-            "ret": "s(16-32)",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vlut32_V{1.data_type}V{2.data_type}R{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vlutvv{0.data_type}{0.width_suffix}",
-            "ret": "s8",
-            "args": ["0", "0", "U32"]
-        },
-        {
-            "intrinsic": "W{0.data_type}_vlut16_V{1.data_type}V{2.data_type}R{0.widthd_b}",
-            "width": [512, 1024],
-            "llvm": "vlutvw{0.data_type}{0.widthd_suffix}",
-            "ret": "s16d",
-            "args": ["s8", "s16", "U32"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vlut32or_V{1.data_type}V{2.data_type}V{3.data_type}R{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vlutvv{0.data_type}.oracc{0.width_suffix}",
-            "ret": "s8",
-            "args": ["0", "0", "0", "U32"]
-        },
-        {
-            "intrinsic": "W{0.data_type}_vlut16or_W{1.data_type}V{2.data_type}V{3.data_type}R{0.widthd_b}",
-            "width": [512, 1024],
-            "llvm": "vlutvw{0.data_type}.oracc{0.widthd_suffix}",
-            "ret": "s16d",
-            "args": ["0", "s8", "s16", "U32"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vmax_V{1.data_type}V{2.data_type}{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vmax{0.data_type}{0.width_suffix}",
-            "ret": "s(16-32)",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vmax_V{1.data_type}V{2.data_type}{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vmax{0.data_type}{0.width_suffix}",
-            "ret": "u(8-16)",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vmin_V{1.data_type}V{2.data_type}{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vmin{0.data_type}{0.width_suffix}",
-            "ret": "s(16-32)",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vmin_V{1.data_type}V{2.data_type}{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vmin{0.data_type}{0.width_suffix}",
-            "ret": "u(8-16)",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "W{0.data_type}_vmpa_W{1.data_type}Rb{0.widthd_b}",
-            "width": [512, 1024],
-            "llvm": "vmpabus{0.widthd_suffix}",
-            "ret": "s16d",
-            "args": ["u8d", "U32"]
-        },
-        {
-            "intrinsic": "W{0.data_type}_vmpaacc_W{1.data_type}W{2.data_type}Rb{0.widthd_b}",
-            "width": [512, 1024],
-            "llvm": "vmpabus.acc{0.widthd_suffix}",
-            "ret": "s16d",
-            "args": ["0", "u8d", "U32"]
-        },
-        {
-            "intrinsic": "W{0.data_type}_vmpa_W{1.data_type}W{2.data_type}{0.widthd_b}",
-            "width": [512, 1024],
-            "llvm": "vmpab{1.kind}{2.kind}v{0.widthd_suffix}",
-            "ret": "s16d",
-            "args": ["u8d", "i8d"]
-        },
-        {
-            "intrinsic": "W{0.data_type}_vmpa_W{1.data_type}Rb{0.widthd_b}",
-            "width": [512, 1024],
-            "llvm": "vmpahb{0.widthd_suffix}",
-            "ret": "s32d",
-            "args": ["s16d", "U32"]
-        },
-        {
-            "intrinsic": "W{0.data_type}_vmpaacc_W{1.data_type}W{2.data_type}Rb{0.widthd_b}",
-            "width": [512, 1024],
-            "llvm": "vmpahb.acc{0.widthd_suffix}",
-            "ret": "s32d",
-            "args": ["0", "s16d", "U32"]
-        },
-        {
-            "intrinsic": "W{0.data_type}_vmpy_V{1.data_type}V{2.data_type}{0.widthd_b}",
-            "width": [512, 1024],
-            "llvm": "vmpy{1.data_type}us{0.widthd_suffix}",
-            "ret": "s(16-32)d",
-            "args": ["0n", "0nu"]
-        },
-        {
-            "intrinsic": "W{0.data_type}_vmpyacc_W{1.data_type}V{2.data_type}V{3.data_type}{0.widthd_b}",
-            "width": [512, 1024],
-            "llvm": "vmpy{2.data_type}us.acc{0.widthd_suffix}",
-            "ret": "s(16-32)d",
-            "args": ["0", "0n", "0nu"]
-        },
-        {
-            "intrinsic": "W{0.data_type}_vmpy_V{1.data_type}V{2.data_type}{0.widthd_b}",
-            "width": [512, 1024],
-            "llvm": "vmpybusv{0.widthd_suffix}",
-            "ret": "s16d",
-            "args": ["u8", "s8"]
-        },
-        {
-            "intrinsic": "W{0.data_type}_vmpyacc_W{1.data_type}V{2.data_type}V{3.data_type}{0.widthd_b}",
-            "width": [512, 1024],
-            "llvm": "vmpybusv.acc{0.widthd_suffix}",
-            "ret": "s16d",
-            "args": ["0", "0nu", "0n"]
-        },
-        {
-            "intrinsic": "W{0.data_type}_vmpy_V{1.data_type}V{2.data_type}{0.widthd_b}",
-            "width": [512, 1024],
-            "llvm": "vmpy{1.data_type}v{0.widthd_suffix}",
-            "ret": "i(16-32)d",
-            "args": ["0n", "0n"]
-        },
-        {
-            "intrinsic": "W{0.data_type}_vmpyacc_W{1.data_type}V{2.data_type}V{3.data_type}{0.widthd_b}",
-            "width": [512, 1024],
-            "llvm": "vmpy{2.data_type}v.acc{0.widthd_suffix}",
-            "ret": "i(16-32)d",
-            "args": ["0", "0n", "0n"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vmpye_V{1.data_type}V{2.data_type}{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vmpyewuh{0.width_suffix}",
-            "ret": "s32",
-            "args": ["s32", "u16"]
-        },
-        {
-            "intrinsic": "W{0.data_type}_vmpy_V{1.data_type}R{1.data_type}{0.widthd_b}",
-            "width": [512, 1024],
-            "llvm": "vmpy{1.data_type}{0.widthd_suffix}",
-            "ret": "i32d",
-            "args": ["0n", "U32"]
-        },
-        {
-            "intrinsic": "W{0.data_type}_vmpyacc_W{1.data_type}V{2.data_type}R{2.data_type}_sat{0.widthd_b}",
-            "width": [512, 1024],
-            "llvm": "vmpy{2.data_type}sat.acc{0.widthd_suffix}",
-            "ret": "s32d",
-            "args": ["0", "0n", "U32"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vmpy_V{1.data_type}R{1.data_type}_s1_rnd_sat{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vmpy{1.data_type}srs{0.width_suffix}",
-            "ret": "s32",
-            "args": ["0nd", "U32"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vmpy_V{1.data_type}R{1.data_type}_s1_sat{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vmpy{1.data_type}ss{0.width_suffix}",
-            "ret": "s32",
-            "args": ["0nd", "U32"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vmpy_V{1.data_type}V{2.data_type}_s1_rnd_sat{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vmpy{1.data_type}vsrs{0.width_suffix}",
-            "ret": "s16",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vmpyieo_V{1.data_type}V{2.data_type}{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vmpyieo{1.data_type}{0.width_suffix}",
-            "ret": "s32",
-            "args": ["0nd", "0nd"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vmpyieacc_V{1.data_type}V{2.data_type}V{3.data_type}{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vmpyie{2.data_type}{3.data_type}.acc{0.width_suffix}",
-            "ret": "s32",
-            "args": ["0", "0", "i16"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vmpyie_V{1.data_type}V{2.data_type}{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vmpyie{1.data_type}{2.data_type}{0.width_suffix}",
-            "ret": "s32",
-            "args": ["0", "u16"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vmpyi_V{1.data_type}V{2.data_type}{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vmpyi{1.data_type}{0.width_suffix}",
-            "ret": "s16",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vmpyiacc_V{1.data_type}V{2.data_type}V{3.data_type}{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vmpyi{1.data_type}.acc{0.width_suffix}",
-            "ret": "s16",
-            "args": ["0", "0", "0"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vmpyi_V{1.data_type}Rb{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vmpyi{1.data_type}b{0.width_suffix}",
-            "ret": "s(16-32)",
-            "args": ["0", "U32"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vmpyiacc_V{1.data_type}V{2.data_type}Rb{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vmpyi{1.data_type}b.acc{0.width_suffix}",
-            "ret": "s(16-32)",
-            "args": ["0", "0", "U32"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vmpyi_V{1.data_type}Rh{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vmpyi{1.data_type}h{0.width_suffix}",
-            "ret": "s32",
-            "args": ["0", "U32"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vmpyiacc_V{1.data_type}V{2.data_type}Rh{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vmpyi{1.data_type}h.acc{0.width_suffix}",
-            "ret": "s32",
-            "args": ["0", "0", "U32"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vmpyi_V{1.data_type}Rub{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vmpyi{1.data_type}ub{0.width_suffix}",
-            "ret": "s32",
-            "args": ["0", "U32"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vmpyiacc_V{1.data_type}V{2.data_type}Rub{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vmpyi{1.data_type}ub.acc{0.width_suffix}",
-            "ret": "s32",
-            "args": ["0", "0", "U32"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vmpyo_V{1.data_type}V{2.data_type}_s1_sat{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vmpyo{1.data_type}{2.data_type}{0.width_suffix}",
-            "ret": "s32",
-            "args": ["0", "0nd"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vmpyo_V{1.data_type}V{2.data_type}_s1_rnd_sat{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vmpyo{1.data_type}{2.data_type}.rnd{0.width_suffix}",
-            "ret": "s32",
-            "args": ["0", "0nd"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vmpyo_V{1.data_type}V{2.data_type}_s1_rnd_sat_shift{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vmpyo{1.data_type}{2.data_type}.rnd.sacc{0.width_suffix}",
-            "ret": "s32",
-            "args": ["0", "0nd"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vmpyo_V{1.data_type}V{2.data_type}_s1_sat_shift{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vmpyo{1.data_type}{2.data_type}.sacc{0.width_suffix}",
-            "ret": "s32",
-            "args": ["0", "0nd"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vmpyio_V{1.data_type}V{2.data_type}{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vmpyio{1.data_type}{2.data_type}{0.width_suffix}",
-            "ret": "s32",
-            "args": ["0", "0nd"]
-        },
-        {
-            "intrinsic": "W{0.data_type}_vmpy_V{1.data_type}R{1.data_type}{0.widthd_b}",
-            "width": [512, 1024],
-            "llvm": "vmpy{1.data_type}{0.widthd_suffix}",
-            "ret": "u16d",
-            "args": ["0n", "U32"]
-        },
-        {
-            "intrinsic": "W{0.data_type}_vmpyacc_W{1.data_type}V{2.data_type}R{2.data_type}{0.widthd_b}",
-            "width": [512, 1024],
-            "llvm": "vmpy{2.data_type}.acc{0.widthd_suffix}",
-            "ret": "u(16-32)d",
-            "args": ["0", "0n", "U32"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vmux_QVV{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vmux{0.width_suffix}",
-            "ret": "u32",
-            "args": ["0hhh", "0", "0"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vnavg_V{1.data_type}V{2.data_type}{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vnavg{0.data_type}{0.width_suffix}",
-            "ret": "i(16-32)",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vnavg_V{1.data_type}V{2.data_type}{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vnavg{0.data_type}{0.width_suffix}",
-            "ret": "u8",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vnormamt_V{1.data_type}{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vnormamt{0.data_type}{0.width_suffix}",
-            "ret": "s(16-32)",
-            "args": ["0"]
-        },
-        {
-            "intrinsic": "V_vnot_VV{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vnot{0.width_suffix}",
-            "ret": "u16",
-            "args": ["0"]
-        },
-        {
-            "intrinsic": "V_vor_VV{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vor{0.width_suffix}",
-            "ret": "u16",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vpacke_V{1.data_type}V{2.data_type}{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vpack{1.data_type}e{0.width_suffix}",
-            "ret": "s(8-16)",
-            "args": ["0hw", "0hw"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vpacko_V{1.data_type}V{2.data_type}{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vpack{1.data_type}o{0.width_suffix}",
-            "ret": "s(8-16)",
-            "args": ["0hw", "0hw"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vpack_V{1.data_type}V{2.data_type}_sat{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vpack{1.data_type}{0.data_type}.sat{0.width_suffix}",
-            "ret": "i(8-16)",
-            "args": ["0hws", "0hws"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vpopcount_V{1.data_type}{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vpopcount{0.data_type}{0.width_suffix}",
-            "ret": "s16",
-            "args": ["0"]
-        },
-        {
-            "intrinsic": "V_vrdelta_VV{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vrdelta{0.width_suffix}",
-            "ret": "u8",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vrmpy_V{1.data_type}Rb{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vrmpybus{0.width_suffix}",
-            "ret": "s32",
-            "args": ["u8", "U32"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vrmpyacc_V{1.data_type}V{2.data_type}Rb{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vrmpybus.acc{0.width_suffix}",
-            "ret": "s32",
-            "args": ["0", "u8", "U32"]
-        },
-        {
-            "intrinsic": "W{0.data_type}_vrmpy_W{1.data_type}RbI{0.widthd_b}",
-            "width": [512, 1024],
-            "llvm": "vrmpybusi{0.widthd_suffix}",
-            "ret": "s32d",
-            "args": ["u8d", "U32"]
-        },
-        {
-            "intrinsic": "W{0.data_type}_vrmpyacc_W{1.data_type}W{2.data_type}RbI{0.widthd_b}",
-            "width": [512, 1024],
-            "llvm": "vrmpybusi.acc{0.widthd_suffix}",
-            "ret": "s32d",
-            "args": ["0", "u8d", "U32"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vrmpy_V{1.data_type}V{2.data_type}{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vrmpybusv{0.width_suffix}",
-            "ret": "s32",
-            "args": ["u8", "s8"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vrmpyacc_V{1.data_type}V{2.data_type}V{3.data_type}{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vrmpybusv.acc{0.width_suffix}",
-            "ret": "s32",
-            "args": ["0", "u8", "s8"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vrmpy_V{1.data_type}V{2.data_type}{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vrmpy{1.data_type}v{0.width_suffix}",
-            "ret": "i32",
-            "args": ["0nndd", "0nndd"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vrmpyacc_V{1.data_type}V{2.data_type}V{3.data_type}{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vrmpy{1.data_type}v.acc{0.width_suffix}",
-            "ret": "i32",
-            "args": ["0", "0nndd", "0nndd"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vrmpy_V{1.data_type}Rub{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vrmpyub{0.width_suffix}",
-            "ret": "u32",
-            "args": ["u8", "U32"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vrmpyacc_V{1.data_type}V{2.data_type}Rub{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vrmpyub.acc{0.width_suffix}",
-            "ret": "u32",
-            "args": ["0", "u8", "U32"]
-        },
-        {
-            "intrinsic": "W{0.data_type}_vrmpy_W{1.data_type}RubI{0.widthd_b}",
-            "width": [512, 1024],
-            "llvm": "vrmpyubi{0.widthd_suffix}",
-            "ret": "u32d",
-            "args": ["u8d", "U32"]
-        },
-        {
-            "intrinsic": "W{0.data_type}_vrmpyacc_W{1.data_type}W{2.data_type}RubI{0.widthd_b}",
-            "width": [512, 1024],
-            "llvm": "vrmpyubi.acc{0.widthd_suffix}",
-            "ret": "u32d",
-            "args": ["0", "u8d", "U32"]
-        },
-        {
-            "intrinsic": "V_vror_VR{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vror{0.width_suffix}",
-            "ret": "u8",
-            "args": ["0", "U32"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vround_V{1.data_type}V{2.data_type}_sat{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vround{1.data_type}{0.data_type}{0.width_suffix}",
-            "ret": "i(8-16)",
-            "args": ["0hws", "0hws"]
-        },
-        {
-            "intrinsic": "W{0.data_type}_vrsad_W{1.data_type}RubI{0.widthd_b}",
-            "width": [512, 1024],
-            "llvm": "vrsadubi{0.widthd_suffix}",
-            "ret": "u32d",
-            "args": ["u8d", "U32"]
-        },
-        {
-            "intrinsic": "W{0.data_type}_vrsadacc_W{1.data_type}W{2.data_type}RubI{0.widthd_b}",
-            "width": [512, 1024],
-            "llvm": "vrsadubi.acc{0.widthd_suffix}",
-            "ret": "u32d",
-            "args": ["0", "u8d", "U32"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vsat_V{1.data_type}V{2.data_type}{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vsat{1.data_type}{0.data_type}{0.width_suffix}",
-            "ret": "u8",
-            "args": ["0hws", "0hws"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vsat_V{1.data_type}V{2.data_type}{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vsat{1.data_type}{0.data_type}{0.width_suffix}",
-            "ret": "s16",
-            "args": ["0hw", "0hw"]
-        },
-        {
-            "intrinsic": "W{0.data_type}_vsxt_V{1.data_type}{0.widthd_b}",
-            "width": [512, 1024],
-            "llvm": "vs{1.data_type}{0.widthd_suffix}",
-            "ret": "s(16-32)d",
-            "args": ["0n"]
-        },
-        {
-            "intrinsic": "W{0.data_type}_vzxt_V{1.data_type}{0.widthd_b}",
-            "width": [512, 1024],
-            "llvm": "vz{1.data_type_plain}{0.widthd_suffix}",
-            "ret": "u(16-32)d",
-            "args": ["0n"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_condacc_QV{2.data_type}V{3.data_type}{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vadd{0.data_type}q{0.width_suffix}",
-            "ret": "s(8-32)",
-            "args": ["u32hhh", "0", "0"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_condacc_QnV{2.data_type}V{3.data_type}{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vadd{0.data_type}nq{0.width_suffix}",
-            "ret": "s(8-32)",
-            "args": ["u32hhh", "0", "0"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_condnac_QV{2.data_type}V{3.data_type}{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vsub{0.data_type}q{0.width_suffix}",
-            "ret": "s(8-32)",
-            "args": ["u32hhh", "0", "0"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_condnac_QnV{2.data_type}V{3.data_type}{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vsub{0.data_type}nq{0.width_suffix}",
-            "ret": "s(8-32)",
-            "args": ["u32hhh", "0", "0"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vshuffe_V{1.data_type}V{2.data_type}{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vshufe{1.data_type}{0.width_suffix}",
-            "ret": "s16",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vshuffo_V{1.data_type}V{2.data_type}{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vshufo{1.data_type}{0.width_suffix}",
-            "ret": "s16",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vshuff_V{1.data_type}{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vshuff{1.data_type}{0.width_suffix}",
-            "ret": "s(8-16)",
-            "args": ["0"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vshuffe_V{1.data_type}V{2.data_type}{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vshuffe{1.data_type}{0.width_suffix}",
-            "ret": "s8",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vshuffo_V{1.data_type}V{2.data_type}{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vshuffo{1.data_type}{0.width_suffix}",
-            "ret": "s8",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vshuffoe_V{1.data_type}V{2.data_type}{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vshuffoe{1.data_type}{0.width_suffix}",
-            "ret": "s(8-16)",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "W_vshuff_VVR{0.widthd_b}",
-            "width": [512, 1024],
-            "llvm": "vshufvvd{0.widthd_suffix}",
-            "ret": "u8d",
-            "args": ["0h", "0h", "U32"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vsub_V{1.data_type}V{2.data_type}{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vsub{0.data_type}{0.width_suffix}",
-            "ret": "s(8-32)",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vsub_V{1.data_type}V{2.data_type}_sat{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vsub{0.data_type}sat{0.width_suffix}",
-            "ret": "s(16-32)",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "V{0.data_type}_vsub_V{1.data_type}V{2.data_type}_sat{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vsub{0.data_type}sat{0.width_suffix}",
-            "ret": "u(8-16)",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "W{0.data_type}_vsub_W{1.data_type}W{2.data_type}{0.widthd_b}",
-            "width": [512, 1024],
-            "llvm": "vsub{0.data_type}.dv{0.widthd_suffix}",
-            "ret": "s(8-32)d",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "W{0.data_type}_vsub_W{1.data_type}W{2.data_type}_sat{0.widthd_b}",
-            "width": [512, 1024],
-            "llvm": "vsub{0.data_type}sat.dv{0.widthd_suffix}",
-            "ret": "s(16-32)d",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "W{0.data_type}_vsub_W{1.data_type}W{2.data_type}_sat{0.widthd_b}",
-            "width": [512, 1024],
-            "llvm": "vsub{0.data_type}sat.dv{0.widthd_suffix}",
-            "ret": "u(8-16)d",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "W_vswap_QVV{0.widthd_b}",
-            "width": [512, 1024],
-            "llvm": "vswap{0.widthd_suffix}",
-            "ret": "u8d",
-            "args": ["u32hhh", "0h", "0h"]
-        },
-        {
-            "intrinsic": "W{0.data_type}_vtmpy_W{1.data_type}Rb{0.widthd_b}",
-            "width": [512, 1024],
-            "llvm": "vtmpyb{0.widthd_suffix}",
-            "ret": "s16d",
-            "args": ["0nd", "U32"]
-        },
-        {
-            "intrinsic": "W{0.data_type}_vtmpyacc_W{1.data_type}W{2.data_type}Rb{0.widthd_b}",
-            "width": [512, 1024],
-            "llvm": "vtmpyb.acc{0.widthd_suffix}",
-            "ret": "s16d",
-            "args": ["0", "0nd", "U32"]
-        },
-        {
-            "intrinsic": "W{0.data_type}_vtmpy_W{1.data_type}Rb{0.widthd_b}",
-            "width": [512, 1024],
-            "llvm": "vtmpybus{0.widthd_suffix}",
-            "ret": "s16d",
-            "args": ["u8d", "U32"]
-        },
-        {
-            "intrinsic": "W{0.data_type}_vtmpyacc_W{1.data_type}W{2.data_type}Rb{0.widthd_b}",
-            "width": [512, 1024],
-            "llvm": "vtmpybus.acc{0.widthd_suffix}",
-            "ret": "s16d",
-            "args": ["0", "u8d", "U32"]
-        },
-        {
-            "intrinsic": "W{0.data_type}_vtmpy_W{1.data_type}Rb{0.widthd_b}",
-            "width": [512, 1024],
-            "llvm": "vtmpyhb{0.widthd_suffix}",
-            "ret": "s32d",
-            "args": ["0nd", "U32"]
-        },
-        {
-            "intrinsic": "W{0.data_type}_vunpack_V{1.data_type}{0.widthd_b}",
-            "width": [512, 1024],
-            "llvm": "vunpack{1.data_type}{0.widthd_suffix}",
-            "ret": "i(16-32)d",
-            "args": ["0n"]
-        },
-        {
-            "intrinsic": "W{0.data_type}_vunpackoor_W{1.data_type}V{2.data_type}{0.widthd_b}",
-            "width": [512, 1024],
-            "llvm": "vunpacko{2.data_type}{0.widthd_suffix}",
-            "ret": "s(16-32)d",
-            "args": ["0", "0n"]
-        },
-        {
-            "intrinsic": "W{0.data_type}_vtmpyacc_W{1.data_type}W{2.data_type}Rb{0.widthd_b}",
-            "width": [512, 1024],
-            "llvm": "vtmpyhb.acc{0.widthd_suffix}",
-            "ret": "s32d",
-            "args": ["0", "0nd", "U32"]
-        },
-        {
-            "intrinsic": "V_vxor_VV{0.width_b}",
-            "width": [512, 1024],
-            "llvm": "vxor{0.width_suffix}",
-            "ret": "u16",
-            "args": ["0", "0"]
-        }
-    ]
-}
diff --git a/src/etc/platform-intrinsics/nvptx/cuda.json b/src/etc/platform-intrinsics/nvptx/cuda.json
deleted file mode 100644
index 1beaaeb..0000000
--- a/src/etc/platform-intrinsics/nvptx/cuda.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
-    "intrinsic_prefix": "_",
-    "llvm_prefix": "llvm.cuda.",
-    "intrinsics": [
-        {
-            "intrinsic": "syncthreads",
-            "width": ["0"],
-            "llvm": "syncthreads",
-            "ret": "V",
-            "args": []
-        }
-    ]
-}
diff --git a/src/etc/platform-intrinsics/nvptx/info.json b/src/etc/platform-intrinsics/nvptx/info.json
deleted file mode 100644
index 80332c5..0000000
--- a/src/etc/platform-intrinsics/nvptx/info.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
-  "platform": "nvptx",
-  "number_info": {
-    "signed": {}
-  },
-  "width_info": {}
-}
diff --git a/src/etc/platform-intrinsics/nvptx/sreg.json b/src/etc/platform-intrinsics/nvptx/sreg.json
deleted file mode 100644
index 33d97f2..0000000
--- a/src/etc/platform-intrinsics/nvptx/sreg.json
+++ /dev/null
@@ -1,90 +0,0 @@
-{
-    "intrinsic_prefix": "_",
-    "llvm_prefix": "llvm.nvvm.read.ptx.sreg.",
-    "intrinsics": [
-        {
-            "intrinsic": "block_dim_x",
-            "width": ["0"],
-            "llvm": "ntid.x",
-            "ret": "S32",
-            "args": []
-        },
-        {
-            "intrinsic": "block_dim_y",
-            "width": ["0"],
-            "llvm": "ntid.y",
-            "ret": "S32",
-            "args": []
-        },
-        {
-            "intrinsic": "block_dim_z",
-            "width": ["0"],
-            "llvm": "ntid.z",
-            "ret": "S32",
-            "args": []
-        },
-        {
-            "intrinsic": "block_idx_x",
-            "width": ["0"],
-            "llvm": "ctaid.x",
-            "ret": "S32",
-            "args": []
-        },
-        {
-            "intrinsic": "block_idx_y",
-            "width": ["0"],
-            "llvm": "ctaid.y",
-            "ret": "S32",
-            "args": []
-        },
-        {
-            "intrinsic": "block_idx_z",
-            "width": ["0"],
-            "llvm": "ctaid.z",
-            "ret": "S32",
-            "args": []
-        },
-        {
-            "intrinsic": "grid_dim_x",
-            "width": ["0"],
-            "llvm": "nctaid.x",
-            "ret": "S32",
-            "args": []
-        },
-        {
-            "intrinsic": "grid_dim_y",
-            "width": ["0"],
-            "llvm": "nctaid.y",
-            "ret": "S32",
-            "args": []
-        },
-        {
-            "intrinsic": "grid_dim_z",
-            "width": ["0"],
-            "llvm": "nctaid.z",
-            "ret": "S32",
-            "args": []
-        },
-        {
-            "intrinsic": "thread_idx_x",
-            "width": ["0"],
-            "llvm": "tid.x",
-            "ret": "S32",
-            "args": []
-        },
-        {
-            "intrinsic": "thread_idx_y",
-            "width": ["0"],
-            "llvm": "tid.y",
-            "ret": "S32",
-            "args": []
-        },
-        {
-            "intrinsic": "thread_idx_z",
-            "width": ["0"],
-            "llvm": "tid.z",
-            "ret": "S32",
-            "args": []
-        }
-    ]
-}
diff --git a/src/etc/platform-intrinsics/powerpc.json b/src/etc/platform-intrinsics/powerpc.json
deleted file mode 100644
index acb6813..0000000
--- a/src/etc/platform-intrinsics/powerpc.json
+++ /dev/null
@@ -1,294 +0,0 @@
-{
-    "platform": "powerpc",
-    "intrinsic_prefix": "_vec_",
-    "llvm_prefix": "llvm.ppc.altivec.",
-    "number_info": {
-        "unsigned": {
-            "kind" : "u",
-            "data_type_short": { "8": "b", "16": "h", "32": "w", "64": "d" }
-        },
-        "signed": {
-            "kind" : "s",
-            "data_type_short": { "8": "b", "16": "h", "32": "w", "64": "d" }
-        },
-        "float": {}
-    },
-    "width_info": {
-        "128": { "width": "" }
-    },
-    "intrinsics": [
-        {
-            "intrinsic": "perm",
-            "width": [128],
-            "llvm": "vperm",
-            "ret": "s32",
-            "args": ["0", "0", "s8"]
-        },
-        {
-            "intrinsic": "mradds",
-            "width": [128],
-            "llvm": "vmhraddshs",
-            "ret": "s16",
-            "args": ["0", "0", "0"]
-        },
-        {
-            "intrinsic": "cmpb",
-            "width": [128],
-            "llvm": "vcmpbfp",
-            "ret": "s32",
-            "args": ["f32", "f32"]
-        },
-        {
-            "intrinsic": "cmpeq{0.data_type_short}",
-            "width": [128],
-            "llvm": "vcmpequ{0.data_type_short}",
-            "ret": "s(8-32)",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "cmpgt{1.kind}{1.data_type_short}",
-            "width": [128],
-            "llvm": "vcmpgt{1.kind}{1.data_type_short}",
-            "ret": "s(8-32)",
-            "args": ["0u", "1"]
-        },
-        {
-            "intrinsic": "cmpgt{1.kind}{1.data_type_short}",
-            "width": [128],
-            "llvm": "vcmpgt{1.kind}{1.data_type_short}",
-            "ret": "s(8-32)",
-            "args": ["0", "1"]
-        },
-        {
-            "intrinsic": "max{0.kind}{0.data_type_short}",
-            "width": [128],
-            "llvm": "vmax{0.kind}{0.data_type_short}",
-            "ret": "i(8-32)",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "min{0.kind}{0.data_type_short}",
-            "width": [128],
-            "llvm": "vmin{0.kind}{0.data_type_short}",
-            "ret": "i(8-32)",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "sub{0.kind}{0.data_type_short}s",
-            "width": [128],
-            "llvm": "vsub{0.kind}{0.data_type_short}s",
-            "ret": "i(8-32)",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "subc",
-            "width": [128],
-            "llvm": "vsubcuw",
-            "ret": "u32",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "add{0.kind}{0.data_type_short}s",
-            "width": [128],
-            "llvm": "vadd{0.kind}{0.data_type_short}s",
-            "ret": "i(8-32)",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "addc",
-            "width": [128],
-            "llvm": "vaddcuw",
-            "ret": "u32",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "mule{1.kind}{1.data_type_short}",
-            "width": [128],
-            "llvm": "vmule{0.kind}{1.data_type_short}",
-            "ret": "i(16-32)",
-            "args": ["0N", "1"]
-        },
-        {
-            "intrinsic": "mulo{1.kind}{1.data_type_short}",
-            "width": [128],
-            "llvm": "vmulo{0.kind}{1.data_type_short}",
-            "ret": "i(16-32)",
-            "args": ["0N", "1"]
-        },
-        {
-            "intrinsic": "avg{0.kind}{0.data_type_short}",
-            "width": [128],
-            "llvm": "vavg{0.kind}{0.data_type_short}",
-            "ret": "i(8-32)",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "packs{0.kind}{1.data_type_short}",
-            "width": [128],
-            "llvm": "vpk{0.kind}{1.data_type_short}{0.kind}s",
-            "ret": "i(8-16)",
-            "args": ["0W", "1"]
-        },
-        {
-            "intrinsic": "packsu{1.kind}{1.data_type_short}",
-            "width": [128],
-            "llvm": "vpk{1.kind}{1.data_type_short}{0.kind}s",
-            "ret": "u(8-16)",
-            "args": ["0Ws", "1"]
-        },
-        {
-            "intrinsic": "packpx",
-            "width": [128],
-            "llvm": "vpkpx",
-            "ret": "s16",
-            "args": ["s32", "s32"]
-        },
-        {
-            "intrinsic": "unpackl{1.kind}{1.data_type_short}",
-            "width": [128],
-            "llvm": "vupkl{1.kind}{1.data_type_short}",
-            "ret": "s(16-32)",
-            "args": ["0N"]
-        },
-        {
-            "intrinsic": "unpackh{1.kind}{1.data_type_short}",
-            "width": [128],
-            "llvm": "vupkh{1.kind}{1.data_type_short}",
-            "ret": "s(16-32)",
-            "args": ["0N"]
-        },
-        {
-            "intrinsic": "madds",
-            "width": [128],
-            "llvm": "vmhaddshs",
-            "ret": "s16",
-            "args": ["0", "0", "0"]
-        },
-        {
-            "intrinsic": "msumu{1.data_type_short}m",
-            "width": [128],
-            "llvm": "vmsumu{1.data_type_short}m",
-            "ret": "u32",
-            "args": ["u(8-16)", "1", "u32"]
-        },
-        {
-            "intrinsic": "msummbm",
-            "width": [128],
-            "llvm": "vmsummbm",
-            "ret": "s32",
-            "args": ["s8", "u8", "s32"]
-        },
-        {
-            "intrinsic": "msumshm",
-            "width": [128],
-            "llvm": "vmsumshm",
-            "ret": "s32",
-            "args": ["s16", "s16", "s32"]
-        },
-        {
-            "intrinsic": "msum{0.kind}hs",
-            "width": [128],
-            "llvm": "vmsum{0.kind}hs",
-            "ret": "i32",
-            "args": ["0N", "0N", "0"]
-        },
-        {
-            "intrinsic": "sum2s",
-            "width": [128],
-            "llvm": "vsum2sws",
-            "ret": "s32",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "sum4{0.kind}bs",
-            "width": [128],
-            "llvm": "vsum4{0.kind}bs",
-            "ret": "i32",
-            "args": ["0NN", "0"]
-        },
-        {
-            "intrinsic": "sum4shs",
-            "width": [128],
-            "llvm": "vsum4shs",
-            "ret": "s32",
-            "args": ["0N", "0"]
-        },
-        {
-            "intrinsic": "sums",
-            "width": [128],
-            "llvm": "vsumsws",
-            "ret": "s32",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "madd",
-            "width": [128],
-            "llvm": "vmaddfp",
-            "ret": "f32",
-            "args": ["0", "0", "0"]
-        },
-        {
-            "intrinsic": "nmsub",
-            "width": [128],
-            "llvm": "vnmsubfp",
-            "ret": "f32",
-            "args": ["0", "0", "0"]
-        },
-        {
-            "intrinsic": "expte",
-            "width": [128],
-            "llvm": "vexptefp",
-            "ret": "f32",
-            "args": ["0"]
-        },
-        {
-            "intrinsic": "floor",
-            "width": [128],
-            "llvm": "vrfim",
-            "ret": "f32",
-            "args": ["0"]
-        },
-        {
-            "intrinsic": "ceil",
-            "width": [128],
-            "llvm": "vrfip",
-            "ret": "f32",
-            "args": ["0"]
-        },
-        {
-            "intrinsic": "round",
-            "width": [128],
-            "llvm": "vrfin",
-            "ret": "f32",
-            "args": ["0"]
-        },
-        {
-            "intrinsic": "trunc",
-            "width": [128],
-            "llvm": "vrfiz",
-            "ret": "f32",
-            "args": ["0"]
-        },
-        {
-            "intrinsic": "loge",
-            "width": [128],
-            "llvm": "vlogefp",
-            "ret": "f32",
-            "args": ["0"]
-        },
-        {
-            "intrinsic": "re",
-            "width": [128],
-            "llvm": "vrefp",
-            "ret": "f32",
-            "args": ["0"]
-        },
-        {
-            "intrinsic": "rsqrte",
-            "width": [128],
-            "llvm": "vrsqrtefp",
-            "ret": "f32",
-            "args": ["0"]
-        }
-    ]
-}
diff --git a/src/etc/platform-intrinsics/x86/avx.json b/src/etc/platform-intrinsics/x86/avx.json
deleted file mode 100644
index 1f41e2e..0000000
--- a/src/etc/platform-intrinsics/x86/avx.json
+++ /dev/null
@@ -1,272 +0,0 @@
-{
-    "intrinsic_prefix": "_mm",
-    "llvm_prefix": "llvm.x86.avx.",
-    "intrinsics": [
-        {
-            "intrinsic": "256_addsub_{0.data_type}",
-            "width": [256],
-            "llvm": "addsub.{0.data_type}.256",
-            "ret": "f(32-64)",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "256_blendv_{0.data_type}",
-            "width": [256],
-            "llvm": "blendv.{0.data_type}.256",
-            "ret": "f(32-64)",
-            "args": ["0", "0", "0"]
-        },
-        {
-            "intrinsic": "256_broadcast_{0.data_type}",
-            "width": [256],
-            "llvm": "vbroadcastf128.{0.data_type}.256",
-            "ret": "f(32-64)",
-            "args": ["s8SPc"]
-        },
-        {
-            "intrinsic": "256_cmp_{0.data_type}",
-            "width": [256],
-            "llvm": "cmp.{1.data_type}.256",
-            "ret": "f(32-64)",
-            "args": ["0", "0", "s8S"]
-        },
-        {
-            "intrinsic": "256_cvtepi32_pd",
-            "width": [256],
-            "llvm": "cvtdq2.pd.256",
-            "ret": "f64",
-            "args": ["s32h"]
-        },
-        {
-            "intrinsic": "256_cvtepi32_ps",
-            "width": [256],
-            "llvm": "cvtdq2.ps.256",
-            "ret": "f32",
-            "args": ["s32"]
-        },
-        {
-            "intrinsic": "256_cvtpd_epi32",
-            "width": [256],
-            "llvm": "cvt.pd2dq.256",
-            "ret": "s32h",
-            "args": ["f64"]
-        },
-        {
-            "intrinsic": "256_cvtpd_ps",
-            "width": [256],
-            "llvm": "cvt.pd2.ps.256",
-            "ret": "f32h",
-            "args": ["f64"]
-        },
-        {
-            "intrinsic": "256_cvtps_epi32",
-            "width": [256],
-            "llvm": "cvt.ps2dq.256",
-            "ret": "s32",
-            "args": ["f32"]
-        },
-        {
-            "intrinsic": "256_cvtps_pd",
-            "width": [256],
-            "llvm": "cvt.ps2.pd.256",
-            "ret": "f64",
-            "args": ["f32h"]
-        },
-        {
-            "intrinsic": "256_cvttpd_epi32",
-            "width": [256],
-            "llvm": "cvtt.pd2dq.256",
-            "ret": "s32h",
-            "args": ["f64"]
-        },
-        {
-            "intrinsic": "256_cvttps_epi32",
-            "width": [256],
-            "llvm": "cvtt.ps2dq.256",
-            "ret": "s32",
-            "args": ["f32"]
-        },
-        {
-            "intrinsic": "256_dp_ps",
-            "width": [256],
-            "llvm": "dp.ps.256",
-            "ret": "f32",
-            "args": ["0", "0", "S32/8"]
-        },
-        {
-            "intrinsic": "256_hadd_{0.data_type}",
-            "width": [256],
-            "llvm": "hadd.{0.data_type}.256",
-            "ret": "f(32-64)",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "256_hsub_{0.data_type}",
-            "width": [256],
-            "llvm": "hsub.{0.data_type}.256",
-            "ret": "f(32-64)",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "256_max_{0.data_type}",
-            "width": [256],
-            "llvm": "max.{0.data_type}.256",
-            "ret": "f(32-64)",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "{0.width_mm}_maskload_{0.data_type}",
-            "width": [128, 256],
-            "llvm": "maskload.{0.data_type_short}{0.width_suffix}",
-            "ret": ["f(32-64)"],
-            "args": ["0SPc/S8", "0s->0"]
-        },
-        {
-            "intrinsic": "{3.width_mm}_maskstore_{3.data_type}",
-            "width": [128, 256],
-            "llvm": "maskstore.{3.data_type_short}{3.width_suffix}",
-            "ret": "V",
-            "args": ["F(32-64)Pm/S8", "1Dsv->1Dv", "1Dv"]
-        },
-        {
-            "intrinsic": "256_min_{0.data_type}",
-            "width": [256],
-            "llvm": "min.{0.data_type}.256",
-            "ret": "f(32-64)",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "256_movemask_ps",
-            "width": [256],
-            "llvm": "movmsk.ps.256",
-            "ret": "S32",
-            "args": ["f32"]
-        },
-        {
-            "intrinsic": "256_movemask_pd",
-            "width": [256],
-            "llvm": "movmsk.pd.256",
-            "ret": "S32",
-            "args": ["f64"]
-        },
-        {
-            "intrinsic": "{0.width_mm}_permutevar_{0.data_type}",
-            "width": [128, 256],
-            "llvm": "vpermilvar.{0.data_type}{0.width_suffix}",
-            "ret": "f(32-64)",
-            "args": ["0", "0s"]
-        },
-        {
-            "intrinsic": "256_rcp_ps",
-            "width": [256],
-            "llvm": "rcp.ps.256",
-            "ret": "f32",
-            "args": ["f32"]
-        },
-        {
-            "intrinsic": "256_rsqrt_ps",
-            "width": [256],
-            "llvm": "rsqrt.ps.256",
-            "ret": "f32",
-            "args": ["f32"]
-        },
-        {
-            "intrinsic": "256_storeu_{2.data_type}",
-            "width": [256],
-            "llvm": "storeu.ps.256",
-            "ret": "V",
-            "args": ["f(32-64)Pm/U8", "1D"]
-        },
-        {
-            "intrinsic": "256_storeu_si256",
-            "width": [256],
-            "llvm": "storeu.dq.256",
-            "ret": "V",
-            "args": ["u8Pm/U8", "1D"]
-        },
-        {
-            "intrinsic": "256_sqrt_{0.data_type}",
-            "width": [256],
-            "llvm": "!llvm.sqrt.{0.llvm_name}",
-            "ret": "f(32-64)",
-            "args": ["0"]
-        },
-        {
-            "intrinsic": "{1.width_mm}_testc_ps",
-            "width": [128, 256],
-            "llvm": "vtestc.ps{1.width_suffix}",
-            "ret": "S32",
-            "args": ["f32", "f32"]
-        },
-        {
-            "intrinsic": "{1.width_mm}_testc_pd",
-            "width": [128, 256],
-            "llvm": "vtestc.pd{1.width_suffix}",
-            "ret": "S32",
-            "args": ["f64", "f64"]
-        },
-        {
-            "intrinsic": "256_testc_si256",
-            "width": [256],
-            "llvm": "ptestc.256",
-            "ret": "S32",
-            "args": ["u64", "u64"]
-        },
-        {
-            "intrinsic": "{1.width_mm}_testnzc_ps",
-            "width": [128, 256],
-            "llvm": "vtestnzc.ps{1.width_suffix}",
-            "ret": "S32",
-            "args": ["f32", "f32"]
-        },
-        {
-            "intrinsic": "{1.width_mm}_testnzc_pd",
-            "width": [128, 256],
-            "llvm": "vtestnzc.pd{1.width_suffix}",
-            "ret": "S32",
-            "args": ["f64", "f64"]
-        },
-        {
-            "intrinsic": "256_testnzc_si256",
-            "width": [256],
-            "llvm": "ptestnzc.256",
-            "ret": "S32",
-            "args": ["u64", "u64"]
-        },
-        {
-            "intrinsic": "{1.width_mm}_testz_ps",
-            "width": [128, 256],
-            "llvm": "vtestz.ps{1.width_suffix}",
-            "ret": "S32",
-            "args": ["f32", "f32"]
-        },
-        {
-            "intrinsic": "{1.width_mm}_testz_pd",
-            "width": [128, 256],
-            "llvm": "vtestz.pd{1.width_suffix}",
-            "ret": "S32",
-            "args": ["f64", "f64"]
-        },
-        {
-            "intrinsic": "256_testz_si256",
-            "width": [256],
-            "llvm": "ptestz.256",
-            "ret": "S32",
-            "args": ["u64", "u64"]
-        },
-        {
-            "intrinsic": "256_zeroall",
-            "width": [256],
-            "llvm": "vzeroall",
-            "ret": "V",
-            "args": []
-        },
-        {
-            "intrinsic": "256_zeroupper",
-            "width": [256],
-            "llvm": "vzeroupper",
-            "ret": "V",
-            "args": []
-        }
-    ]
-}
diff --git a/src/etc/platform-intrinsics/x86/avx2.json b/src/etc/platform-intrinsics/x86/avx2.json
deleted file mode 100644
index dc055b5..0000000
--- a/src/etc/platform-intrinsics/x86/avx2.json
+++ /dev/null
@@ -1,202 +0,0 @@
-{
-    "intrinsic_prefix": "_mm",
-    "llvm_prefix": "llvm.x86.avx2.",
-    "intrinsics": [
-        {
-            "intrinsic": "256_abs_{0.data_type}",
-            "width": [256],
-            "llvm": "pabs.{0.data_type_short}",
-            "ret": "s(8-32)",
-            "args": ["0"]
-        },
-        {
-            "intrinsic": "256_adds_{0.data_type}",
-            "width": [256],
-            "llvm": "padd{0.kind_short}s.{0.data_type_short}",
-            "ret": "i(8-16)",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "256_avg_{0.data_type}",
-            "width": [256],
-            "llvm": "pavg.{0.data_type_short}",
-            "ret": "u(8-16)",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "256_hadd_{0.data_type}",
-            "width": [256],
-            "llvm": "phadd.{0.data_type_short}",
-            "ret": "s(16-32)",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "256_hadds_epi16",
-            "width": [256],
-            "llvm": "phadd.sw",
-            "ret": "s16",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "256_hsub_{0.data_type}",
-            "width": [256],
-            "llvm": "phsub.{0.data_type_short}",
-            "ret": "s(16-32)",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "256_hsubs_epi16",
-            "width": [256],
-            "llvm": "phsub.sw",
-            "ret": "s16",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "256_madd_epi16",
-            "width": [256],
-            "llvm": "pmadd.wd",
-            "ret": "s32",
-            "args": ["s16", "s16"]
-        },
-        {
-            "intrinsic": "256_maddubs_epi16",
-            "width": [256],
-            "llvm": "pmadd.ub.sw",
-            "ret": "s16",
-            "args": ["s8", "s8"]
-        },
-        {
-            "intrinsic": "{0.width_mm}_mask_i32gather_{0.data_type}",
-            "width": [128, 256],
-            "llvm": "gather.d.{0.data_type_short}{0.width_suffix}",
-            "ret": ["s32", "f32"],
-            "args": ["0", "0SPc/S8", "s32", "0s->0", "S32/8"]
-        },
-        {
-            "intrinsic": "{0.width_mm}_mask_i32gather_{0.data_type}",
-            "width": [128, 256],
-            "llvm": "gather.d.{0.data_type_short}{0.width_suffix}",
-            "ret": ["s64", "f64"],
-            "args": ["0", "0SPc/S8", "s32x128", "0s->0", "S32/8"]
-        },
-        {
-            "intrinsic": "{3.width_mm}_mask_i64gather_{0.data_type}",
-            "width": [128, 256],
-            "llvm": "gather.q.{0.data_type_short}{0.width_suffix}",
-            "ret": ["s32x128", "f32x128"],
-            "args": ["0", "0SPc/S8", "s64", "0s->0", "S32/8"]
-        },
-        {
-            "intrinsic": "{0.width_mm}_mask_i64gather_{0.data_type}",
-            "width": [128, 256],
-            "llvm": "gather.q.{0.data_type_short}{0.width_suffix}",
-            "ret": ["s64", "f64"],
-            "args": ["0", "0SPc/S8", "s64", "0s->0", "S32/8"]
-        },
-        {
-            "intrinsic": "{0.width_mm}_maskload_{0.data_type}",
-            "width": [128, 256],
-            "llvm": "maskload.{0.data_type_short}{0.width_suffix}",
-            "ret": ["s(32-64)"],
-            "args": ["0Pc/S8", "0"]
-        },
-        {
-            "intrinsic": "{2.width_mm}_maskstore_{2.data_type}",
-            "width": [128, 256],
-            "llvm": "maskstore.{2.data_type_short}{2.width_suffix}",
-            "ret": "V",
-            "args": ["S(32-64)Pm/S8", "1Dv", "2"]
-        },
-        {
-            "intrinsic": "256_max_{0.data_type}",
-            "width": [256],
-            "llvm": "pmax{0.kind}.{0.data_type_short}",
-            "ret": "i(8-32)",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "256_min_{0.data_type}",
-            "width": [256],
-            "llvm": "pmin{0.kind}.{0.data_type_short}",
-            "ret": "i(8-32)",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "256_movemask_epi8",
-            "width": [256],
-            "llvm": "pmovmskb",
-            "ret": "S32",
-            "args": ["s8"]
-        },
-        {
-            "intrinsic": "256_mpsadbw_epu8",
-            "width": [256],
-            "llvm": "mpsadbw",
-            "ret": "u16",
-            "args": ["u8", "u8", "S32/8"]
-        },
-        {
-            "intrinsic": "256_mul_{0.data_type}",
-            "width": [256],
-            "llvm": "pmul{0.data_type_short}.dq",
-            "ret": "i64",
-            "args": ["0dn", "0dn"]
-        },
-        {
-            "intrinsic": "256_mulhi_{0.data_type}",
-            "width": [256],
-            "llvm": "pmulh{0.data_type_short}.w",
-            "ret": "i16",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "256_mulhrs_epi16",
-            "width": [256],
-            "llvm": "pmul.hr.sw",
-            "ret": "s16",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "256_pack{0.kind_short}s_{1.data_type}",
-            "width": [256],
-            "llvm": "pack{0.kind}s{1.data_type_short}{0.data_type_short}",
-            "ret": "i(8-16)",
-            "args": ["0hws", "0hws"]
-        },
-        {
-            "intrinsic": "256_permutevar8x32_{0.data_type}",
-            "width": [256],
-            "llvm": "perm{0.data_type_short}",
-            "ret": ["s32", "f32"],
-            "args": ["0", "0s"]
-        },
-        {
-            "intrinsic": "256_sad_epu8",
-            "width": [256],
-            "llvm": "psad.bw",
-            "ret": "u64",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "256_shuffle_epi8",
-            "width": [256],
-            "llvm": "pshuf.b",
-            "ret": "s8",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "256_sign_{0.data_type}",
-            "width": [256],
-            "llvm": "psign.{0.data_type_short}",
-            "ret": "s(8-32)",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "256_subs_{0.data_type}",
-            "width": [256],
-            "llvm": "psub{0.kind_short}s.{0.data_type_short}",
-            "ret": "i(8-16)",
-            "args": ["0", "0"]
-        }
-    ]
-}
diff --git a/src/etc/platform-intrinsics/x86/bmi.json b/src/etc/platform-intrinsics/x86/bmi.json
deleted file mode 100644
index 24e2cbc..0000000
--- a/src/etc/platform-intrinsics/x86/bmi.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
-    "intrinsic_prefix": "_bmi",
-    "llvm_prefix": "llvm.x86.bmi.",
-    "intrinsics": [
-        {
-            "intrinsic": "_bextr_{0.bitwidth}",
-            "width": ["0"],
-            "llvm": "bextr.{0.bitwidth}",
-            "ret": "S(32-64)u",
-            "args": ["0", "0"]
-        }
-    ]
-}
diff --git a/src/etc/platform-intrinsics/x86/bmi2.json b/src/etc/platform-intrinsics/x86/bmi2.json
deleted file mode 100644
index f5a0db5..0000000
--- a/src/etc/platform-intrinsics/x86/bmi2.json
+++ /dev/null
@@ -1,27 +0,0 @@
-{
-    "intrinsic_prefix": "_bmi2",
-    "llvm_prefix": "llvm.x86.bmi.",
-    "intrinsics": [
-        {
-            "intrinsic": "_bzhi_{0.bitwidth}",
-            "width": ["0"],
-            "llvm": "bzhi.{0.bitwidth}",
-            "ret": "S(32-64)u",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "_pdep_{0.bitwidth}",
-            "width": ["0"],
-            "llvm": "pdep.{0.bitwidth}",
-            "ret": "S(32-64)u",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "_pext_{0.bitwidth}",
-            "width": ["0"],
-            "llvm": "pext.{0.bitwidth}",
-            "ret": "S(32-64)u",
-            "args": ["0", "0"]
-        }
-    ]
-}
diff --git a/src/etc/platform-intrinsics/x86/fma.json b/src/etc/platform-intrinsics/x86/fma.json
deleted file mode 100644
index dcc26cd..0000000
--- a/src/etc/platform-intrinsics/x86/fma.json
+++ /dev/null
@@ -1,48 +0,0 @@
-{
-    "intrinsic_prefix": "_mm",
-    "llvm_prefix": "llvm.x86.fma.",
-    "intrinsics": [
-        {
-            "intrinsic": "{0.width_mm}_fmadd_{0.data_type}",
-            "width": [128, 256],
-            "llvm": "vfmadd.{0.data_type_short}{0.width_suffix}",
-            "ret": "f(32-64)",
-            "args": ["0", "0", "0"]
-        },
-        {
-            "intrinsic": "{0.width_mm}_fmaddsub_{0.data_type}",
-            "width": [128, 256],
-            "llvm": "vfmaddsub.{0.data_type_short}{0.width_suffix}",
-            "ret": "f(32-64)",
-            "args": ["0", "0", "0"]
-        },
-        {
-            "intrinsic": "{0.width_mm}_fmsub_{0.data_type}",
-            "width": [128, 256],
-            "llvm": "vfmsub.{0.data_type_short}{0.width_suffix}",
-            "ret": "f(32-64)",
-            "args": ["0", "0", "0"]
-        },
-        {
-            "intrinsic": "{0.width_mm}_fmsubadd_{0.data_type}",
-            "width": [128, 256],
-            "llvm": "vfmsubadd.{0.data_type_short}{0.width_suffix}",
-            "ret": "f(32-64)",
-            "args": ["0", "0", "0"]
-        },
-        {
-            "intrinsic": "{0.width_mm}_fnmadd_{0.data_type}",
-            "width": [128, 256],
-            "llvm": "vfnmadd.{0.data_type_short}{0.width_suffix}",
-            "ret": "f(32-64)",
-            "args": ["0", "0", "0"]
-        },
-        {
-            "intrinsic": "{0.width_mm}_fnmsub_{0.data_type}",
-            "width": [128, 256],
-            "llvm": "vfnmsub.{0.data_type_short}{0.width_suffix}",
-            "ret": "f(32-64)",
-            "args": ["0", "0", "0"]
-        }
-    ]
-}
diff --git a/src/etc/platform-intrinsics/x86/info.json b/src/etc/platform-intrinsics/x86/info.json
deleted file mode 100644
index 8e90b85..0000000
--- a/src/etc/platform-intrinsics/x86/info.json
+++ /dev/null
@@ -1,32 +0,0 @@
-{
-    "platform": "x86",
-    "number_info": {
-        "signed": {
-            "kind": "s",
-            "kind_short": "",
-            "data_type": { "pattern": "epi{bitwidth}" },
-            "bitwidth": { "pattern": "{bitwidth}" },
-            "data_type_short": { "8": "b", "16": "w", "32": "d", "64": "q" }
-        },
-        "unsigned": {
-            "kind": "u",
-            "kind_short": "u",
-            "data_type": { "pattern": "epu{bitwidth}" },
-            "bitwidth": { "pattern": "{bitwidth}" },
-            "data_type_short": { "8": "b", "16": "w", "32": "d", "64": "q" }
-        },
-        "float": {
-            "kind": "f",
-            "data_type": { "32": "ps", "64": "pd" },
-            "bitwidth": { "pattern": "{bitwidth}" },
-            "data_type_short": { "32": "ps", "64": "pd" }
-        }
-    },
-    "width_info": {
-        "32":  { "width_mm": "32", "width_suffix": "" },
-        "64":  { "width_mm": "64", "width_suffix": "" },
-        "128": { "width_mm": "", "width_suffix": "" },
-        "256": { "width_mm": "256", "width_suffix": ".256" },
-        "512": { "width_mm": "512", "width_suffix": ".512" }
-    }
-}
diff --git a/src/etc/platform-intrinsics/x86/rdrand.json b/src/etc/platform-intrinsics/x86/rdrand.json
deleted file mode 100644
index fa2feb4..0000000
--- a/src/etc/platform-intrinsics/x86/rdrand.json
+++ /dev/null
@@ -1,27 +0,0 @@
-{
-    "intrinsic_prefix": "_rdrand",
-    "llvm_prefix": "llvm.x86.rdrand.",
-    "intrinsics": [
-        {
-            "intrinsic": "16_step",
-            "width": ["0"],
-            "llvm": "16",
-            "ret": "(U16,S32)",
-            "args": []
-        },
-        {
-            "intrinsic": "32_step",
-            "width": ["0"],
-            "llvm": "32",
-            "ret": "(U32,S32)",
-            "args": []
-        },
-        {
-            "intrinsic": "64_step",
-            "width": ["0"],
-            "llvm": "64",
-            "ret": "(U64,S32)",
-            "args": []
-        }
-    ]
-}
diff --git a/src/etc/platform-intrinsics/x86/rdseed.json b/src/etc/platform-intrinsics/x86/rdseed.json
deleted file mode 100644
index 7be64b5..0000000
--- a/src/etc/platform-intrinsics/x86/rdseed.json
+++ /dev/null
@@ -1,27 +0,0 @@
-{
-    "intrinsic_prefix": "_rdseed",
-    "llvm_prefix": "llvm.x86.rdseed.",
-    "intrinsics": [
-        {
-            "intrinsic": "16_step",
-            "width": ["0"],
-            "llvm": "16",
-            "ret": "(U16,S32)",
-            "args": []
-        },
-        {
-            "intrinsic": "32_step",
-            "width": ["0"],
-            "llvm": "32",
-            "ret": "(U32,S32)",
-            "args": []
-        },
-        {
-            "intrinsic": "64_step",
-            "width": ["0"],
-            "llvm": "64",
-            "ret": "(U64,S32)",
-            "args": []
-        }
-    ]
-}
diff --git a/src/etc/platform-intrinsics/x86/sse.json b/src/etc/platform-intrinsics/x86/sse.json
deleted file mode 100644
index d8eef8a..0000000
--- a/src/etc/platform-intrinsics/x86/sse.json
+++ /dev/null
@@ -1,55 +0,0 @@
-{
-    "intrinsic_prefix": "_mm",
-    "llvm_prefix": "llvm.x86.sse.",
-    "intrinsics": [
-        {
-            "intrinsic": "_movemask_ps",
-            "width": [128],
-            "llvm": "movmsk.ps",
-            "ret": "S32",
-            "args": ["f32"]
-        },
-        {
-            "intrinsic": "_max_ps",
-            "width": [128],
-            "llvm": "max.ps",
-            "ret": "f32",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "_min_ps",
-            "width": [128],
-            "llvm": "min.ps",
-            "ret": "f32",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "_rsqrt_ps",
-            "width": [128],
-            "llvm": "rsqrt.ps",
-            "ret": "f32",
-            "args": ["0"]
-        },
-        {
-            "intrinsic": "_rcp_ps",
-            "width": [128],
-            "llvm": "rcp.ps",
-            "ret": "f32",
-            "args": ["0"]
-        },
-        {
-            "intrinsic": "_sqrt_ps",
-            "width": [128],
-            "llvm": "!llvm.sqrt.v4f32",
-            "ret": "f32",
-            "args": ["0"]
-        },
-        {
-            "intrinsic": "_storeu_ps",
-            "width": [128],
-            "llvm": "storeu.ps",
-            "ret": "V",
-            "args": ["F32Pm/S8", "f32"]
-        }
-    ]
-}
diff --git a/src/etc/platform-intrinsics/x86/sse2.json b/src/etc/platform-intrinsics/x86/sse2.json
deleted file mode 100644
index 4d6317d..0000000
--- a/src/etc/platform-intrinsics/x86/sse2.json
+++ /dev/null
@@ -1,160 +0,0 @@
-{
-    "intrinsic_prefix": "_mm",
-    "llvm_prefix": "llvm.x86.sse2.",
-    "intrinsics": [
-        {
-            "intrinsic": "_adds_{0.data_type}",
-            "width": [128],
-            "llvm": "padd{0.kind_short}s.{0.data_type_short}",
-            "ret": "i(8-16)",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "_avg_{0.data_type}",
-            "width": [128],
-            "llvm": "pavg.{0.data_type_short}",
-            "ret": "u(8-16)",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "_lfence",
-            "width": [128],
-            "llvm": "lfence",
-            "ret": "V",
-            "args": []
-        },
-        {
-            "intrinsic": "_madd_epi16",
-            "width": [128],
-            "llvm": "pmadd.wd",
-            "ret": "s32",
-            "args": ["s16", "s16"]
-        },
-        {
-            "intrinsic": "_maskmoveu_si128",
-            "width": [128],
-            "llvm": "maskmov.dqu",
-            "ret": "V",
-            "args": ["u8", "u8", "U8Pm"]
-        },
-        {
-            "intrinsic": "_max_{0.data_type}",
-            "width": [128],
-            "llvm": "pmax{0.kind}.{0.data_type_short}",
-            "ret": ["s16", "u8"],
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "_max_pd",
-            "width": [128],
-            "llvm": "max.pd",
-            "ret": "f64",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "_mfence",
-            "width": [128],
-            "llvm": "fence",
-            "ret": "V",
-            "args": []
-        },
-        {
-            "intrinsic": "_min_{0.data_type}",
-            "width": [128],
-            "llvm": "pmin{0.kind}.{0.data_type_short}",
-            "ret": ["s16", "u8"],
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "_min_pd",
-            "width": [128],
-            "llvm": "min.pd",
-            "ret": "f64",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "_movemask_pd",
-            "width": [128],
-            "llvm": "movmsk.pd",
-            "ret": "S32",
-            "args": ["f64"]
-        },
-        {
-            "intrinsic": "_movemask_epi8",
-            "width": [128],
-            "llvm": "pmovmskb.128",
-            "ret": "S32",
-            "args": ["s8"]
-        },
-        {
-            "intrinsic": "_mul_epu32",
-            "width": [128],
-            "llvm": "pmulu.dq",
-            "ret": "u64",
-            "args": ["0dn", "0dn"]
-        },
-        {
-            "intrinsic": "_mulhi_{0.data_type}",
-            "width": [128],
-            "llvm": "pmulh{0.kind_short}.w",
-            "ret": "i16",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "_packs_{1.data_type}",
-            "width": [128],
-            "llvm": "packss{1.data_type_short}{0.data_type_short}.128",
-            "ret": "s(8-16)",
-            "args": ["0hw", "0hw"]
-        },
-        {
-            "intrinsic": "_packus_epi16",
-            "width": [128],
-            "llvm": "packuswb.128",
-            "ret": "u8",
-            "args": ["s16", "s16"]
-        },
-        {
-            "intrinsic": "_sad_epu8",
-            "width": [128],
-            "llvm": "psad.bw",
-            "ret": "u64",
-            "args": ["u8", "u8"]
-        },
-        {
-            "intrinsic": "_sfence",
-            "width": [128],
-            "llvm": "sfence",
-            "ret": "V",
-            "args": []
-        },
-        {
-            "intrinsic": "_sqrt_pd",
-            "width": [128],
-            "llvm": "!llvm.sqrt.v2f64",
-            "ret": "f64",
-            "args": ["0"]
-        },
-        {
-            "intrinsic": "_storeu_pd",
-            "width": [128],
-            "llvm": "storeu.pd",
-            "ret": "V",
-            "args": ["F64Pm/U8", "f64"]
-        },
-        {
-            "intrinsic": "_storeu_si128",
-            "width": [128],
-            "llvm": "storeu.dq",
-            "ret": "V",
-            "args": ["u8Pm/U8", "u8"]
-        },
-        {
-            "intrinsic": "_subs_{0.data_type}",
-            "width": [128],
-            "llvm": "psub{0.kind_short}s.{0.data_type_short}",
-            "ret": "i(8-16)",
-            "args": ["0", "0"]
-        }
-    ]
-}
diff --git a/src/etc/platform-intrinsics/x86/sse3.json b/src/etc/platform-intrinsics/x86/sse3.json
deleted file mode 100644
index 119bf20..0000000
--- a/src/etc/platform-intrinsics/x86/sse3.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
-    "intrinsic_prefix": "_mm",
-    "llvm_prefix": "llvm.x86.sse3.",
-    "intrinsics": [
-        {
-            "intrinsic": "_addsub_{0.data_type}",
-            "width": [128],
-            "llvm": "addsub.{0.data_type}",
-            "ret": "f(32-64)",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "_hadd_{0.data_type}",
-            "width": [128],
-            "llvm": "hadd.{0.data_type}",
-            "ret": "f(32-64)",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "_hsub_{0.data_type}",
-            "width": [128],
-            "llvm": "hsub.{0.data_type}",
-            "ret": "f(32-64)",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "_lddqu_si128",
-            "width": [128],
-            "llvm": "ldu.dq",
-            "ret": "u8",
-            "args": ["0Pc/S8"]
-        }
-    ]
-}
diff --git a/src/etc/platform-intrinsics/x86/sse41.json b/src/etc/platform-intrinsics/x86/sse41.json
deleted file mode 100644
index b499637..0000000
--- a/src/etc/platform-intrinsics/x86/sse41.json
+++ /dev/null
@@ -1,76 +0,0 @@
-{
-    "intrinsic_prefix": "_mm",
-    "llvm_prefix": "llvm.x86.sse41.",
-    "intrinsics": [
-        {
-            "intrinsic": "_dp_{0.data_type}",
-            "width": [128],
-            "llvm": "dp{0.data_type}",
-            "ret": "f(32-64)",
-            "args": ["0", "0", "S32/8"]
-        },
-        {
-            "intrinsic": "_max_{0.data_type}",
-            "width": [128],
-            "llvm": "pmax{0.kind}{0.data_type_short}",
-            "ret": ["s8", "u16", "i32"],
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "_min_{0.data_type}",
-            "width": [128],
-            "llvm": "pmin{0.kind}{0.data_type_short}",
-            "ret": ["s8", "u16", "i32"],
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "_minpos_epu16",
-            "width": [128],
-            "llvm": "phminposuw",
-            "ret": "u16",
-            "args": ["0"]
-        },
-        {
-            "intrinsic": "_mpsadbw_epu8",
-            "width": [128],
-            "llvm": "mpsadbw",
-            "ret": "u16",
-            "args": ["u8", "u8", "S32/8"]
-        },
-        {
-            "intrinsic": "_mul_epi32",
-            "width": [128],
-            "llvm": "pmuldq",
-            "ret": "s64",
-            "args": ["s32", "s32"]
-        },
-        {
-            "intrinsic": "_packus_epi32",
-            "width": [128],
-            "llvm": "packusdw",
-            "ret": "u16",
-            "args": ["s32", "s32"]
-        },
-        {
-            "intrinsic": "_testc_si128",
-            "width": [128],
-            "llvm": "ptestc",
-            "ret": "S32",
-            "args": ["u64", "u64"]
-        },
-        {
-            "intrinsic": "_testnzc_si128",
-            "width": [128],
-            "llvm": "ptestnzc",
-            "ret": "S32",
-            "args": ["u64", "u64"]
-        },
-        {
-            "intrinsic": "_testz_si128",
-            "width": [128],
-            "llvm": "ptestz",
-            "ret": "S32",
-            "args": ["u64", "u64"]
-        }
-    ]
-}
diff --git a/src/etc/platform-intrinsics/x86/sse42.json b/src/etc/platform-intrinsics/x86/sse42.json
deleted file mode 100644
index fdee9c8..0000000
--- a/src/etc/platform-intrinsics/x86/sse42.json
+++ /dev/null
@@ -1,104 +0,0 @@
-{
-    "intrinsic_prefix": "_mm",
-    "llvm_prefix": "llvm.x86.sse42.",
-    "intrinsics": [
-        {
-            "intrinsic": "_cmpestra",
-            "width": [128],
-            "llvm": "pcmpestria128",
-            "ret": "S32",
-            "args": ["s8", "S32", "s8", "S32", "S32/8"]
-        },
-        {
-            "intrinsic": "_cmpestrc",
-            "width": [128],
-            "llvm": "pcmpestric128",
-            "ret": "S32",
-            "args": ["s8", "S32", "s8", "S32", "S32/8"]
-        },
-        {
-            "intrinsic": "_cmpestri",
-            "width": [128],
-            "llvm": "pcmpestri128",
-            "ret": "S32",
-            "args": ["s8", "S32", "s8", "S32", "S32/8"]
-        },
-        {
-            "intrinsic": "_cmpestrm",
-            "width": [128],
-            "llvm": "pcmpestrm128",
-            "ret": "s8",
-            "args": ["s8", "S32", "s8", "S32", "S32/8"]
-        },
-        {
-            "intrinsic": "_cmpestro",
-            "width": [128],
-            "llvm": "pcmpestrio128",
-            "ret": "S32",
-            "args": ["s8", "S32", "s8", "S32", "S32/8"]
-        },
-        {
-            "intrinsic": "_cmpestrs",
-            "width": [128],
-            "llvm": "pcmpestris128",
-            "ret": "S32",
-            "args": ["s8", "S32", "s8", "S32", "S32/8"]
-        },
-        {
-            "intrinsic": "_cmpestrz",
-            "width": [128],
-            "llvm": "pcmpestriz128",
-            "ret": "S32",
-            "args": ["s8", "S32", "s8", "S32", "S32/8"]
-        },
-        {
-            "intrinsic": "_cmpistra",
-            "width": [128],
-            "llvm": "pcmpistria128",
-            "ret": "S32",
-            "args": ["s8", "s8", "S32/8"]
-        },
-        {
-            "intrinsic": "_cmpistrc",
-            "width": [128],
-            "llvm": "pcmpistric128",
-            "ret": "S32",
-            "args": ["s8", "s8", "S32/8"]
-        },
-        {
-            "intrinsic": "_cmpistri",
-            "width": [128],
-            "llvm": "pcmpistri128",
-            "ret": "S32",
-            "args": ["s8", "s8", "S32/8"]
-        },
-        {
-            "intrinsic": "_cmpistrm",
-            "width": [128],
-            "llvm": "pcmpistrm128",
-            "ret": "s8",
-            "args": ["s8", "s8", "S32/8"]
-        },
-        {
-            "intrinsic": "_cmpistro",
-            "width": [128],
-            "llvm": "pcmpistrio128",
-            "ret": "S32",
-            "args": ["s8", "s8", "S32/8"]
-        },
-        {
-            "intrinsic": "_cmpistrs",
-            "width": [128],
-            "llvm": "pcmpistris128",
-            "ret": "S32",
-            "args": ["s8", "s8", "S32/8"]
-        },
-        {
-            "intrinsic": "_cmpistrz",
-            "width": [128],
-            "llvm": "pcmpistriz128",
-            "ret": "S32",
-            "args": ["s8", "s8", "S32/8"]
-        }
-    ]
-}
diff --git a/src/etc/platform-intrinsics/x86/ssse3.json b/src/etc/platform-intrinsics/x86/ssse3.json
deleted file mode 100644
index 5a56179..0000000
--- a/src/etc/platform-intrinsics/x86/ssse3.json
+++ /dev/null
@@ -1,69 +0,0 @@
-{
-    "intrinsic_prefix": "_mm",
-    "llvm_prefix": "llvm.x86.ssse3.",
-    "intrinsics": [
-        {
-            "intrinsic": "_abs_{0.data_type}",
-            "width": [128],
-            "llvm": "pabs.{0.data_type_short}.128",
-            "ret": "s(8-32)",
-            "args": ["0"]
-        },
-        {
-            "intrinsic": "_hadd_{0.data_type}",
-            "width": [128],
-            "llvm": "phadd.{0.data_type_short}.128",
-            "ret": "s(16-32)",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "_hadds_epi16",
-            "width": [128],
-            "llvm": "phadd.sw.128",
-            "ret": "s16",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "_hsub_{0.data_type}",
-            "width": [128],
-            "llvm": "phsub.{0.data_type_short}.128",
-            "ret": "s(16-32)",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "_hsubs_epi16",
-            "width": [128],
-            "llvm": "phsub.sw.128",
-            "ret": "s16",
-            "args": ["0", "0"]
-        },
-        {
-            "intrinsic": "_maddubs_epi16",
-            "width": [128],
-            "llvm": "pmadd.ub.sw.128",
-            "ret": "s16",
-            "args": ["u8", "s8"]
-        },
-        {
-            "intrinsic": "_mulhrs_epi16",
-            "width": [128],
-            "llvm": "pmul.hr.sw.128",
-            "ret": "s16",
-            "args": ["s16", "s16"]
-        },
-        {
-            "intrinsic": "_shuffle_epi8",
-            "width": [128],
-            "llvm": "pshuf.b.128",
-            "ret": "s8",
-            "args": ["s8", "s8"]
-        },
-        {
-            "intrinsic": "_sign_{0.data_type}",
-            "width": [128],
-            "llvm": "psign.{0.data_type_short}.128",
-            "ret": "s(8-32)",
-            "args": ["0", "0"]
-        }
-    ]
-}
diff --git a/src/etc/platform-intrinsics/x86/tbm.json b/src/etc/platform-intrinsics/x86/tbm.json
deleted file mode 100644
index d1322cd6..0000000
--- a/src/etc/platform-intrinsics/x86/tbm.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
-    "intrinsic_prefix": "_tbm",
-    "llvm_prefix": "llvm.x86.tbm.",
-    "intrinsics": [
-        {
-            "intrinsic": "_bextri_u{0.bitwidth}",
-            "width": ["0"],
-            "llvm": "bextri.u{0.bitwidth}",
-            "ret": "S(32-64)u",
-            "args": ["0", "0"]
-        }
-    ]
-}
diff --git a/src/liballoc/raw_vec.rs b/src/liballoc/raw_vec.rs
index c05452b..5e4aac9 100644
--- a/src/liballoc/raw_vec.rs
+++ b/src/liballoc/raw_vec.rs
@@ -22,7 +22,7 @@
 /// * Catches all overflows in capacity computations (promotes them to "capacity overflow" panics)
 /// * Guards against 32-bit systems allocating more than isize::MAX bytes
 /// * Guards against overflowing your length
-/// * Aborts on OOM
+/// * Aborts on OOM or calls handle_alloc_error as applicable
 /// * Avoids freeing Unique::empty()
 /// * Contains a ptr::Unique and thus endows the user with all related benefits
 ///
diff --git a/src/liballoc/vec.rs b/src/liballoc/vec.rs
index e1c5ab1..ba3b3df 100644
--- a/src/liballoc/vec.rs
+++ b/src/liballoc/vec.rs
@@ -819,6 +819,8 @@
     #[inline]
     #[stable(feature = "rust1", since = "1.0.0")]
     pub unsafe fn set_len(&mut self, new_len: usize) {
+        debug_assert!(new_len <= self.capacity());
+
         self.len = new_len;
     }
 
diff --git a/src/libcore/cmp.rs b/src/libcore/cmp.rs
index 86f28a9..d43a5c1 100644
--- a/src/libcore/cmp.rs
+++ b/src/libcore/cmp.rs
@@ -91,6 +91,8 @@
 /// For example, let's tweak our previous code a bit:
 ///
 /// ```
+/// // The derive implements <BookFormat> == <BookFormat> comparisons
+/// #[derive(PartialEq)]
 /// enum BookFormat {
 ///     Paperback,
 ///     Hardback,
@@ -102,31 +104,34 @@
 ///     format: BookFormat,
 /// }
 ///
+/// // Implement <Book> == <BookFormat> comparisons
 /// impl PartialEq<BookFormat> for Book {
 ///     fn eq(&self, other: &BookFormat) -> bool {
-///         match (&self.format, other) {
-///            (BookFormat::Paperback, BookFormat::Paperback) => true,
-///            (BookFormat::Hardback,  BookFormat::Hardback)  => true,
-///            (BookFormat::Ebook,     BookFormat::Ebook)     => true,
-///            (_, _) => false,
-///         }
+///         self.format == *other
+///     }
+/// }
+///
+/// // Implement <BookFormat> == <Book> comparisons
+/// impl PartialEq<Book> for BookFormat {
+///     fn eq(&self, other: &Book) -> bool {
+///         *self == other.format
 ///     }
 /// }
 ///
 /// let b1 = Book { isbn: 3, format: BookFormat::Paperback };
 ///
 /// assert!(b1 == BookFormat::Paperback);
-/// assert!(b1 != BookFormat::Ebook);
+/// assert!(BookFormat::Ebook != b1);
 /// ```
 ///
 /// By changing `impl PartialEq for Book` to `impl PartialEq<BookFormat> for Book`,
-/// we've changed what type we can use on the right side of the `==` operator.
-/// This lets us use it in the `assert!` statements at the bottom.
+/// we allow `BookFormat`s to be compared with `Book`s.
 ///
 /// You can also combine these implementations to let the `==` operator work with
 /// two different types:
 ///
 /// ```
+/// #[derive(PartialEq)]
 /// enum BookFormat {
 ///     Paperback,
 ///     Hardback,
@@ -140,12 +145,13 @@
 ///
 /// impl PartialEq<BookFormat> for Book {
 ///     fn eq(&self, other: &BookFormat) -> bool {
-///         match (&self.format, other) {
-///            (&BookFormat::Paperback, &BookFormat::Paperback) => true,
-///            (&BookFormat::Hardback,  &BookFormat::Hardback)  => true,
-///            (&BookFormat::Ebook,     &BookFormat::Ebook)     => true,
-///            (_, _) => false,
-///         }
+///         self.format == *other
+///     }
+/// }
+///
+/// impl PartialEq<Book> for BookFormat {
+///     fn eq(&self, other: &Book) -> bool {
+///         *self == other.format
 ///     }
 /// }
 ///
@@ -159,7 +165,7 @@
 /// let b2 = Book { isbn: 3, format: BookFormat::Ebook };
 ///
 /// assert!(b1 == BookFormat::Paperback);
-/// assert!(b1 != BookFormat::Ebook);
+/// assert!(BookFormat::Ebook != b1);
 /// assert!(b1 == b2);
 /// ```
 ///
diff --git a/src/libcore/ffi.rs b/src/libcore/ffi.rs
index 0717a88..644380c 100644
--- a/src/libcore/ffi.rs
+++ b/src/libcore/ffi.rs
@@ -12,24 +12,27 @@
 /// and `*mut c_void` is equivalent to C's `void*`. That said, this is
 /// *not* the same as C's `void` return type, which is Rust's `()` type.
 ///
-/// Ideally, this type would be equivalent to [`!`], but currently it may
-/// be more ideal to use `c_void` for FFI purposes.
+/// To model pointers to opaque types in FFI, until `extern type` is
+/// stabilized, it is recommended to use a newtype wrapper around an empty
+/// byte array. See the [Nomicon] for details.
 ///
-/// [`!`]: ../../std/primitive.never.html
 /// [pointer]: ../../std/primitive.pointer.html
+/// [Nomicon]: https://doc.rust-lang.org/nomicon/ffi.html#representing-opaque-structs
 // N.B., for LLVM to recognize the void pointer type and by extension
 //     functions like malloc(), we need to have it represented as i8* in
 //     LLVM bitcode. The enum used here ensures this and prevents misuse
-//     of the "raw" type by only having private variants.. We need two
+//     of the "raw" type by only having private variants. We need two
 //     variants, because the compiler complains about the repr attribute
-//     otherwise.
+//     otherwise and we need at least one variant as otherwise the enum
+//     would be uninhabited and at least dereferencing such pointers would
+//     be UB.
 #[repr(u8)]
 #[stable(feature = "raw_os", since = "1.1.0")]
 pub enum c_void {
-    #[unstable(feature = "c_void_variant", reason = "should not have to exist",
+    #[unstable(feature = "c_void_variant", reason = "temporary implementation detail",
                issue = "0")]
     #[doc(hidden)] __variant1,
-    #[unstable(feature = "c_void_variant", reason = "should not have to exist",
+    #[unstable(feature = "c_void_variant", reason = "temporary implementation detail",
                issue = "0")]
     #[doc(hidden)] __variant2,
 }
@@ -49,7 +52,7 @@
 #[unstable(feature = "c_variadic",
            reason = "the `c_variadic` feature has not been properly tested on \
                      all supported platforms",
-           issue = "27745")]
+           issue = "44930")]
 extern {
     type VaListImpl;
 }
@@ -74,7 +77,7 @@
 #[unstable(feature = "c_variadic",
            reason = "the `c_variadic` feature has not been properly tested on \
                      all supported platforms",
-           issue = "27745")]
+           issue = "44930")]
 struct VaListImpl {
     stack: *mut (),
     gr_top: *mut (),
@@ -90,7 +93,7 @@
 #[unstable(feature = "c_variadic",
            reason = "the `c_variadic` feature has not been properly tested on \
                      all supported platforms",
-           issue = "27745")]
+           issue = "44930")]
 struct VaListImpl {
     gpr: u8,
     fpr: u8,
@@ -106,7 +109,7 @@
 #[unstable(feature = "c_variadic",
            reason = "the `c_variadic` feature has not been properly tested on \
                      all supported platforms",
-           issue = "27745")]
+           issue = "44930")]
 struct VaListImpl {
     gp_offset: i32,
     fp_offset: i32,
@@ -120,7 +123,7 @@
 #[unstable(feature = "c_variadic",
            reason = "the `c_variadic` feature has not been properly tested on \
                      all supported platforms",
-           issue = "27745")]
+           issue = "44930")]
 #[repr(transparent)]
 pub struct VaList<'a>(&'a mut VaListImpl);
 
@@ -140,7 +143,7 @@
     #[unstable(feature = "c_variadic",
                reason = "the `c_variadic` feature has not been properly tested on \
                          all supported platforms",
-               issue = "27745")]
+               issue = "44930")]
     pub trait VaArgSafe {}
 }
 
@@ -150,7 +153,7 @@
             #[unstable(feature = "c_variadic",
                        reason = "the `c_variadic` feature has not been properly tested on \
                                  all supported platforms",
-                       issue = "27745")]
+                       issue = "44930")]
             impl sealed_trait::VaArgSafe for $t {}
         )+
     }
@@ -163,12 +166,12 @@
 #[unstable(feature = "c_variadic",
            reason = "the `c_variadic` feature has not been properly tested on \
                      all supported platforms",
-           issue = "27745")]
+           issue = "44930")]
 impl<T> sealed_trait::VaArgSafe for *mut T {}
 #[unstable(feature = "c_variadic",
            reason = "the `c_variadic` feature has not been properly tested on \
                      all supported platforms",
-           issue = "27745")]
+           issue = "44930")]
 impl<T> sealed_trait::VaArgSafe for *const T {}
 
 impl<'a> VaList<'a> {
@@ -176,7 +179,7 @@
     #[unstable(feature = "c_variadic",
                reason = "the `c_variadic` feature has not been properly tested on \
                          all supported platforms",
-               issue = "27745")]
+               issue = "44930")]
     pub unsafe fn arg<T: sealed_trait::VaArgSafe>(&mut self) -> T {
         va_arg(self)
     }
@@ -185,7 +188,7 @@
     #[unstable(feature = "c_variadic",
                reason = "the `c_variadic` feature has not been properly tested on \
                          all supported platforms",
-               issue = "27745")]
+               issue = "44930")]
     pub unsafe fn copy<F, R>(&self, f: F) -> R
             where F: for<'copy> FnOnce(VaList<'copy>) -> R {
         #[cfg(any(all(not(target_arch = "aarch64"), not(target_arch = "powerpc"),
diff --git a/src/libcore/fmt/mod.rs b/src/libcore/fmt/mod.rs
index 214b5d3..5221d6f 100644
--- a/src/libcore/fmt/mod.rs
+++ b/src/libcore/fmt/mod.rs
@@ -211,9 +211,18 @@
     }
 }
 
-/// A struct to represent both where to emit formatting strings to and how they
-/// should be formatted. A mutable version of this is passed to all formatting
-/// traits.
+/// Configuration for formatting.
+///
+/// A `Formatter` represents various options related to formatting. Users do not
+/// construct `Formatter`s directly; a mutable reference to one is passed to
+/// the `fmt` method of all formatting traits, like [`Debug`] and [`Display`].
+///
+/// To interact with a `Formatter`, you'll call various methods to change the
+/// various options related to formatting. For examples, please see the
+/// documentation of the methods defined on `Formatter` below.
+///
+/// [`Debug`]: trait.Debug.html
+/// [`Display`]: trait.Display.html
 #[allow(missing_debug_implementations)]
 #[stable(feature = "rust1", since = "1.0.0")]
 pub struct Formatter<'a> {
diff --git a/src/libcore/hint.rs b/src/libcore/hint.rs
index 9e57a4e..ad5a207 100644
--- a/src/libcore/hint.rs
+++ b/src/libcore/hint.rs
@@ -49,3 +49,26 @@
 pub unsafe fn unreachable_unchecked() -> ! {
     intrinsics::unreachable()
 }
+
+/// Save power or switch hyperthreads in a busy-wait spin-loop.
+///
+/// This function is deliberately more primitive than
+/// [`std::thread::yield_now`](../../std/thread/fn.yield_now.html) and
+/// does not directly yield to the system's scheduler.
+/// In some cases it might be useful to use a combination of both functions.
+/// Careful benchmarking is advised.
+///
+/// On some platforms this function may not do anything at all.
+#[inline]
+#[unstable(feature = "renamed_spin_loop", issue = "55002")]
+pub fn spin_loop() {
+    #[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
+    unsafe {
+        asm!("pause" ::: "memory" : "volatile");
+    }
+
+    #[cfg(target_arch = "aarch64")]
+    unsafe {
+        asm!("yield" ::: "memory" : "volatile");
+    }
+}
diff --git a/src/libcore/iter/iterator.rs b/src/libcore/iter/iterator.rs
index 640af74..0ad29af 100644
--- a/src/libcore/iter/iterator.rs
+++ b/src/libcore/iter/iterator.rs
@@ -2358,7 +2358,7 @@
     ///
     /// ```
     /// fn factorial(n: u32) -> u32 {
-    ///     (1..).take_while(|&i| i <= n).product()
+    ///     (1..=n).product()
     /// }
     /// assert_eq!(factorial(0), 1);
     /// assert_eq!(factorial(1), 1);
diff --git a/src/libcore/iter/mod.rs b/src/libcore/iter/mod.rs
index 1ef5428..974906b 100644
--- a/src/libcore/iter/mod.rs
+++ b/src/libcore/iter/mod.rs
@@ -329,6 +329,8 @@
 pub use self::sources::{Empty, empty};
 #[stable(feature = "iter_once", since = "1.2.0")]
 pub use self::sources::{Once, once};
+#[unstable(feature = "iter_once_with", issue = "57581")]
+pub use self::sources::{OnceWith, once_with};
 #[unstable(feature = "iter_unfold", issue = "55977")]
 pub use self::sources::{Unfold, unfold, Successors, successors};
 
diff --git a/src/libcore/iter/sources.rs b/src/libcore/iter/sources.rs
index 2a39089..2590fa6 100644
--- a/src/libcore/iter/sources.rs
+++ b/src/libcore/iter/sources.rs
@@ -377,6 +377,119 @@
     Once { inner: Some(value).into_iter() }
 }
 
+/// An iterator that repeats elements of type `A` endlessly by
+/// applying the provided closure `F: FnMut() -> A`.
+///
+/// This `struct` is created by the [`once_with`] function.
+/// See its documentation for more.
+///
+/// [`once_with`]: fn.once_with.html
+#[derive(Copy, Clone, Debug)]
+#[unstable(feature = "iter_once_with", issue = "57581")]
+pub struct OnceWith<F> {
+    gen: Option<F>,
+}
+
+#[unstable(feature = "iter_once_with", issue = "57581")]
+impl<A, F: FnOnce() -> A> Iterator for OnceWith<F> {
+    type Item = A;
+
+    #[inline]
+    fn next(&mut self) -> Option<A> {
+        self.gen.take().map(|f| f())
+    }
+
+    #[inline]
+    fn size_hint(&self) -> (usize, Option<usize>) {
+        self.gen.iter().size_hint()
+    }
+}
+
+#[unstable(feature = "iter_once_with", issue = "57581")]
+impl<A, F: FnOnce() -> A> DoubleEndedIterator for OnceWith<F> {
+    fn next_back(&mut self) -> Option<A> {
+        self.next()
+    }
+}
+
+#[unstable(feature = "iter_once_with", issue = "57581")]
+impl<A, F: FnOnce() -> A> ExactSizeIterator for OnceWith<F> {
+    fn len(&self) -> usize {
+        self.gen.iter().len()
+    }
+}
+
+#[unstable(feature = "iter_once_with", issue = "57581")]
+impl<A, F: FnOnce() -> A> FusedIterator for OnceWith<F> {}
+
+#[unstable(feature = "iter_once_with", issue = "57581")]
+unsafe impl<A, F: FnOnce() -> A> TrustedLen for OnceWith<F> {}
+
+/// Creates an iterator that lazily generates a value exactly once by invoking
+/// the provided closure.
+///
+/// This is commonly used to adapt a single value generator into a [`chain`] of
+/// other kinds of iteration. Maybe you have an iterator that covers almost
+/// everything, but you need an extra special case. Maybe you have a function
+/// which works on iterators, but you only need to process one value.
+///
+/// Unlike [`once`], this function will lazily generate the value on request.
+///
+/// [`once`]: fn.once.html
+/// [`chain`]: trait.Iterator.html#method.chain
+///
+/// # Examples
+///
+/// Basic usage:
+///
+/// ```
+/// #![feature(iter_once_with)]
+///
+/// use std::iter;
+///
+/// // one is the loneliest number
+/// let mut one = iter::once_with(|| 1);
+///
+/// assert_eq!(Some(1), one.next());
+///
+/// // just one, that's all we get
+/// assert_eq!(None, one.next());
+/// ```
+///
+/// Chaining together with another iterator. Let's say that we want to iterate
+/// over each file of the `.foo` directory, but also a configuration file,
+/// `.foorc`:
+///
+/// ```no_run
+/// #![feature(iter_once_with)]
+///
+/// use std::iter;
+/// use std::fs;
+/// use std::path::PathBuf;
+///
+/// let dirs = fs::read_dir(".foo").unwrap();
+///
+/// // we need to convert from an iterator of DirEntry-s to an iterator of
+/// // PathBufs, so we use map
+/// let dirs = dirs.map(|file| file.unwrap().path());
+///
+/// // now, our iterator just for our config file
+/// let config = iter::once_with(|| PathBuf::from(".foorc"));
+///
+/// // chain the two iterators together into one big iterator
+/// let files = dirs.chain(config);
+///
+/// // this will give us all of the files in .foo as well as .foorc
+/// for f in files {
+///     println!("{:?}", f);
+/// }
+/// ```
+#[inline]
+#[unstable(feature = "iter_once_with", issue = "57581")]
+pub fn once_with<A, F: FnOnce() -> A>(gen: F) -> OnceWith<F> {
+    OnceWith { gen: Some(gen) }
+}
+
 /// Creates a new iterator where each iteration calls the provided closure
 /// `F: FnMut(&mut St) -> Option<T>`.
 ///
diff --git a/src/libcore/lib.rs b/src/libcore/lib.rs
index 8879112..33c0da8 100644
--- a/src/libcore/lib.rs
+++ b/src/libcore/lib.rs
@@ -79,6 +79,7 @@
 #![feature(extern_types)]
 #![feature(fundamental)]
 #![feature(intrinsics)]
+#![feature(iter_once_with)]
 #![feature(lang_items)]
 #![feature(link_llvm_intrinsics)]
 #![feature(never_type)]
diff --git a/src/libcore/ops/index.rs b/src/libcore/ops/index.rs
index 4f55c68..6cfa367 100644
--- a/src/libcore/ops/index.rs
+++ b/src/libcore/ops/index.rs
@@ -51,6 +51,21 @@
 /// ```
 #[lang = "index"]
 #[rustc_on_unimplemented(
+    on(
+        _Self="&str",
+        note="you can use `.chars().nth()` or `.bytes().nth()`
+see chapter in The Book <https://doc.rust-lang.org/book/ch08-02-strings.html#indexing-into-strings>"
+    ),
+    on(
+        _Self="str",
+        note="you can use `.chars().nth()` or `.bytes().nth()`
+see chapter in The Book <https://doc.rust-lang.org/book/ch08-02-strings.html#indexing-into-strings>"
+    ),
+    on(
+        _Self="std::string::String",
+        note="you can use `.chars().nth()` or `.bytes().nth()`
+see chapter in The Book <https://doc.rust-lang.org/book/ch08-02-strings.html#indexing-into-strings>"
+    ),
     message="the type `{Self}` cannot be indexed by `{Idx}`",
     label="`{Self}` cannot be indexed by `{Idx}`",
 )]
@@ -141,6 +156,21 @@
 /// ```
 #[lang = "index_mut"]
 #[rustc_on_unimplemented(
+    on(
+        _Self="&str",
+        note="you can use `.chars().nth()` or `.bytes().nth()`
+see chapter in The Book <https://doc.rust-lang.org/book/ch08-02-strings.html#indexing-into-strings>"
+    ),
+    on(
+        _Self="str",
+        note="you can use `.chars().nth()` or `.bytes().nth()`
+see chapter in The Book <https://doc.rust-lang.org/book/ch08-02-strings.html#indexing-into-strings>"
+    ),
+    on(
+        _Self="std::string::String",
+        note="you can use `.chars().nth()` or `.bytes().nth()`
+see chapter in The Book <https://doc.rust-lang.org/book/ch08-02-strings.html#indexing-into-strings>"
+    ),
     message="the type `{Self}` cannot be mutably indexed by `{Idx}`",
     label="`{Self}` cannot be mutably indexed by `{Idx}`",
 )]
diff --git a/src/libcore/pin.rs b/src/libcore/pin.rs
index 762e075..7c09a36 100644
--- a/src/libcore/pin.rs
+++ b/src/libcore/pin.rs
@@ -99,6 +99,7 @@
 
 use fmt;
 use marker::{Sized, Unpin};
+use cmp::{self, PartialEq, PartialOrd};
 use ops::{Deref, DerefMut, Receiver, CoerceUnsized, DispatchFromDyn};
 
 /// A pinned pointer.
@@ -112,16 +113,57 @@
 /// [`Unpin`]: ../../std/marker/trait.Unpin.html
 /// [`pin` module]: ../../std/pin/index.html
 //
-// Note: the derives below are allowed because they all only use `&P`, so they
-// cannot move the value behind `pointer`.
+// Note: the derives below, and the explicit `PartialEq` and `PartialOrd`
+// implementations, are allowed because they all only use `&P`, so they cannot move
+// the value behind `pointer`.
 #[stable(feature = "pin", since = "1.33.0")]
 #[fundamental]
 #[repr(transparent)]
-#[derive(Copy, Clone, Hash, Eq, PartialEq, Ord, PartialOrd)]
+#[derive(Copy, Clone, Hash, Eq, Ord)]
 pub struct Pin<P> {
     pointer: P,
 }
 
+#[stable(feature = "pin_partialeq_partialord_impl_applicability", since = "1.34.0")]
+impl<P, Q> PartialEq<Pin<Q>> for Pin<P>
+where
+    P: PartialEq<Q>,
+{
+    fn eq(&self, other: &Pin<Q>) -> bool {
+        self.pointer == other.pointer
+    }
+
+    fn ne(&self, other: &Pin<Q>) -> bool {
+        self.pointer != other.pointer
+    }
+}
+
+#[stable(feature = "pin_partialeq_partialord_impl_applicability", since = "1.34.0")]
+impl<P, Q> PartialOrd<Pin<Q>> for Pin<P>
+where
+    P: PartialOrd<Q>,
+{
+    fn partial_cmp(&self, other: &Pin<Q>) -> Option<cmp::Ordering> {
+        self.pointer.partial_cmp(&other.pointer)
+    }
+
+    fn lt(&self, other: &Pin<Q>) -> bool {
+        self.pointer < other.pointer
+    }
+
+    fn le(&self, other: &Pin<Q>) -> bool {
+        self.pointer <= other.pointer
+    }
+
+    fn gt(&self, other: &Pin<Q>) -> bool {
+        self.pointer > other.pointer
+    }
+
+    fn ge(&self, other: &Pin<Q>) -> bool {
+        self.pointer >= other.pointer
+    }
+}
+
 impl<P: Deref> Pin<P>
 where
     P::Target: Unpin,
diff --git a/src/libcore/slice/memchr.rs b/src/libcore/slice/memchr.rs
index 0f1bc41..312838a 100644
--- a/src/libcore/slice/memchr.rs
+++ b/src/libcore/slice/memchr.rs
@@ -1,5 +1,4 @@
-//
-// Original implementation taken from rust-memchr
+// Original implementation taken from rust-memchr.
 // Copyright 2015 Andrew Gallant, bluss and Nicolas Koch
 
 use cmp;
@@ -8,13 +7,13 @@
 const LO_U64: u64 = 0x0101010101010101;
 const HI_U64: u64 = 0x8080808080808080;
 
-// use truncation
+// Use truncation.
 const LO_USIZE: usize = LO_U64 as usize;
 const HI_USIZE: usize = HI_U64 as usize;
 
-/// Return `true` if `x` contains any zero byte.
+/// Returns whether `x` contains any zero byte.
 ///
-/// From *Matters Computational*, J. Arndt
+/// From *Matters Computational*, J. Arndt:
 ///
 /// "The idea is to subtract one from each of the bytes and then look for
 /// bytes where the borrow propagated all the way to the most significant
@@ -36,7 +35,7 @@
     (b as usize) * (::usize::MAX / 255)
 }
 
-/// Return the first index matching the byte `x` in `text`.
+/// Returns the first index matching the byte `x` in `text`.
 pub fn memchr(x: u8, text: &[u8]) -> Option<usize> {
     // Scan for a single byte value by reading two `usize` words at a time.
     //
@@ -77,18 +76,18 @@
         }
     }
 
-    // find the byte after the point the body loop stopped
+    // Find the byte after the point the body loop stopped.
     text[offset..].iter().position(|elt| *elt == x).map(|i| offset + i)
 }
 
-/// Return the last index matching the byte `x` in `text`.
+/// Returns the last index matching the byte `x` in `text`.
 pub fn memrchr(x: u8, text: &[u8]) -> Option<usize> {
     // Scan for a single byte value by reading two `usize` words at a time.
     //
-    // Split `text` in three parts
-    // - unaligned tail, after the last word aligned address in text
-    // - body, scan by 2 words at a time
-    // - the first remaining bytes, < 2 word size
+    // Split `text` in three parts:
+    // - unaligned tail, after the last word aligned address in text,
+    // - body, scanned by 2 words at a time,
+    // - the first remaining bytes, < 2 word size.
     let len = text.len();
     let ptr = text.as_ptr();
     type Chunk = usize;
@@ -105,7 +104,7 @@
         return Some(offset + index);
     }
 
-    // search the body of the text, make sure we don't cross min_aligned_offset.
+    // Search the body of the text, make sure we don't cross min_aligned_offset.
     // offset is always aligned, so just testing `>` is sufficient and avoids possible
     // overflow.
     let repeated_x = repeat_byte(x);
@@ -116,7 +115,7 @@
             let u = *(ptr.offset(offset as isize - 2 * chunk_bytes as isize) as *const Chunk);
             let v = *(ptr.offset(offset as isize - chunk_bytes as isize) as *const Chunk);
 
-            // break if there is a matching byte
+            // Break if there is a matching byte.
             let zu = contains_zero_byte(u ^ repeated_x);
             let zv = contains_zero_byte(v ^ repeated_x);
             if zu || zv {
@@ -126,6 +125,6 @@
         offset -= 2 * chunk_bytes;
     }
 
-    // find the byte before the point the body loop stopped
+    // Find the byte before the point the body loop stopped.
     text[..offset].iter().rposition(|elt| *elt == x)
 }
diff --git a/src/libcore/sync/atomic.rs b/src/libcore/sync/atomic.rs
index 99e6365..8992e51 100644
--- a/src/libcore/sync/atomic.rs
+++ b/src/libcore/sync/atomic.rs
@@ -84,6 +84,8 @@
 use cell::UnsafeCell;
 use fmt;
 
+use hint::spin_loop;
+
 /// Save power or switch hyperthreads in a busy-wait spin-loop.
 ///
 /// This function is deliberately more primitive than
@@ -96,15 +98,7 @@
 #[inline]
 #[stable(feature = "spin_loop_hint", since = "1.24.0")]
 pub fn spin_loop_hint() {
-    #[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
-    unsafe {
-        asm!("pause" ::: "memory" : "volatile");
-    }
-
-    #[cfg(target_arch = "aarch64")]
-    unsafe {
-        asm!("yield" ::: "memory" : "volatile");
-    }
+    spin_loop()
 }
 
 /// A boolean type which can be safely shared between threads.
diff --git a/src/libcore/tests/iter.rs b/src/libcore/tests/iter.rs
index cf19851..3944bc7 100644
--- a/src/libcore/tests/iter.rs
+++ b/src/libcore/tests/iter.rs
@@ -1,3 +1,4 @@
+use core::cell::Cell;
 use core::iter::*;
 use core::{i8, i16, isize};
 use core::usize;
@@ -1907,6 +1908,23 @@
 }
 
 #[test]
+fn test_once_with() {
+    let count = Cell::new(0);
+    let mut it = once_with(|| {
+        count.set(count.get() + 1);
+        42
+    });
+
+    assert_eq!(count.get(), 0);
+    assert_eq!(it.next(), Some(42));
+    assert_eq!(count.get(), 1);
+    assert_eq!(it.next(), None);
+    assert_eq!(count.get(), 1);
+    assert_eq!(it.next(), None);
+    assert_eq!(count.get(), 1);
+}
+
+#[test]
 fn test_empty() {
     let mut it = empty::<i32>();
     assert_eq!(it.next(), None);
diff --git a/src/libcore/tests/lib.rs b/src/libcore/tests/lib.rs
index 72846da..a9b8dec 100644
--- a/src/libcore/tests/lib.rs
+++ b/src/libcore/tests/lib.rs
@@ -12,6 +12,7 @@
 #![feature(hashmap_internals)]
 #![feature(iter_copied)]
 #![feature(iter_nth_back)]
+#![feature(iter_once_with)]
 #![feature(iter_unfold)]
 #![feature(pattern)]
 #![feature(range_is_empty)]
diff --git a/src/librustc/cfg/construct.rs b/src/librustc/cfg/construct.rs
index 978d20e..6122fe6 100644
--- a/src/librustc/cfg/construct.rs
+++ b/src/librustc/cfg/construct.rs
@@ -99,30 +99,21 @@
     }
 
     fn stmt(&mut self, stmt: &hir::Stmt, pred: CFGIndex) -> CFGIndex {
-        let hir_id = self.tcx.hir().node_to_hir_id(stmt.node.id());
-        match stmt.node {
-            hir::StmtKind::Decl(ref decl, _) => {
-                let exit = self.decl(&decl, pred);
-                self.add_ast_node(hir_id.local_id, &[exit])
-            }
-
-            hir::StmtKind::Expr(ref expr, _) |
-            hir::StmtKind::Semi(ref expr, _) => {
-                let exit = self.expr(&expr, pred);
-                self.add_ast_node(hir_id.local_id, &[exit])
-            }
-        }
-    }
-
-    fn decl(&mut self, decl: &hir::Decl, pred: CFGIndex) -> CFGIndex {
-        match decl.node {
-            hir::DeclKind::Local(ref local) => {
+        let hir_id = self.tcx.hir().node_to_hir_id(stmt.id);
+        let exit = match stmt.node {
+            hir::StmtKind::Local(ref local) => {
                 let init_exit = self.opt_expr(&local.init, pred);
                 self.pat(&local.pat, init_exit)
             }
-
-            hir::DeclKind::Item(_) => pred,
-        }
+            hir::StmtKind::Item(_) => {
+                pred
+            }
+            hir::StmtKind::Expr(ref expr) |
+            hir::StmtKind::Semi(ref expr) => {
+                self.expr(&expr, pred)
+            }
+        };
+        self.add_ast_node(hir_id.local_id, &[exit])
     }
 
     fn pat(&mut self, pat: &hir::Pat, pred: CFGIndex) -> CFGIndex {
diff --git a/src/librustc/dep_graph/dep_node.rs b/src/librustc/dep_graph/dep_node.rs
index 427fe51..4cfebaa 100644
--- a/src/librustc/dep_graph/dep_node.rs
+++ b/src/librustc/dep_graph/dep_node.rs
@@ -476,6 +476,9 @@
     [] CheckModLoops(DefId),
     [] CheckModUnstableApiUsage(DefId),
     [] CheckModItemTypes(DefId),
+    [] CheckModPrivacy(DefId),
+    [] CheckModIntrinsics(DefId),
+    [] CheckModLiveness(DefId),
     [] CollectModItemTypes(DefId),
 
     [] Reachability,
@@ -583,6 +586,7 @@
     [] CheckImplItemWellFormed(DefId),
     [] ReachableNonGenerics(CrateNum),
     [] NativeLibraries(CrateNum),
+    [] EntryFn(CrateNum),
     [] PluginRegistrarFn(CrateNum),
     [] ProcMacroDeclsStatic(CrateNum),
     [input] CrateDisambiguator(CrateNum),
@@ -630,6 +634,7 @@
     [input] Freevars(DefId),
     [input] MaybeUnusedTraitImport(DefId),
     [input] MaybeUnusedExternCrates,
+    [input] NamesImportedByGlobUse(DefId),
     [eval_always] StabilityIndex,
     [eval_always] AllTraits,
     [input] AllCrateNums,
diff --git a/src/librustc/dep_graph/graph.rs b/src/librustc/dep_graph/graph.rs
index 501ef01..a9e80dd 100644
--- a/src/librustc/dep_graph/graph.rs
+++ b/src/librustc/dep_graph/graph.rs
@@ -3,7 +3,7 @@
 use rustc_data_structures::fx::{FxHashMap, FxHashSet};
 use rustc_data_structures::indexed_vec::{Idx, IndexVec};
 use smallvec::SmallVec;
-use rustc_data_structures::sync::{Lrc, Lock};
+use rustc_data_structures::sync::{Lrc, Lock, AtomicU32, Ordering};
 use std::env;
 use std::hash::Hash;
 use std::collections::hash_map::Entry;
@@ -58,7 +58,7 @@
     /// nodes and edges as well as all fingerprints of nodes that have them.
     previous: PreviousDepGraph,
 
-    colors: Lock<DepNodeColorMap>,
+    colors: DepNodeColorMap,
 
     /// When we load, there may be `.o` files, cached mir, or other such
     /// things available to us. If we find that they are not dirty, we
@@ -84,7 +84,7 @@
                 dep_node_debug: Default::default(),
                 current: Lock::new(CurrentDepGraph::new(prev_graph_node_count)),
                 previous: prev_graph,
-                colors: Lock::new(DepNodeColorMap::new(prev_graph_node_count)),
+                colors: DepNodeColorMap::new(prev_graph_node_count),
                 loaded_from_cache: Default::default(),
             })),
         }
@@ -282,12 +282,11 @@
                     DepNodeColor::Red
                 };
 
-                let mut colors = data.colors.borrow_mut();
-                debug_assert!(colors.get(prev_index).is_none(),
+                debug_assert!(data.colors.get(prev_index).is_none(),
                               "DepGraph::with_task() - Duplicate DepNodeColor \
                                insertion for {:?}", key);
 
-                colors.insert(prev_index, color);
+                data.colors.insert(prev_index, color);
             }
 
             (result, dep_node_index)
@@ -502,7 +501,7 @@
     pub fn node_color(&self, dep_node: &DepNode) -> Option<DepNodeColor> {
         if let Some(ref data) = self.data {
             if let Some(prev_index) = data.previous.node_to_index_opt(dep_node) {
-                return data.colors.borrow().get(prev_index)
+                return data.colors.get(prev_index)
             } else {
                 // This is a node that did not exist in the previous compilation
                 // session, so we consider it to be red.
@@ -513,56 +512,89 @@
         None
     }
 
-    pub fn try_mark_green<'tcx>(&self,
-                                tcx: TyCtxt<'_, 'tcx, 'tcx>,
-                                dep_node: &DepNode)
-                                -> Option<DepNodeIndex> {
-        debug!("try_mark_green({:?}) - BEGIN", dep_node);
-        let data = self.data.as_ref().unwrap();
+    /// Try to read a node index for the node dep_node.
+    /// A node will have an index, when it's already been marked green, or when we can mark it
+    /// green. This function will mark the current task as a reader of the specified node, when
+    /// a node index can be found for that node.
+    pub fn try_mark_green_and_read(
+        &self,
+        tcx: TyCtxt<'_, '_, '_>,
+        dep_node: &DepNode
+    ) -> Option<(SerializedDepNodeIndex, DepNodeIndex)> {
+        self.try_mark_green(tcx, dep_node).map(|(prev_index, dep_node_index)| {
+            debug_assert!(self.is_green(&dep_node));
+            self.read_index(dep_node_index);
+            (prev_index, dep_node_index)
+        })
+    }
 
-        #[cfg(not(parallel_queries))]
-        debug_assert!(!data.current.borrow().node_to_node_index.contains_key(dep_node));
+    pub fn try_mark_green(
+        &self,
+        tcx: TyCtxt<'_, '_, '_>,
+        dep_node: &DepNode
+    ) -> Option<(SerializedDepNodeIndex, DepNodeIndex)> {
+        debug_assert!(!dep_node.kind.is_input());
 
-        if dep_node.kind.is_input() {
-            // We should only hit try_mark_green() for inputs that do not exist
-            // anymore in the current compilation session. Existing inputs are
-            // eagerly marked as either red/green before any queries are
-            // executed.
-            debug_assert!(dep_node.extract_def_id(tcx).is_none());
-            debug!("try_mark_green({:?}) - END - DepNode is deleted input", dep_node);
-            return None;
-        }
+        // Return None if the dep graph is disabled
+        let data = self.data.as_ref()?;
 
-        let (prev_deps, prev_dep_node_index) = match data.previous.edges_from(dep_node) {
-            Some(prev) => {
+        // Return None if the dep node didn't exist in the previous session
+        let prev_index = data.previous.node_to_index_opt(dep_node)?;
+
+        match data.colors.get(prev_index) {
+            Some(DepNodeColor::Green(dep_node_index)) => Some((prev_index, dep_node_index)),
+            Some(DepNodeColor::Red) => None,
+            None => {
                 // This DepNode and the corresponding query invocation existed
                 // in the previous compilation session too, so we can try to
                 // mark it as green by recursively marking all of its
                 // dependencies green.
-                prev
+                self.try_mark_previous_green(
+                    tcx.global_tcx(),
+                    data,
+                    prev_index,
+                    &dep_node
+                ).map(|dep_node_index| {
+                    (prev_index, dep_node_index)
+                })
             }
-            None => {
-                // This DepNode did not exist in the previous compilation session,
-                // so we cannot mark it as green.
-                debug!("try_mark_green({:?}) - END - DepNode does not exist in \
-                        current compilation session anymore", dep_node);
-                return None
-            }
-        };
+        }
+    }
 
-        debug_assert!(data.colors.borrow().get(prev_dep_node_index).is_none());
+    /// Try to mark a dep-node which existed in the previous compilation session as green
+    fn try_mark_previous_green<'tcx>(
+        &self,
+        tcx: TyCtxt<'_, 'tcx, 'tcx>,
+        data: &DepGraphData,
+        prev_dep_node_index: SerializedDepNodeIndex,
+        dep_node: &DepNode
+    ) -> Option<DepNodeIndex> {
+        debug!("try_mark_previous_green({:?}) - BEGIN", dep_node);
+
+        #[cfg(not(parallel_queries))]
+        {
+            debug_assert!(!data.current.borrow().node_to_node_index.contains_key(dep_node));
+            debug_assert!(data.colors.get(prev_dep_node_index).is_none());
+        }
+
+        // We never try to mark inputs as green
+        debug_assert!(!dep_node.kind.is_input());
+
+        debug_assert_eq!(data.previous.index_to_node(prev_dep_node_index), *dep_node);
+
+        let prev_deps = data.previous.edge_targets_from(prev_dep_node_index);
 
         let mut current_deps = SmallVec::new();
 
         for &dep_dep_node_index in prev_deps {
-            let dep_dep_node_color = data.colors.borrow().get(dep_dep_node_index);
+            let dep_dep_node_color = data.colors.get(dep_dep_node_index);
 
             match dep_dep_node_color {
                 Some(DepNodeColor::Green(node_index)) => {
                     // This dependency has been marked as green before, we are
                     // still fine and can continue with checking the other
                     // dependencies.
-                    debug!("try_mark_green({:?}) --- found dependency {:?} to \
+                    debug!("try_mark_previous_green({:?}) --- found dependency {:?} to \
                             be immediately green",
                             dep_node,
                             data.previous.index_to_node(dep_dep_node_index));
@@ -573,7 +605,7 @@
                     // compared to the previous compilation session. We cannot
                     // mark the DepNode as green and also don't need to bother
                     // with checking any of the other dependencies.
-                    debug!("try_mark_green({:?}) - END - dependency {:?} was \
+                    debug!("try_mark_previous_green({:?}) - END - dependency {:?} was \
                             immediately red",
                             dep_node,
                             data.previous.index_to_node(dep_dep_node_index));
@@ -585,12 +617,18 @@
                     // We don't know the state of this dependency. If it isn't
                     // an input node, let's try to mark it green recursively.
                     if !dep_dep_node.kind.is_input() {
-                         debug!("try_mark_green({:?}) --- state of dependency {:?} \
+                         debug!("try_mark_previous_green({:?}) --- state of dependency {:?} \
                                  is unknown, trying to mark it green", dep_node,
                                  dep_dep_node);
 
-                        if let Some(node_index) = self.try_mark_green(tcx, dep_dep_node) {
-                            debug!("try_mark_green({:?}) --- managed to MARK \
+                        let node_index = self.try_mark_previous_green(
+                            tcx,
+                            data,
+                            dep_dep_node_index,
+                            dep_dep_node
+                        );
+                        if let Some(node_index) = node_index {
+                            debug!("try_mark_previous_green({:?}) --- managed to MARK \
                                     dependency {:?} as green", dep_node, dep_dep_node);
                             current_deps.push(node_index);
                             continue;
@@ -600,7 +638,7 @@
                             DepKind::Hir |
                             DepKind::HirBody |
                             DepKind::CrateMetadata => {
-                                if dep_node.extract_def_id(tcx).is_none() {
+                                if dep_dep_node.extract_def_id(tcx).is_none() {
                                     // If the node does not exist anymore, we
                                     // just fail to mark green.
                                     return None
@@ -620,20 +658,20 @@
                     }
 
                     // We failed to mark it green, so we try to force the query.
-                    debug!("try_mark_green({:?}) --- trying to force \
+                    debug!("try_mark_previous_green({:?}) --- trying to force \
                             dependency {:?}", dep_node, dep_dep_node);
                     if ::ty::query::force_from_dep_node(tcx, dep_dep_node) {
-                        let dep_dep_node_color = data.colors.borrow().get(dep_dep_node_index);
+                        let dep_dep_node_color = data.colors.get(dep_dep_node_index);
 
                         match dep_dep_node_color {
                             Some(DepNodeColor::Green(node_index)) => {
-                                debug!("try_mark_green({:?}) --- managed to \
+                                debug!("try_mark_previous_green({:?}) --- managed to \
                                         FORCE dependency {:?} to green",
                                         dep_node, dep_dep_node);
                                 current_deps.push(node_index);
                             }
                             Some(DepNodeColor::Red) => {
-                                debug!("try_mark_green({:?}) - END - \
+                                debug!("try_mark_previous_green({:?}) - END - \
                                         dependency {:?} was red after forcing",
                                        dep_node,
                                        dep_dep_node);
@@ -641,7 +679,7 @@
                             }
                             None => {
                                 if !tcx.sess.has_errors() {
-                                    bug!("try_mark_green() - Forcing the DepNode \
+                                    bug!("try_mark_previous_green() - Forcing the DepNode \
                                           should have set its color")
                                 } else {
                                     // If the query we just forced has resulted
@@ -653,7 +691,7 @@
                         }
                     } else {
                         // The DepNode could not be forced.
-                        debug!("try_mark_green({:?}) - END - dependency {:?} \
+                        debug!("try_mark_previous_green({:?}) - END - dependency {:?} \
                                 could not be forced", dep_node, dep_dep_node);
                         return None
                     }
@@ -705,16 +743,15 @@
         }
 
         // ... and finally storing a "Green" entry in the color map.
-        let mut colors = data.colors.borrow_mut();
         // Multiple threads can all write the same color here
         #[cfg(not(parallel_queries))]
-        debug_assert!(colors.get(prev_dep_node_index).is_none(),
-                      "DepGraph::try_mark_green() - Duplicate DepNodeColor \
+        debug_assert!(data.colors.get(prev_dep_node_index).is_none(),
+                      "DepGraph::try_mark_previous_green() - Duplicate DepNodeColor \
                       insertion for {:?}", dep_node);
 
-        colors.insert(prev_dep_node_index, DepNodeColor::Green(dep_node_index));
+        data.colors.insert(prev_dep_node_index, DepNodeColor::Green(dep_node_index));
 
-        debug!("try_mark_green({:?}) - END - successfully marked as green", dep_node);
+        debug!("try_mark_previous_green({:?}) - END - successfully marked as green", dep_node);
         Some(dep_node_index)
     }
 
@@ -735,9 +772,8 @@
     pub fn exec_cache_promotions<'a, 'tcx>(&self, tcx: TyCtxt<'a, 'tcx, 'tcx>) {
         let green_nodes: Vec<DepNode> = {
             let data = self.data.as_ref().unwrap();
-            let colors = data.colors.borrow();
-            colors.values.indices().filter_map(|prev_index| {
-                match colors.get(prev_index) {
+            data.colors.values.indices().filter_map(|prev_index| {
+                match data.colors.get(prev_index) {
                     Some(DepNodeColor::Green(_)) => {
                         let dep_node = data.previous.index_to_node(prev_index);
                         if dep_node.cache_on_disk(tcx) {
@@ -1035,7 +1071,7 @@
 // A data structure that stores Option<DepNodeColor> values as a contiguous
 // array, using one u32 per entry.
 struct DepNodeColorMap {
-    values: IndexVec<SerializedDepNodeIndex, u32>,
+    values: IndexVec<SerializedDepNodeIndex, AtomicU32>,
 }
 
 const COMPRESSED_NONE: u32 = 0;
@@ -1045,12 +1081,12 @@
 impl DepNodeColorMap {
     fn new(size: usize) -> DepNodeColorMap {
         DepNodeColorMap {
-            values: IndexVec::from_elem_n(COMPRESSED_NONE, size)
+            values: (0..size).map(|_| AtomicU32::new(COMPRESSED_NONE)).collect(),
         }
     }
 
     fn get(&self, index: SerializedDepNodeIndex) -> Option<DepNodeColor> {
-        match self.values[index] {
+        match self.values[index].load(Ordering::Acquire) {
             COMPRESSED_NONE => None,
             COMPRESSED_RED => Some(DepNodeColor::Red),
             value => Some(DepNodeColor::Green(DepNodeIndex::from_u32(
@@ -1059,10 +1095,10 @@
         }
     }
 
-    fn insert(&mut self, index: SerializedDepNodeIndex, color: DepNodeColor) {
-        self.values[index] = match color {
+    fn insert(&self, index: SerializedDepNodeIndex, color: DepNodeColor) {
+        self.values[index].store(match color {
             DepNodeColor::Red => COMPRESSED_RED,
             DepNodeColor::Green(index) => index.as_u32() + COMPRESSED_FIRST_GREEN,
-        }
+        }, Ordering::Release)
     }
 }
diff --git a/src/librustc/dep_graph/prev.rs b/src/librustc/dep_graph/prev.rs
index 76d2954..ea5350a 100644
--- a/src/librustc/dep_graph/prev.rs
+++ b/src/librustc/dep_graph/prev.rs
@@ -19,14 +19,11 @@
     }
 
     #[inline]
-    pub fn edges_from(&self,
-                      dep_node: &DepNode)
-                      -> Option<(&[SerializedDepNodeIndex], SerializedDepNodeIndex)> {
-        self.index
-            .get(dep_node)
-            .map(|&node_index| {
-                (self.data.edge_targets_from(node_index), node_index)
-            })
+    pub fn edge_targets_from(
+        &self,
+        dep_node_index: SerializedDepNodeIndex
+    ) -> &[SerializedDepNodeIndex] {
+        self.data.edge_targets_from(dep_node_index)
     }
 
     #[inline]
diff --git a/src/librustc/diagnostics.rs b/src/librustc/diagnostics.rs
index 4bc52e8..287a45a 100644
--- a/src/librustc/diagnostics.rs
+++ b/src/librustc/diagnostics.rs
@@ -1180,27 +1180,6 @@
 ```
 "##,
 
-E0296: r##"
-This error indicates that the given recursion limit could not be parsed. Ensure
-that the value provided is a positive integer between quotes.
-
-Erroneous code example:
-
-```compile_fail,E0296
-#![recursion_limit]
-
-fn main() {}
-```
-
-And a working example:
-
-```
-#![recursion_limit="1000"]
-
-fn main() {}
-```
-"##,
-
 E0308: r##"
 This error occurs when the compiler was unable to infer the concrete type of a
 variable. It can occur for several cases, the most common of which is a
@@ -2093,20 +2072,6 @@
 ```
 "##,
 
-E0702: r##"
-This error indicates that a `#[non_exhaustive]` attribute had a value. The
-`#[non_exhaustive]` should be empty.
-
-Examples of erroneous code:
-
-```compile_fail,E0702
-# #![feature(non_exhaustive)]
-
-#[non_exhaustive(anything)]
-struct Foo;
-```
-"##,
-
 E0718: r##"
 This error indicates that a `#[lang = ".."]` attribute was placed
 on the wrong type of item.
@@ -2138,6 +2103,7 @@
     E0280, // requirement is not satisfied
     E0284, // cannot resolve type
 //  E0285, // overflow evaluation builtin bounds
+//  E0296, // replaced with a generic attribute input check
 //  E0300, // unexpanded macro
 //  E0304, // expected signed integer constant
 //  E0305, // expected constant
@@ -2180,4 +2146,5 @@
     E0709, // multiple different lifetimes used in arguments of `async fn`
     E0710, // an unknown tool name found in scoped lint
     E0711, // a feature has been declared with conflicting stability attributes
+//  E0702, // replaced with a generic attribute input check
 }
diff --git a/src/librustc/hir/check_attr.rs b/src/librustc/hir/check_attr.rs
index a214ec8..df111b2 100644
--- a/src/librustc/hir/check_attr.rs
+++ b/src/librustc/hir/check_attr.rs
@@ -142,15 +142,6 @@
                 return;
             }
         }
-
-        if attr.meta_item_list().is_some() || attr.value_str().is_some() {
-            struct_span_err!(self.tcx.sess,
-                             attr.span,
-                             E0702,
-                             "attribute should be empty")
-                .span_label(item.span, "not empty")
-                .emit();
-        }
     }
 
     /// Check if the `#[marker]` attribute on an `item` is valid.
@@ -165,12 +156,6 @@
                 return;
             }
         }
-
-        if !attr.is_word() {
-            self.tcx.sess
-                .struct_span_err(attr.span, "attribute should be empty")
-                .emit();
-        }
     }
 
     /// Check if the `#[repr]` attributes on `item` are valid.
@@ -298,8 +283,8 @@
 
     fn check_stmt_attributes(&self, stmt: &hir::Stmt) {
         // When checking statements ignore expressions, they will be checked later
-        if let hir::StmtKind::Decl(_, _) = stmt.node {
-            for attr in stmt.node.attrs() {
+        if let hir::StmtKind::Local(ref l) = stmt.node {
+            for attr in l.attrs.iter() {
                 if attr.check_name("inline") {
                     self.check_inline(attr, &stmt.span, Target::Statement);
                 }
diff --git a/src/librustc/hir/intravisit.rs b/src/librustc/hir/intravisit.rs
index f633703..592fb78 100644
--- a/src/librustc/hir/intravisit.rs
+++ b/src/librustc/hir/intravisit.rs
@@ -35,11 +35,9 @@
 use syntax_pos::Span;
 use hir::*;
 use hir::def::Def;
-use hir::map::{self, Map};
+use hir::map::Map;
 use super::itemlikevisit::DeepVisitor;
 
-use std::cmp;
-
 #[derive(Copy, Clone)]
 pub enum FnKind<'a> {
     /// `#[xxx] pub async/const/extern "Abi" fn foo()`
@@ -260,9 +258,6 @@
     fn visit_pat(&mut self, p: &'v Pat) {
         walk_pat(self, p)
     }
-    fn visit_decl(&mut self, d: &'v Decl) {
-        walk_decl(self, d)
-    }
     fn visit_anon_const(&mut self, c: &'v AnonConst) {
         walk_anon_const(self, c)
     }
@@ -953,26 +948,17 @@
 }
 
 pub fn walk_stmt<'v, V: Visitor<'v>>(visitor: &mut V, statement: &'v Stmt) {
+    visitor.visit_id(statement.id);
     match statement.node {
-        StmtKind::Decl(ref declaration, id) => {
-            visitor.visit_id(id);
-            visitor.visit_decl(declaration)
-        }
-        StmtKind::Expr(ref expression, id) |
-        StmtKind::Semi(ref expression, id) => {
-            visitor.visit_id(id);
+        StmtKind::Local(ref local) => visitor.visit_local(local),
+        StmtKind::Item(ref item) => visitor.visit_nested_item(**item),
+        StmtKind::Expr(ref expression) |
+        StmtKind::Semi(ref expression) => {
             visitor.visit_expr(expression)
         }
     }
 }
 
-pub fn walk_decl<'v, V: Visitor<'v>>(visitor: &mut V, declaration: &'v Decl) {
-    match declaration.node {
-        DeclKind::Local(ref local) => visitor.visit_local(local),
-        DeclKind::Item(item) => visitor.visit_nested_item(item),
-    }
-}
-
 pub fn walk_anon_const<'v, V: Visitor<'v>>(visitor: &mut V, constant: &'v AnonConst) {
     visitor.visit_id(constant.id);
     visitor.visit_nested_body(constant.body);
@@ -1133,57 +1119,3 @@
     // the right thing to do, should content be added in the future,
     // would be to walk it.
 }
-
-#[derive(Copy, Clone, RustcEncodable, RustcDecodable, Debug)]
-pub struct IdRange {
-    pub min: NodeId,
-    pub max: NodeId,
-}
-
-impl IdRange {
-    pub fn max() -> IdRange {
-        IdRange {
-            min: NodeId::MAX,
-            max: NodeId::from_u32(0),
-        }
-    }
-
-    pub fn empty(&self) -> bool {
-        self.min >= self.max
-    }
-
-    pub fn contains(&self, id: NodeId) -> bool {
-        id >= self.min && id < self.max
-    }
-
-    pub fn add(&mut self, id: NodeId) {
-        self.min = cmp::min(self.min, id);
-        self.max = cmp::max(self.max, NodeId::from_u32(id.as_u32() + 1));
-    }
-}
-
-
-pub struct IdRangeComputingVisitor<'a, 'hir: 'a> {
-    result: IdRange,
-    map: &'a map::Map<'hir>,
-}
-
-impl<'a, 'hir> IdRangeComputingVisitor<'a, 'hir> {
-    pub fn new(map: &'a map::Map<'hir>) -> IdRangeComputingVisitor<'a, 'hir> {
-        IdRangeComputingVisitor { result: IdRange::max(), map: map }
-    }
-
-    pub fn result(&self) -> IdRange {
-        self.result
-    }
-}
-
-impl<'a, 'hir> Visitor<'hir> for IdRangeComputingVisitor<'a, 'hir> {
-    fn nested_visit_map<'this>(&'this mut self) -> NestedVisitorMap<'this, 'hir> {
-        NestedVisitorMap::OnlyBodies(&self.map)
-    }
-
-    fn visit_id(&mut self, id: NodeId) {
-        self.result.add(id);
-    }
-}
diff --git a/src/librustc/hir/lowering.rs b/src/librustc/hir/lowering.rs
index 8badcbf..2f7d8f0 100644
--- a/src/librustc/hir/lowering.rs
+++ b/src/librustc/hir/lowering.rs
@@ -1957,7 +1957,7 @@
         )
     }
 
-    fn lower_local(&mut self, l: &Local) -> (P<hir::Local>, SmallVec<[hir::ItemId; 1]>) {
+    fn lower_local(&mut self, l: &Local) -> (hir::Local, SmallVec<[hir::ItemId; 1]>) {
         let LoweredNodeId { node_id, hir_id } = self.lower_node_id(l.id);
         let mut ids = SmallVec::<[hir::ItemId; 1]>::new();
         if self.sess.features_untracked().impl_trait_in_bindings {
@@ -1967,7 +1967,7 @@
             }
         }
         let parent_def_id = DefId::local(self.current_hir_id_owner.last().unwrap().0);
-        (P(hir::Local {
+        (hir::Local {
             id: node_id,
             hir_id,
             ty: l.ty
@@ -1984,7 +1984,7 @@
             span: l.span,
             attrs: l.attrs.clone(),
             source: hir::LocalSource::Normal,
-        }), ids)
+        }, ids)
     }
 
     fn lower_mutability(&mut self, m: Mutability) -> hir::Mutability {
@@ -3775,7 +3775,7 @@
                 let ohs = P(self.lower_expr(ohs));
                 hir::ExprKind::Unary(op, ohs)
             }
-            ExprKind::Lit(ref l) => hir::ExprKind::Lit(P((*l).clone())),
+            ExprKind::Lit(ref l) => hir::ExprKind::Lit((*l).clone()),
             ExprKind::Cast(ref expr, ref ty) => {
                 let expr = P(self.lower_expr(expr));
                 hir::ExprKind::Cast(expr, self.lower_ty(ty, ImplTraitContext::disallowed()))
@@ -4331,10 +4331,11 @@
                         ThinVec::new(),
                     ))
                 };
-                let match_stmt = respan(
-                    head_sp,
-                    hir::StmtKind::Expr(match_expr, self.next_id().node_id)
-                );
+                let match_stmt = hir::Stmt {
+                    id: self.next_id().node_id,
+                    node: hir::StmtKind::Expr(match_expr),
+                    span: head_sp,
+                };
 
                 let next_expr = P(self.expr_ident(head_sp, next_ident, next_pat.id));
 
@@ -4357,10 +4358,11 @@
 
                 let body_block = self.with_loop_scope(e.id, |this| this.lower_block(body, false));
                 let body_expr = P(self.expr_block(body_block, ThinVec::new()));
-                let body_stmt = respan(
-                    body.span,
-                    hir::StmtKind::Expr(body_expr, self.next_id().node_id)
-                );
+                let body_stmt = hir::Stmt {
+                    id: self.next_id().node_id,
+                    node: hir::StmtKind::Expr(body_expr),
+                    span: body.span,
+                };
 
                 let loop_block = P(self.block_all(
                     e.span,
@@ -4533,25 +4535,15 @@
                 let (l, item_ids) = self.lower_local(l);
                 let mut ids: SmallVec<[hir::Stmt; 1]> = item_ids
                     .into_iter()
-                    .map(|item_id| Spanned {
-                        node: hir::StmtKind::Decl(
-                            P(Spanned {
-                                node: hir::DeclKind::Item(item_id),
-                                span: s.span,
-                            }),
-                            self.next_id().node_id,
-                        ),
+                    .map(|item_id| hir::Stmt {
+                        id: self.next_id().node_id,
+                        node: hir::StmtKind::Item(P(item_id)),
                         span: s.span,
                     })
                     .collect();
-                ids.push(Spanned {
-                    node: hir::StmtKind::Decl(
-                        P(Spanned {
-                            node: hir::DeclKind::Local(l),
-                            span: s.span,
-                        }),
-                        self.lower_node_id(s.id).node_id,
-                    ),
+                ids.push(hir::Stmt {
+                    id: self.lower_node_id(s.id).node_id,
+                    node: hir::StmtKind::Local(P(l)),
                     span: s.span,
                 });
                 return ids;
@@ -4561,26 +4553,23 @@
                 let mut id = Some(s.id);
                 return self.lower_item_id(it)
                     .into_iter()
-                    .map(|item_id| Spanned {
-                        node: hir::StmtKind::Decl(
-                            P(Spanned {
-                                node: hir::DeclKind::Item(item_id),
-                                span: s.span,
-                            }),
-                            id.take()
+                    .map(|item_id| hir::Stmt {
+                        id: id.take()
                               .map(|id| self.lower_node_id(id).node_id)
                               .unwrap_or_else(|| self.next_id().node_id),
-                        ),
+                        node: hir::StmtKind::Item(P(item_id)),
                         span: s.span,
                     })
                     .collect();
             }
-            StmtKind::Expr(ref e) => Spanned {
-                node: hir::StmtKind::Expr(P(self.lower_expr(e)), self.lower_node_id(s.id).node_id),
+            StmtKind::Expr(ref e) => hir::Stmt {
+                id: self.lower_node_id(s.id).node_id,
+                node: hir::StmtKind::Expr(P(self.lower_expr(e))),
                 span: s.span,
             },
-            StmtKind::Semi(ref e) => Spanned {
-                node: hir::StmtKind::Semi(P(self.lower_expr(e)), self.lower_node_id(s.id).node_id),
+            StmtKind::Semi(ref e) => hir::Stmt {
+                id: self.lower_node_id(s.id).node_id,
+                node: hir::StmtKind::Semi(P(self.lower_expr(e))),
                 span: s.span,
             },
             StmtKind::Mac(..) => panic!("Shouldn't exist here"),
@@ -4795,7 +4784,7 @@
     ) -> hir::Stmt {
         let LoweredNodeId { node_id, hir_id } = self.next_id();
 
-        let local = P(hir::Local {
+        let local = hir::Local {
             pat,
             ty: None,
             init: ex,
@@ -4804,9 +4793,12 @@
             span: sp,
             attrs: ThinVec::new(),
             source,
-        });
-        let decl = respan(sp, hir::DeclKind::Local(local));
-        respan(sp, hir::StmtKind::Decl(P(decl), self.next_id().node_id))
+        };
+        hir::Stmt {
+            id: self.next_id().node_id,
+            node: hir::StmtKind::Local(P(local)),
+            span: sp
+        }
     }
 
     fn stmt_let(
diff --git a/src/librustc/hir/map/collector.rs b/src/librustc/hir/map/collector.rs
index ae9bb37..7cc5d75 100644
--- a/src/librustc/hir/map/collector.rs
+++ b/src/librustc/hir/map/collector.rs
@@ -426,7 +426,7 @@
     }
 
     fn visit_stmt(&mut self, stmt: &'hir Stmt) {
-        let id = stmt.node.id();
+        let id = stmt.id;
         self.insert(stmt.span, id, Node::Stmt(stmt));
 
         self.with_parent(id, |this| {
diff --git a/src/librustc/hir/map/def_collector.rs b/src/librustc/hir/map/def_collector.rs
index bc0a64a..c9b4b2b 100644
--- a/src/librustc/hir/map/def_collector.rs
+++ b/src/librustc/hir/map/def_collector.rs
@@ -120,10 +120,10 @@
         let def_data = match i.node {
             ItemKind::Impl(..) => DefPathData::Impl,
             ItemKind::Trait(..) => DefPathData::Trait(i.ident.as_interned_str()),
+            ItemKind::TraitAlias(..) => DefPathData::TraitAlias(i.ident.as_interned_str()),
             ItemKind::Enum(..) | ItemKind::Struct(..) | ItemKind::Union(..) |
-            ItemKind::TraitAlias(..) | ItemKind::Existential(..) |
-            ItemKind::ExternCrate(..) | ItemKind::ForeignMod(..) | ItemKind::Ty(..) =>
-                DefPathData::TypeNs(i.ident.as_interned_str()),
+            ItemKind::Existential(..) | ItemKind::ExternCrate(..) | ItemKind::ForeignMod(..) |
+            ItemKind::Ty(..) => DefPathData::TypeNs(i.ident.as_interned_str()),
             ItemKind::Mod(..) if i.ident == keywords::Invalid.ident() => {
                 return visit::walk_item(self, i);
             }
diff --git a/src/librustc/hir/map/definitions.rs b/src/librustc/hir/map/definitions.rs
index 6b707dd..1b74451 100644
--- a/src/librustc/hir/map/definitions.rs
+++ b/src/librustc/hir/map/definitions.rs
@@ -373,7 +373,9 @@
     /// GlobalMetaData identifies a piece of crate metadata that is global to
     /// a whole crate (as opposed to just one item). GlobalMetaData components
     /// are only supposed to show up right below the crate root.
-    GlobalMetaData(InternedString)
+    GlobalMetaData(InternedString),
+    /// A trait alias.
+    TraitAlias(InternedString),
 }
 
 #[derive(Copy, Clone, Hash, PartialEq, Eq, PartialOrd, Ord, Debug,
@@ -615,6 +617,7 @@
         match *self {
             TypeNs(name) |
             Trait(name) |
+            TraitAlias(name) |
             AssocTypeInTrait(name) |
             AssocTypeInImpl(name) |
             AssocExistentialInImpl(name) |
@@ -642,6 +645,7 @@
         let s = match *self {
             TypeNs(name) |
             Trait(name) |
+            TraitAlias(name) |
             AssocTypeInTrait(name) |
             AssocTypeInImpl(name) |
             AssocExistentialInImpl(name) |
diff --git a/src/librustc/hir/map/mod.rs b/src/librustc/hir/map/mod.rs
index 869baef..d9ca37c 100644
--- a/src/librustc/hir/map/mod.rs
+++ b/src/librustc/hir/map/mod.rs
@@ -509,6 +509,21 @@
         &self.forest.krate.attrs
     }
 
+    pub fn get_module(&self, module: DefId) -> (&'hir Mod, Span, NodeId)
+    {
+        let node_id = self.as_local_node_id(module).unwrap();
+        self.read(node_id);
+        match self.find_entry(node_id).unwrap().node {
+            Node::Item(&Item {
+                span,
+                node: ItemKind::Mod(ref m),
+                ..
+            }) => (m, span, node_id),
+            Node::Crate => (&self.forest.krate.module, self.forest.krate.span, node_id),
+            _ => panic!("not a module")
+        }
+    }
+
     pub fn visit_item_likes_in_module<V>(&self, module: DefId, visitor: &mut V)
         where V: ItemLikeVisitor<'hir>
     {
diff --git a/src/librustc/hir/mod.rs b/src/librustc/hir/mod.rs
index fc4bd05..65d9d5a 100644
--- a/src/librustc/hir/mod.rs
+++ b/src/librustc/hir/mod.rs
@@ -10,16 +10,17 @@
 pub use self::UnOp::*;
 pub use self::UnsafeSource::*;
 
+use errors::FatalError;
 use hir::def::Def;
 use hir::def_id::{DefId, DefIndex, LocalDefId, CRATE_DEF_INDEX};
 use util::nodemap::{NodeMap, FxHashSet};
 use mir::mono::Linkage;
 
 use syntax_pos::{Span, DUMMY_SP, symbol::InternedString};
-use syntax::source_map::{self, Spanned};
+use syntax::source_map::Spanned;
 use rustc_target::spec::abi::Abi;
 use syntax::ast::{self, CrateSugar, Ident, Name, NodeId, DUMMY_NODE_ID, AsmDialect};
-use syntax::ast::{Attribute, Lit, StrStyle, FloatTy, IntTy, UintTy};
+use syntax::ast::{Attribute, Label, Lit, StrStyle, FloatTy, IntTy, UintTy};
 use syntax::attr::InlineAttr;
 use syntax::ext::hygiene::SyntaxContext;
 use syntax::ptr::P;
@@ -143,17 +144,6 @@
 pub const DUMMY_ITEM_LOCAL_ID: ItemLocalId = ItemLocalId::MAX;
 
 #[derive(Clone, RustcEncodable, RustcDecodable, Copy)]
-pub struct Label {
-    pub ident: Ident,
-}
-
-impl fmt::Debug for Label {
-    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
-        write!(f, "label({:?})", self.ident)
-    }
-}
-
-#[derive(Clone, RustcEncodable, RustcDecodable, Copy)]
 pub struct Lifetime {
     pub id: NodeId,
     pub span: Span,
@@ -1144,45 +1134,41 @@
 }
 
 /// A statement
-pub type Stmt = Spanned<StmtKind>;
+#[derive(Clone, RustcEncodable, RustcDecodable)]
+pub struct Stmt {
+    pub id: NodeId,
+    pub node: StmtKind,
+    pub span: Span,
+}
 
-impl fmt::Debug for StmtKind {
+impl fmt::Debug for Stmt {
     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
-        // Sadness.
-        let spanned = source_map::dummy_spanned(self.clone());
-        write!(f,
-               "stmt({}: {})",
-               spanned.node.id(),
-               print::to_string(print::NO_ANN, |s| s.print_stmt(&spanned)))
+        write!(f, "stmt({}: {})", self.id,
+               print::to_string(print::NO_ANN, |s| s.print_stmt(self)))
     }
 }
 
 #[derive(Clone, RustcEncodable, RustcDecodable)]
 pub enum StmtKind {
-    /// Could be an item or a local (let) binding:
-    Decl(P<Decl>, NodeId),
+    /// A local (let) binding:
+    Local(P<Local>),
+    /// An item binding:
+    Item(P<ItemId>),
 
     /// Expr without trailing semi-colon (must have unit type):
-    Expr(P<Expr>, NodeId),
+    Expr(P<Expr>),
 
     /// Expr with trailing semi-colon (may have any type):
-    Semi(P<Expr>, NodeId),
+    Semi(P<Expr>),
 }
 
 impl StmtKind {
     pub fn attrs(&self) -> &[Attribute] {
         match *self {
-            StmtKind::Decl(ref d, _) => d.node.attrs(),
-            StmtKind::Expr(ref e, _) |
-            StmtKind::Semi(ref e, _) => &e.attrs,
-        }
-    }
-
-    pub fn id(&self) -> NodeId {
-        match *self {
-            StmtKind::Decl(_, id) |
-            StmtKind::Expr(_, id) |
-            StmtKind::Semi(_, id) => id,
+            StmtKind::Local(ref l) => &l.attrs,
+            StmtKind::Item(_) => &[],
+            StmtKind::Expr(ref e) |
+            StmtKind::Semi(ref e) => &e.attrs,
         }
     }
 }
@@ -1201,32 +1187,6 @@
     pub source: LocalSource,
 }
 
-pub type Decl = Spanned<DeclKind>;
-
-#[derive(Clone, RustcEncodable, RustcDecodable, Debug)]
-pub enum DeclKind {
-    /// A local (let) binding:
-    Local(P<Local>),
-    /// An item binding:
-    Item(ItemId),
-}
-
-impl DeclKind {
-    pub fn attrs(&self) -> &[Attribute] {
-        match *self {
-            DeclKind::Local(ref l) => &l.attrs,
-            DeclKind::Item(_) => &[]
-        }
-    }
-
-    pub fn is_local(&self) -> bool {
-        match *self {
-            DeclKind::Local(_) => true,
-            _ => false,
-        }
-    }
-}
-
 /// represents one arm of a 'match'
 #[derive(Clone, RustcEncodable, RustcDecodable, Debug)]
 pub struct Arm {
@@ -1466,7 +1426,7 @@
     /// A unary operation (For example: `!x`, `*x`)
     Unary(UnOp, P<Expr>),
     /// A literal (For example: `1`, `"foo"`)
-    Lit(P<Lit>),
+    Lit(Lit),
     /// A cast (`foo as f64`)
     Cast(P<Expr>, P<Ty>),
     Type(P<Expr>, P<Ty>),
@@ -2066,6 +2026,20 @@
     pub hir_ref_id: HirId,
 }
 
+impl TraitRef {
+    /// Get the `DefId` of the referenced trait. It _must_ actually be a trait or trait alias.
+    pub fn trait_def_id(&self) -> DefId {
+        match self.path.def {
+            Def::Trait(did) => did,
+            Def::TraitAlias(did) => did,
+            Def::Err => {
+                FatalError.raise();
+            }
+            _ => unreachable!(),
+        }
+    }
+}
+
 #[derive(Clone, RustcEncodable, RustcDecodable, Debug)]
 pub struct PolyTraitRef {
     /// The `'a` in `<'a> Foo<&'a T>`
diff --git a/src/librustc/hir/print.rs b/src/librustc/hir/print.rs
index d7acdef..e950f25 100644
--- a/src/librustc/hir/print.rs
+++ b/src/librustc/hir/print.rs
@@ -992,14 +992,29 @@
     pub fn print_stmt(&mut self, st: &hir::Stmt) -> io::Result<()> {
         self.maybe_print_comment(st.span.lo())?;
         match st.node {
-            hir::StmtKind::Decl(ref decl, _) => {
-                self.print_decl(&decl)?;
+            hir::StmtKind::Local(ref loc) => {
+                self.space_if_not_bol()?;
+                self.ibox(indent_unit)?;
+                self.word_nbsp("let")?;
+
+                self.ibox(indent_unit)?;
+                self.print_local_decl(&loc)?;
+                self.end()?;
+                if let Some(ref init) = loc.init {
+                    self.nbsp()?;
+                    self.word_space("=")?;
+                    self.print_expr(&init)?;
+                }
+                self.end()?
             }
-            hir::StmtKind::Expr(ref expr, _) => {
+            hir::StmtKind::Item(ref item) => {
+                self.ann.nested(self, Nested::Item(**item))?
+            }
+            hir::StmtKind::Expr(ref expr) => {
                 self.space_if_not_bol()?;
                 self.print_expr(&expr)?;
             }
-            hir::StmtKind::Semi(ref expr, _) => {
+            hir::StmtKind::Semi(ref expr) => {
                 self.space_if_not_bol()?;
                 self.print_expr(&expr)?;
                 self.s.word(";")?;
@@ -1562,30 +1577,6 @@
         Ok(())
     }
 
-    pub fn print_decl(&mut self, decl: &hir::Decl) -> io::Result<()> {
-        self.maybe_print_comment(decl.span.lo())?;
-        match decl.node {
-            hir::DeclKind::Local(ref loc) => {
-                self.space_if_not_bol()?;
-                self.ibox(indent_unit)?;
-                self.word_nbsp("let")?;
-
-                self.ibox(indent_unit)?;
-                self.print_local_decl(&loc)?;
-                self.end()?;
-                if let Some(ref init) = loc.init {
-                    self.nbsp()?;
-                    self.word_space("=")?;
-                    self.print_expr(&init)?;
-                }
-                self.end()
-            }
-            hir::DeclKind::Item(item) => {
-                self.ann.nested(self, Nested::Item(item))
-            }
-        }
-    }
-
     pub fn print_usize(&mut self, i: usize) -> io::Result<()> {
         self.s.word(i.to_string())
     }
@@ -2401,18 +2392,10 @@
 /// seen the semicolon, and thus don't need another.
 fn stmt_ends_with_semi(stmt: &hir::StmtKind) -> bool {
     match *stmt {
-        hir::StmtKind::Decl(ref d, _) => {
-            match d.node {
-                hir::DeclKind::Local(_) => true,
-                hir::DeclKind::Item(_) => false,
-            }
-        }
-        hir::StmtKind::Expr(ref e, _) => {
-            expr_requires_semi_to_be_stmt(&e)
-        }
-        hir::StmtKind::Semi(..) => {
-            false
-        }
+        hir::StmtKind::Local(_) => true,
+        hir::StmtKind::Item(_) => false,
+        hir::StmtKind::Expr(ref e) => expr_requires_semi_to_be_stmt(&e),
+        hir::StmtKind::Semi(..) => false,
     }
 }
 
diff --git a/src/librustc/ich/impls_hir.rs b/src/librustc/ich/impls_hir.rs
index 8ff60e5..1590676 100644
--- a/src/librustc/ich/impls_hir.rs
+++ b/src/librustc/ich/impls_hir.rs
@@ -153,7 +153,7 @@
     Error,
 });
 
-impl_stable_hash_for!(struct hir::Label {
+impl_stable_hash_for!(struct ast::Label {
     ident
 });
 
@@ -483,7 +483,12 @@
     UnNeg
 });
 
-impl_stable_hash_for_spanned!(hir::StmtKind);
+impl_stable_hash_for!(struct hir::Stmt {
+    id,
+    node,
+    span,
+});
+
 
 impl_stable_hash_for!(struct hir::Local {
     pat,
@@ -496,12 +501,6 @@
     source
 });
 
-impl_stable_hash_for_spanned!(hir::DeclKind);
-impl_stable_hash_for!(enum hir::DeclKind {
-    Local(local),
-    Item(item_id)
-});
-
 impl_stable_hash_for!(struct hir::Arm {
     attrs,
     pats,
@@ -941,9 +940,10 @@
 });
 
 impl_stable_hash_for!(enum hir::StmtKind {
-    Decl(decl, id),
-    Expr(expr, id),
-    Semi(expr, id)
+    Local(local),
+    Item(item_id),
+    Expr(expr),
+    Semi(expr)
 });
 
 impl_stable_hash_for!(struct hir::Arg {
diff --git a/src/librustc/ich/impls_syntax.rs b/src/librustc/ich/impls_syntax.rs
index 70ec72d..de56718 100644
--- a/src/librustc/ich/impls_syntax.rs
+++ b/src/librustc/ich/impls_syntax.rs
@@ -258,7 +258,7 @@
             tokenstream::TokenTree::Delimited(span, delim, ref tts) => {
                 span.hash_stable(hcx, hasher);
                 std_hash::Hash::hash(&delim, hasher);
-                for sub_tt in tts.stream().trees() {
+                for sub_tt in tts.trees() {
                     sub_tt.hash_stable(hcx, hasher);
                 }
             }
diff --git a/src/librustc/infer/lexical_region_resolve/mod.rs b/src/librustc/infer/lexical_region_resolve/mod.rs
index 39ce8cc..545192a 100644
--- a/src/librustc/infer/lexical_region_resolve/mod.rs
+++ b/src/librustc/infer/lexical_region_resolve/mod.rs
@@ -186,34 +186,39 @@
     }
 
     fn expansion(&self, var_values: &mut LexicalRegionResolutions<'tcx>) {
-        self.iterate_until_fixed_point("Expansion", |constraint, origin| {
-            debug!("expansion: constraint={:?} origin={:?}", constraint, origin);
-            match *constraint {
+        self.iterate_until_fixed_point("Expansion", |constraint| {
+            debug!("expansion: constraint={:?}", constraint);
+            let (a_region, b_vid, b_data, retain) = match *constraint {
                 Constraint::RegSubVar(a_region, b_vid) => {
                     let b_data = var_values.value_mut(b_vid);
-                    (self.expand_node(a_region, b_vid, b_data), false)
+                    (a_region, b_vid, b_data, false)
                 }
                 Constraint::VarSubVar(a_vid, b_vid) => match *var_values.value(a_vid) {
-                    VarValue::ErrorValue => (false, false),
+                    VarValue::ErrorValue => return (false, false),
                     VarValue::Value(a_region) => {
-                        let b_node = var_values.value_mut(b_vid);
-                        let changed = self.expand_node(a_region, b_vid, b_node);
-                        let retain = match *b_node {
+                        let b_data = var_values.value_mut(b_vid);
+                        let retain = match *b_data {
                             VarValue::Value(ReStatic) | VarValue::ErrorValue => false,
                             _ => true
                         };
-                        (changed, retain)
+                        (a_region, b_vid, b_data, retain)
                     }
                 },
                 Constraint::RegSubReg(..) | Constraint::VarSubReg(..) => {
                     // These constraints are checked after expansion
                     // is done, in `collect_errors`.
-                    (false, false)
+                    return (false, false)
                 }
-            }
+            };
+
+            let changed = self.expand_node(a_region, b_vid, b_data);
+            (changed, retain)
         })
     }
 
+    // This function is very hot in some workloads. There's a single callsite
+    // so always inlining is ok even though it's large.
+    #[inline(always)]
     fn expand_node(
         &self,
         a_region: Region<'tcx>,
@@ -722,18 +727,17 @@
     }
 
     fn iterate_until_fixed_point<F>(&self, tag: &str, mut body: F)
-    where
-        F: FnMut(&Constraint<'tcx>, &SubregionOrigin<'tcx>) -> (bool, bool),
+        where F: FnMut(&Constraint<'tcx>) -> (bool, bool),
     {
-        let mut constraints: SmallVec<[_; 16]> = self.data.constraints.iter().collect();
+        let mut constraints: SmallVec<[_; 16]> = self.data.constraints.keys().collect();
         let mut iteration = 0;
         let mut changed = true;
         while changed {
             changed = false;
             iteration += 1;
             debug!("---- {} Iteration {}{}", "#", tag, iteration);
-            constraints.retain(|(constraint, origin)| {
-                let (edge_changed, retain) = body(constraint, origin);
+            constraints.retain(|constraint| {
+                let (edge_changed, retain) = body(constraint);
                 if edge_changed {
                     debug!("Updated due to constraint {:?}", constraint);
                     changed = true;
diff --git a/src/librustc/lint/builtin.rs b/src/librustc/lint/builtin.rs
index c428ff1..a0bd4f0 100644
--- a/src/librustc/lint/builtin.rs
+++ b/src/librustc/lint/builtin.rs
@@ -205,12 +205,6 @@
 }
 
 declare_lint! {
-    pub BAD_REPR,
-    Warn,
-    "detects incorrect use of `repr` attribute"
-}
-
-declare_lint! {
     pub DEPRECATED,
     Warn,
     "detects use of deprecated items",
@@ -359,6 +353,12 @@
         Allow,
         "detects the use of `?` as a macro separator"
     }
+
+    declare_lint! {
+        pub ILL_FORMED_ATTRIBUTE_INPUT,
+        Warn,
+        "ill-formed attribute inputs that were previously accepted and used in practice"
+    }
 }
 
 declare_lint! {
@@ -368,6 +368,12 @@
     report_in_external_macro: true
 }
 
+declare_lint! {
+    pub AMBIGUOUS_ASSOCIATED_ITEMS,
+    Warn,
+    "ambiguous associated items"
+}
+
 /// Does nothing as a lint pass, but registers some `Lint`s
 /// that are used by other parts of the compiler.
 #[derive(Copy, Clone)]
@@ -431,7 +437,9 @@
             MACRO_USE_EXTERN_CRATE,
             MACRO_EXPANDED_MACRO_EXPORTS_ACCESSED_BY_ABSOLUTE_PATHS,
             parser::QUESTION_MARK_MACRO_SEP,
+            parser::ILL_FORMED_ATTRIBUTE_INPUT,
             DEPRECATED_IN_FUTURE,
+            AMBIGUOUS_ASSOCIATED_ITEMS,
         )
     }
 }
diff --git a/src/librustc/lint/context.rs b/src/librustc/lint/context.rs
index f5a7919..837a364 100644
--- a/src/librustc/lint/context.rs
+++ b/src/librustc/lint/context.rs
@@ -941,11 +941,6 @@
         hir_visit::walk_arm(self, a);
     }
 
-    fn visit_decl(&mut self, d: &'tcx hir::Decl) {
-        run_lints!(self, check_decl, d);
-        hir_visit::walk_decl(self, d);
-    }
-
     fn visit_generic_param(&mut self, p: &'tcx hir::GenericParam) {
         run_lints!(self, check_generic_param, p);
         hir_visit::walk_generic_param(self, p);
diff --git a/src/librustc/lint/levels.rs b/src/librustc/lint/levels.rs
index fe11349..8b45a5a 100644
--- a/src/librustc/lint/levels.rs
+++ b/src/librustc/lint/levels.rs
@@ -204,8 +204,6 @@
             let mut metas = if let Some(metas) = meta.meta_item_list() {
                 metas
             } else {
-                let mut err = bad_attr(meta.span);
-                err.emit();
                 continue;
             };
 
diff --git a/src/librustc/lint/mod.rs b/src/librustc/lint/mod.rs
index a373faa..e83ba74 100644
--- a/src/librustc/lint/mod.rs
+++ b/src/librustc/lint/mod.rs
@@ -28,7 +28,7 @@
 use hir::intravisit;
 use hir;
 use lint::builtin::BuiltinLintDiagnostics;
-use lint::builtin::parser::QUESTION_MARK_MACRO_SEP;
+use lint::builtin::parser::{QUESTION_MARK_MACRO_SEP, ILL_FORMED_ATTRIBUTE_INPUT};
 use session::{Session, DiagnosticMessageId};
 use std::{hash, ptr};
 use syntax::ast;
@@ -82,6 +82,7 @@
     pub fn from_parser_lint_id(lint_id: BufferedEarlyLintId) -> &'static Self {
         match lint_id {
             BufferedEarlyLintId::QuestionMarkMacroSep => QUESTION_MARK_MACRO_SEP,
+            BufferedEarlyLintId::IllFormedAttributeInput => ILL_FORMED_ATTRIBUTE_INPUT,
         }
     }
 
@@ -191,7 +192,6 @@
             fn check_stmt(a: &$hir hir::Stmt);
             fn check_arm(a: &$hir hir::Arm);
             fn check_pat(a: &$hir hir::Pat);
-            fn check_decl(a: &$hir hir::Decl);
             fn check_expr(a: &$hir hir::Expr);
             fn check_expr_post(a: &$hir hir::Expr);
             fn check_ty(a: &$hir hir::Ty);
diff --git a/src/librustc/middle/cstore.rs b/src/librustc/middle/cstore.rs
index c431dc7..9168bbf 100644
--- a/src/librustc/middle/cstore.rs
+++ b/src/librustc/middle/cstore.rs
@@ -140,7 +140,7 @@
     ),
     // Crate is loaded by `use`.
     Use,
-    /// Crate is implicitly loaded by an absolute or an `extern::` path.
+    /// Crate is implicitly loaded by an absolute path.
     Path,
 }
 
diff --git a/src/librustc/middle/dead.rs b/src/librustc/middle/dead.rs
index 0c769c9..abbf0ae 100644
--- a/src/librustc/middle/dead.rs
+++ b/src/librustc/middle/dead.rs
@@ -409,7 +409,7 @@
         }
     }).chain(
         // Seed entry point
-        tcx.sess.entry_fn.borrow().map(|(id, _, _)| id)
+        tcx.entry_fn(LOCAL_CRATE).map(|(def_id, _)| tcx.hir().as_local_node_id(def_id).unwrap())
     ).collect::<Vec<_>>();
 
     // Seed implemented trait items
diff --git a/src/librustc/middle/entry.rs b/src/librustc/middle/entry.rs
index 6b593a1..218ca3b 100644
--- a/src/librustc/middle/entry.rs
+++ b/src/librustc/middle/entry.rs
@@ -1,5 +1,5 @@
 use hir::map as hir_map;
-use hir::def_id::{CRATE_DEF_INDEX};
+use hir::def_id::{CrateNum, CRATE_DEF_INDEX, DefId, LOCAL_CRATE};
 use session::{config, Session};
 use session::config::EntryFnType;
 use syntax::ast::NodeId;
@@ -8,6 +8,8 @@
 use syntax_pos::Span;
 use hir::{Item, ItemKind, ImplItem, TraitItem};
 use hir::itemlikevisit::ItemLikeVisitor;
+use ty::TyCtxt;
+use ty::query::Providers;
 
 struct EntryContext<'a, 'tcx: 'a> {
     session: &'a Session,
@@ -45,36 +47,34 @@
     }
 }
 
-pub fn find_entry_point(session: &Session,
-                        hir_map: &hir_map::Map<'_>,
-                        crate_name: &str) {
-    let any_exe = session.crate_types.borrow().iter().any(|ty| {
+fn entry_fn(tcx: TyCtxt<'_, '_, '_>, cnum: CrateNum) -> Option<(DefId, EntryFnType)> {
+    assert_eq!(cnum, LOCAL_CRATE);
+
+    let any_exe = tcx.sess.crate_types.borrow().iter().any(|ty| {
         *ty == config::CrateType::Executable
     });
     if !any_exe {
         // No need to find a main function
-        session.entry_fn.set(None);
-        return
+        return None;
     }
 
     // If the user wants no main function at all, then stop here.
-    if attr::contains_name(&hir_map.krate().attrs, "no_main") {
-        session.entry_fn.set(None);
-        return
+    if attr::contains_name(&tcx.hir().krate().attrs, "no_main") {
+        return None;
     }
 
     let mut ctxt = EntryContext {
-        session,
-        map: hir_map,
+        session: tcx.sess,
+        map: tcx.hir(),
         main_fn: None,
         attr_main_fn: None,
         start_fn: None,
         non_main_fns: Vec::new(),
     };
 
-    hir_map.krate().visit_all_item_likes(&mut ctxt);
+    tcx.hir().krate().visit_all_item_likes(&mut ctxt);
 
-    configure_main(&mut ctxt, crate_name);
+    configure_main(tcx, &ctxt)
 }
 
 // Beware, this is duplicated in `libsyntax/entry.rs`, so make sure to keep
@@ -135,43 +135,58 @@
                     .span_label(item.span, "multiple `start` functions")
                     .emit();
             }
-        },
-        EntryPointType::None => ()
+        }
+        EntryPointType::None => (),
     }
 }
 
-fn configure_main(this: &mut EntryContext<'_, '_>, crate_name: &str) {
-    if let Some((node_id, span)) = this.start_fn {
-        this.session.entry_fn.set(Some((node_id, span, EntryFnType::Start)));
-    } else if let Some((node_id, span)) = this.attr_main_fn {
-        this.session.entry_fn.set(Some((node_id, span, EntryFnType::Main)));
-    } else if let Some((node_id, span)) = this.main_fn {
-        this.session.entry_fn.set(Some((node_id, span, EntryFnType::Main)));
+fn configure_main(
+    tcx: TyCtxt<'_, '_, '_>,
+    visitor: &EntryContext<'_, '_>,
+) -> Option<(DefId, EntryFnType)> {
+    if let Some((node_id, _)) = visitor.start_fn {
+        Some((tcx.hir().local_def_id(node_id), EntryFnType::Start))
+    } else if let Some((node_id, _)) = visitor.attr_main_fn {
+        Some((tcx.hir().local_def_id(node_id), EntryFnType::Main))
+    } else if let Some((node_id, _)) = visitor.main_fn {
+        Some((tcx.hir().local_def_id(node_id), EntryFnType::Main))
     } else {
         // No main function
-        this.session.entry_fn.set(None);
-        let mut err = struct_err!(this.session, E0601,
-            "`main` function not found in crate `{}`", crate_name);
-        if !this.non_main_fns.is_empty() {
+        let mut err = struct_err!(tcx.sess, E0601,
+            "`main` function not found in crate `{}`", tcx.crate_name(LOCAL_CRATE));
+        if !visitor.non_main_fns.is_empty() {
             // There were some functions named 'main' though. Try to give the user a hint.
             err.note("the main function must be defined at the crate level \
                       but you have one or more functions named 'main' that are not \
                       defined at the crate level. Either move the definition or \
                       attach the `#[main]` attribute to override this behavior.");
-            for &(_, span) in &this.non_main_fns {
+            for &(_, span) in &visitor.non_main_fns {
                 err.span_note(span, "here is a function named 'main'");
             }
             err.emit();
-            this.session.abort_if_errors();
+            tcx.sess.abort_if_errors();
         } else {
-            if let Some(ref filename) = this.session.local_crate_source_file {
+            if let Some(ref filename) = tcx.sess.local_crate_source_file {
                 err.note(&format!("consider adding a `main` function to `{}`", filename.display()));
             }
-            if this.session.teach(&err.get_code().unwrap()) {
+            if tcx.sess.teach(&err.get_code().unwrap()) {
                 err.note("If you don't know the basics of Rust, you can go look to the Rust Book \
                           to get started: https://doc.rust-lang.org/book/");
             }
             err.emit();
         }
+
+        None
     }
 }
+
+pub fn find_entry_point(tcx: TyCtxt<'_, '_, '_>) -> Option<(DefId, EntryFnType)> {
+    tcx.entry_fn(LOCAL_CRATE)
+}
+
+pub fn provide(providers: &mut Providers<'_>) {
+    *providers = Providers {
+        entry_fn,
+        ..*providers
+    };
+}
diff --git a/src/librustc/middle/expr_use_visitor.rs b/src/librustc/middle/expr_use_visitor.rs
index c1aa25b..08210c3 100644
--- a/src/librustc/middle/expr_use_visitor.rs
+++ b/src/librustc/middle/expr_use_visitor.rs
@@ -589,21 +589,17 @@
 
     fn walk_stmt(&mut self, stmt: &hir::Stmt) {
         match stmt.node {
-            hir::StmtKind::Decl(ref decl, _) => {
-                match decl.node {
-                    hir::DeclKind::Local(ref local) => {
-                        self.walk_local(&local);
-                    }
-
-                    hir::DeclKind::Item(_) => {
-                        // we don't visit nested items in this visitor,
-                        // only the fn body we were given.
-                    }
-                }
+            hir::StmtKind::Local(ref local) => {
+                self.walk_local(&local);
             }
 
-            hir::StmtKind::Expr(ref expr, _) |
-            hir::StmtKind::Semi(ref expr, _) => {
+            hir::StmtKind::Item(_) => {
+                // we don't visit nested items in this visitor,
+                // only the fn body we were given.
+            }
+
+            hir::StmtKind::Expr(ref expr) |
+            hir::StmtKind::Semi(ref expr) => {
                 self.consume_expr(&expr);
             }
         }
diff --git a/src/librustc/middle/intrinsicck.rs b/src/librustc/middle/intrinsicck.rs
index 1716daa..a0f7954 100644
--- a/src/librustc/middle/intrinsicck.rs
+++ b/src/librustc/middle/intrinsicck.rs
@@ -2,6 +2,7 @@
 use hir::def_id::DefId;
 use ty::{self, Ty, TyCtxt};
 use ty::layout::{LayoutError, Pointer, SizeSkeleton, VariantIdx};
+use ty::query::{Providers, queries};
 
 use rustc_target::spec::abi::Abi::RustIntrinsic;
 use rustc_data_structures::indexed_vec::Idx;
@@ -10,10 +11,23 @@
 use hir;
 
 pub fn check_crate<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>) {
-    let mut visitor = ItemVisitor {
-        tcx,
+    for &module in tcx.hir().krate().modules.keys() {
+        queries::check_mod_intrinsics::ensure(tcx, tcx.hir().local_def_id(module));
+    }
+}
+
+fn check_mod_intrinsics<'tcx>(tcx: TyCtxt<'_, 'tcx, 'tcx>, module_def_id: DefId) {
+    tcx.hir().visit_item_likes_in_module(
+        module_def_id,
+        &mut ItemVisitor { tcx }.as_deep_visitor()
+    );
+}
+
+pub fn provide(providers: &mut Providers<'_>) {
+    *providers = Providers {
+        check_mod_intrinsics,
+        ..*providers
     };
-    tcx.hir().krate().visit_all_item_likes(&mut visitor.as_deep_visitor());
 }
 
 struct ItemVisitor<'a, 'tcx: 'a> {
diff --git a/src/librustc/middle/liveness.rs b/src/librustc/middle/liveness.rs
index a78cf1a..220bec7 100644
--- a/src/librustc/middle/liveness.rs
+++ b/src/librustc/middle/liveness.rs
@@ -100,6 +100,7 @@
 use hir::def::*;
 use hir::Node;
 use ty::{self, TyCtxt};
+use ty::query::{Providers, queries};
 use lint;
 use errors::Applicability;
 use util::nodemap::{NodeMap, HirIdMap, HirIdSet};
@@ -114,8 +115,9 @@
 use syntax::symbol::keywords;
 use syntax_pos::Span;
 
-use hir::{Expr, HirId};
 use hir;
+use hir::{Expr, HirId};
+use hir::def_id::DefId;
 use hir::intravisit::{self, Visitor, FnKind, NestedVisitorMap};
 
 /// For use with `propagate_through_loop`.
@@ -179,11 +181,24 @@
     fn visit_arm(&mut self, a: &'tcx hir::Arm) { visit_arm(self, a); }
 }
 
+fn check_mod_liveness<'tcx>(tcx: TyCtxt<'_, 'tcx, 'tcx>, module_def_id: DefId) {
+    tcx.hir().visit_item_likes_in_module(module_def_id, &mut IrMaps::new(tcx).as_deep_visitor());
+}
+
 pub fn check_crate<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>) {
-    tcx.hir().krate().visit_all_item_likes(&mut IrMaps::new(tcx).as_deep_visitor());
+    for &module in tcx.hir().krate().modules.keys() {
+        queries::check_mod_liveness::ensure(tcx, tcx.hir().local_def_id(module));
+    }
     tcx.sess.abort_if_errors();
 }
 
+pub fn provide(providers: &mut Providers<'_>) {
+    *providers = Providers {
+        check_mod_liveness,
+        ..*providers
+    };
+}
+
 impl fmt::Debug for LiveNode {
     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
         write!(f, "ln({})", self.get())
@@ -911,17 +926,8 @@
     }
 
     fn compute(&mut self, body: &hir::Expr) -> LiveNode {
-        // if there is a `break` or `again` at the top level, then it's
-        // effectively a return---this only occurs in `for` loops,
-        // where the body is really a closure.
-
         debug!("compute: using id for body, {}", self.ir.tcx.hir().node_to_pretty_string(body.id));
 
-        let exit_ln = self.s.exit_ln;
-
-        self.break_ln.insert(body.id, exit_ln);
-        self.cont_ln.insert(body.id, exit_ln);
-
         // the fallthrough exit is only for those cases where we do not
         // explicitly return:
         let s = self.s;
@@ -956,46 +962,31 @@
     fn propagate_through_stmt(&mut self, stmt: &hir::Stmt, succ: LiveNode)
                               -> LiveNode {
         match stmt.node {
-            hir::StmtKind::Decl(ref decl, _) => {
-                self.propagate_through_decl(&decl, succ)
-            }
+            hir::StmtKind::Local(ref local) => {
+                // Note: we mark the variable as defined regardless of whether
+                // there is an initializer.  Initially I had thought to only mark
+                // the live variable as defined if it was initialized, and then we
+                // could check for uninit variables just by scanning what is live
+                // at the start of the function. But that doesn't work so well for
+                // immutable variables defined in a loop:
+                //     loop { let x; x = 5; }
+                // because the "assignment" loops back around and generates an error.
+                //
+                // So now we just check that variables defined w/o an
+                // initializer are not live at the point of their
+                // initialization, which is mildly more complex than checking
+                // once at the func header but otherwise equivalent.
 
-            hir::StmtKind::Expr(ref expr, _) | hir::StmtKind::Semi(ref expr, _) => {
+                let succ = self.propagate_through_opt_expr(local.init.as_ref().map(|e| &**e), succ);
+                self.define_bindings_in_pat(&local.pat, succ)
+            }
+            hir::StmtKind::Item(..) => succ,
+            hir::StmtKind::Expr(ref expr) | hir::StmtKind::Semi(ref expr) => {
                 self.propagate_through_expr(&expr, succ)
             }
         }
     }
 
-    fn propagate_through_decl(&mut self, decl: &hir::Decl, succ: LiveNode)
-                              -> LiveNode {
-        match decl.node {
-            hir::DeclKind::Local(ref local) => {
-                self.propagate_through_local(&local, succ)
-            }
-            hir::DeclKind::Item(_) => succ,
-        }
-    }
-
-    fn propagate_through_local(&mut self, local: &hir::Local, succ: LiveNode)
-                               -> LiveNode {
-        // Note: we mark the variable as defined regardless of whether
-        // there is an initializer.  Initially I had thought to only mark
-        // the live variable as defined if it was initialized, and then we
-        // could check for uninit variables just by scanning what is live
-        // at the start of the function. But that doesn't work so well for
-        // immutable variables defined in a loop:
-        //     loop { let x; x = 5; }
-        // because the "assignment" loops back around and generates an error.
-        //
-        // So now we just check that variables defined w/o an
-        // initializer are not live at the point of their
-        // initialization, which is mildly more complex than checking
-        // once at the func header but otherwise equivalent.
-
-        let succ = self.propagate_through_opt_expr(local.init.as_ref().map(|e| &**e), succ);
-        self.define_bindings_in_pat(&local.pat, succ)
-    }
-
     fn propagate_through_exprs(&mut self, exprs: &[Expr], succ: LiveNode)
                                -> LiveNode {
         exprs.iter().rev().fold(succ, |succ, expr| {
@@ -1024,19 +1015,10 @@
                 self.propagate_through_expr(&e, succ)
             }
 
-            hir::ExprKind::Closure(.., blk_id, _, _) => {
+            hir::ExprKind::Closure(..) => {
                 debug!("{} is an ExprKind::Closure",
                        self.ir.tcx.hir().node_to_pretty_string(expr.id));
 
-                // The next-node for a break is the successor of the entire
-                // loop. The next-node for a continue is the top of this loop.
-                let node = self.live_node(expr.hir_id, expr.span);
-
-                let break_ln = succ;
-                let cont_ln = node;
-                self.break_ln.insert(blk_id.node_id, break_ln);
-                self.cont_ln.insert(blk_id.node_id, cont_ln);
-
                 // the construction of a closure itself is not important,
                 // but we have to consider the closed over variables.
                 let caps = self.ir.capture_info_map.get(&expr.id).cloned().unwrap_or_else(||
@@ -1407,15 +1389,16 @@
         debug!("propagate_through_loop: using id for loop body {} {}",
                expr.id, self.ir.tcx.hir().node_to_pretty_string(body.id));
 
-        let break_ln = succ;
-        let cont_ln = ln;
-        self.break_ln.insert(expr.id, break_ln);
-        self.cont_ln.insert(expr.id, cont_ln);
+
+        self.break_ln.insert(expr.id, succ);
 
         let cond_ln = match kind {
             LoopLoop => ln,
             WhileLoop(ref cond) => self.propagate_through_expr(&cond, ln),
         };
+
+        self.cont_ln.insert(expr.id, cond_ln);
+
         let body_ln = self.propagate_through_block(body, cond_ln);
 
         // repeat until fixed point is reached:
diff --git a/src/librustc/middle/recursion_limit.rs b/src/librustc/middle/recursion_limit.rs
index ea83432..1eabd7f 100644
--- a/src/librustc/middle/recursion_limit.rs
+++ b/src/librustc/middle/recursion_limit.rs
@@ -11,14 +11,11 @@
 use rustc_data_structures::sync::Once;
 
 pub fn update_limits(sess: &Session, krate: &ast::Crate) {
-    update_limit(sess, krate, &sess.recursion_limit, "recursion_limit",
-                 "recursion limit", 64);
-    update_limit(sess, krate, &sess.type_length_limit, "type_length_limit",
-                 "type length limit", 1048576);
+    update_limit(krate, &sess.recursion_limit, "recursion_limit", 64);
+    update_limit(krate, &sess.type_length_limit, "type_length_limit", 1048576);
 }
 
-fn update_limit(sess: &Session, krate: &ast::Crate, limit: &Once<usize>,
-                name: &str, description: &str, default: usize) {
+fn update_limit(krate: &ast::Crate, limit: &Once<usize>, name: &str, default: usize) {
     for attr in &krate.attrs {
         if !attr.check_name(name) {
             continue;
@@ -30,10 +27,6 @@
                 return;
             }
         }
-
-        span_err!(sess, attr.span, E0296,
-                  "malformed {} attribute, expected #![{}=\"N\"]",
-                  description, name);
     }
     limit.set(default);
 }
diff --git a/src/librustc/middle/region.rs b/src/librustc/middle/region.rs
index ce2a348..819dd8a 100644
--- a/src/librustc/middle/region.rs
+++ b/src/librustc/middle/region.rs
@@ -784,20 +784,25 @@
         // index information.)
 
         for (i, statement) in blk.stmts.iter().enumerate() {
-            if let hir::StmtKind::Decl(..) = statement.node {
-                // Each StmtKind::Decl introduces a subscope for bindings
-                // introduced by the declaration; this subscope covers
-                // a suffix of the block . Each subscope in a block
-                // has the previous subscope in the block as a parent,
-                // except for the first such subscope, which has the
-                // block itself as a parent.
-                visitor.enter_scope(
-                    Scope {
-                        id: blk.hir_id.local_id,
-                        data: ScopeData::Remainder(FirstStatementIndex::new(i))
-                    }
-                );
-                visitor.cx.var_parent = visitor.cx.parent;
+            match statement.node {
+                hir::StmtKind::Local(..) |
+                hir::StmtKind::Item(..) => {
+                    // Each declaration introduces a subscope for bindings
+                    // introduced by the declaration; this subscope covers a
+                    // suffix of the block. Each subscope in a block has the
+                    // previous subscope in the block as a parent, except for
+                    // the first such subscope, which has the block itself as a
+                    // parent.
+                    visitor.enter_scope(
+                        Scope {
+                            id: blk.hir_id.local_id,
+                            data: ScopeData::Remainder(FirstStatementIndex::new(i))
+                        }
+                    );
+                    visitor.cx.var_parent = visitor.cx.parent;
+                }
+                hir::StmtKind::Expr(..) |
+                hir::StmtKind::Semi(..) => {}
             }
             visitor.visit_stmt(statement)
         }
@@ -835,7 +840,7 @@
 }
 
 fn resolve_stmt<'a, 'tcx>(visitor: &mut RegionResolutionVisitor<'a, 'tcx>, stmt: &'tcx hir::Stmt) {
-    let stmt_id = visitor.tcx.hir().node_to_hir_id(stmt.node.id()).local_id;
+    let stmt_id = visitor.tcx.hir().node_to_hir_id(stmt.id).local_id;
     debug!("resolve_stmt(stmt.id={:?})", stmt_id);
 
     // Every statement will clean up the temporaries created during
diff --git a/src/librustc/session/config.rs b/src/librustc/session/config.rs
index 42adc6a..cdbef56 100644
--- a/src/librustc/session/config.rs
+++ b/src/librustc/session/config.rs
@@ -6,7 +6,7 @@
 use session::{early_error, early_warn, Session};
 use session::search_paths::SearchPath;
 
-use rustc_target::spec::{LinkerFlavor, PanicStrategy, RelroLevel};
+use rustc_target::spec::{LinkerFlavor, MergeFunctions, PanicStrategy, RelroLevel};
 use rustc_target::spec::{Target, TargetTriple};
 use lint;
 use middle::cstore;
@@ -649,15 +649,15 @@
     }
 }
 
-// The type of entry function, so
-// users can have their own entry
-// functions
-#[derive(Copy, Clone, PartialEq)]
+// The type of entry function, so users can have their own entry functions
+#[derive(Copy, Clone, PartialEq, Hash, Debug)]
 pub enum EntryFnType {
     Main,
     Start,
 }
 
+impl_stable_hash_via_hash!(EntryFnType);
+
 #[derive(Copy, PartialEq, PartialOrd, Clone, Ord, Eq, Hash, Debug)]
 pub enum CrateType {
     Executable,
@@ -808,13 +808,16 @@
         pub const parse_cross_lang_lto: Option<&str> =
             Some("either a boolean (`yes`, `no`, `on`, `off`, etc), \
                   or the path to the linker plugin");
+        pub const parse_merge_functions: Option<&str> =
+            Some("one of: `disabled`, `trampolines`, or `aliases`");
     }
 
     #[allow(dead_code)]
     mod $mod_set {
         use super::{$struct_name, Passes, Sanitizer, LtoCli, CrossLangLto};
-        use rustc_target::spec::{LinkerFlavor, PanicStrategy, RelroLevel};
+        use rustc_target::spec::{LinkerFlavor, MergeFunctions, PanicStrategy, RelroLevel};
         use std::path::PathBuf;
+        use std::str::FromStr;
 
         $(
             pub fn $opt(cg: &mut $struct_name, v: Option<&str>) -> bool {
@@ -1046,6 +1049,14 @@
             };
             true
         }
+
+        fn parse_merge_functions(slot: &mut Option<MergeFunctions>, v: Option<&str>) -> bool {
+            match v.and_then(|s| MergeFunctions::from_str(s).ok()) {
+                Some(mergefunc) => *slot = Some(mergefunc),
+                _ => return false,
+            }
+            true
+        }
     }
 ) }
 
@@ -1342,10 +1353,15 @@
     unpretty: Option<String> = (None, parse_unpretty, [UNTRACKED],
         "Present the input source, unstable (and less-pretty) variants;
         valid types are any of the types for `--pretty`, as well as:
+        `expanded`, `expanded,identified`,
+        `expanded,hygiene` (with internal representations),
         `flowgraph=<nodeid>` (graphviz formatted flowgraph for node),
+        `flowgraph,unlabelled=<nodeid>` (unlabelled graphviz formatted flowgraph for node),
         `everybody_loops` (all function bodies replaced with `loop {}`),
-        `hir` (the HIR), `hir,identified`, or
-        `hir,typed` (HIR with types for each node)."),
+        `hir` (the HIR), `hir,identified`,
+        `hir,typed` (HIR with types for each node),
+        `hir-tree` (dump the raw HIR),
+        `mir` (the MIR), or `mir-cfg` (graphviz formatted MIR)"),
     run_dsymutil: Option<bool> = (None, parse_opt_bool, [TRACKED],
         "run `dsymutil` and delete intermediate object files"),
     ui_testing: bool = (false, parse_bool, [UNTRACKED],
@@ -1376,6 +1392,9 @@
           "whether to use the PLT when calling into shared libraries;
           only has effect for PIC code on systems with ELF binaries
           (default: PLT is disabled if full relro is enabled)"),
+    merge_functions: Option<MergeFunctions> = (None, parse_merge_functions, [TRACKED],
+        "control the operation of the MergeFunctions LLVM pass, taking
+         the same values as the target option of the same name"),
 }
 
 pub fn default_lib_output() -> CrateType {
@@ -2394,7 +2413,7 @@
     use super::{CrateType, DebugInfo, ErrorOutputType, OptLevel, OutputTypes,
                 Passes, Sanitizer, LtoCli, CrossLangLto};
     use syntax::feature_gate::UnstableFeatures;
-    use rustc_target::spec::{PanicStrategy, RelroLevel, TargetTriple};
+    use rustc_target::spec::{MergeFunctions, PanicStrategy, RelroLevel, TargetTriple};
     use syntax::edition::Edition;
 
     pub trait DepTrackingHash {
@@ -2437,12 +2456,14 @@
     impl_dep_tracking_hash_via_hash!(Option<usize>);
     impl_dep_tracking_hash_via_hash!(Option<String>);
     impl_dep_tracking_hash_via_hash!(Option<(String, u64)>);
+    impl_dep_tracking_hash_via_hash!(Option<MergeFunctions>);
     impl_dep_tracking_hash_via_hash!(Option<PanicStrategy>);
     impl_dep_tracking_hash_via_hash!(Option<RelroLevel>);
     impl_dep_tracking_hash_via_hash!(Option<lint::Level>);
     impl_dep_tracking_hash_via_hash!(Option<PathBuf>);
     impl_dep_tracking_hash_via_hash!(Option<cstore::NativeLibraryKind>);
     impl_dep_tracking_hash_via_hash!(CrateType);
+    impl_dep_tracking_hash_via_hash!(MergeFunctions);
     impl_dep_tracking_hash_via_hash!(PanicStrategy);
     impl_dep_tracking_hash_via_hash!(RelroLevel);
     impl_dep_tracking_hash_via_hash!(Passes);
@@ -2528,7 +2549,7 @@
     use std::iter::FromIterator;
     use std::path::PathBuf;
     use super::{Externs, OutputType, OutputTypes};
-    use rustc_target::spec::{PanicStrategy, RelroLevel};
+    use rustc_target::spec::{MergeFunctions, PanicStrategy, RelroLevel};
     use syntax::symbol::Symbol;
     use syntax::edition::{Edition, DEFAULT_EDITION};
     use syntax;
@@ -3183,6 +3204,10 @@
         opts = reference.clone();
         opts.debugging_opts.cross_lang_lto = CrossLangLto::LinkerPluginAuto;
         assert!(reference.dep_tracking_hash() != opts.dep_tracking_hash());
+
+        opts = reference.clone();
+        opts.debugging_opts.merge_functions = Some(MergeFunctions::Disabled);
+        assert!(reference.dep_tracking_hash() != opts.dep_tracking_hash());
     }
 
     #[test]
diff --git a/src/librustc/session/mod.rs b/src/librustc/session/mod.rs
index fa0dfc4..cf00bf3 100644
--- a/src/librustc/session/mod.rs
+++ b/src/librustc/session/mod.rs
@@ -67,10 +67,6 @@
     /// This is `None` if the host and target are the same.
     pub target_tlib_path: Option<SearchPath>,
     pub parse_sess: ParseSess,
-    /// For a library crate, this is always none
-    pub entry_fn: Once<Option<(NodeId, Span, config::EntryFnType)>>,
-    pub plugin_registrar_fn: Once<Option<ast::NodeId>>,
-    pub proc_macro_decls_static: Once<Option<ast::NodeId>>,
     pub sysroot: PathBuf,
     /// The name of the root source file of the crate, in the local file system.
     /// `None` means that there is no source file.
@@ -1175,10 +1171,6 @@
         host_tlib_path,
         target_tlib_path,
         parse_sess: p_s,
-        // For a library crate, this is always none
-        entry_fn: Once::new(),
-        plugin_registrar_fn: Once::new(),
-        proc_macro_decls_static: Once::new(),
         sysroot,
         local_crate_source_file,
         working_dir,
diff --git a/src/librustc/traits/on_unimplemented.rs b/src/librustc/traits/on_unimplemented.rs
index 4b188d2..3ec901f 100644
--- a/src/librustc/traits/on_unimplemented.rs
+++ b/src/librustc/traits/on_unimplemented.rs
@@ -157,10 +157,7 @@
                 note: None,
             }))
         } else {
-            return Err(parse_error(tcx, attr.span,
-                                   "`#[rustc_on_unimplemented]` requires a value",
-                                   "value required here",
-                                   Some(r#"eg `#[rustc_on_unimplemented(message="foo")]`"#)));
+            return Err(ErrorReported);
         };
         debug!("of_item({:?}/{:?}) = {:?}", trait_def_id, impl_def_id, result);
         result
diff --git a/src/librustc/traits/select.rs b/src/librustc/traits/select.rs
index 6db6fe3..9a0610f 100644
--- a/src/librustc/traits/select.rs
+++ b/src/librustc/traits/select.rs
@@ -42,7 +42,7 @@
 use rustc_data_structures::sync::Lock;
 use rustc_target::spec::abi::Abi;
 use std::cmp;
-use std::fmt;
+use std::fmt::{self, Display};
 use std::iter;
 use std::rc::Rc;
 use util::nodemap::{FxHashMap, FxHashSet};
@@ -629,7 +629,8 @@
         obligation: &PredicateObligation<'tcx>,
     ) -> Result<EvaluationResult, OverflowError> {
         self.evaluation_probe(|this| {
-            this.evaluate_predicate_recursively(TraitObligationStackList::empty(), obligation)
+            this.evaluate_predicate_recursively(TraitObligationStackList::empty(),
+                obligation.clone())
         })
     }
 
@@ -655,12 +656,12 @@
         predicates: I,
     ) -> Result<EvaluationResult, OverflowError>
     where
-        I: IntoIterator<Item = &'a PredicateObligation<'tcx>>,
+        I: IntoIterator<Item = PredicateObligation<'tcx>>,
         'tcx: 'a,
     {
         let mut result = EvaluatedToOk;
         for obligation in predicates {
-            let eval = self.evaluate_predicate_recursively(stack, obligation)?;
+            let eval = self.evaluate_predicate_recursively(stack, obligation.clone())?;
             debug!(
                 "evaluate_predicate_recursively({:?}) = {:?}",
                 obligation, eval
@@ -679,9 +680,19 @@
     fn evaluate_predicate_recursively<'o>(
         &mut self,
         previous_stack: TraitObligationStackList<'o, 'tcx>,
-        obligation: &PredicateObligation<'tcx>,
+        obligation: PredicateObligation<'tcx>,
     ) -> Result<EvaluationResult, OverflowError> {
-        debug!("evaluate_predicate_recursively({:?})", obligation);
+        debug!("evaluate_predicate_recursively(previous_stack={:?}, obligation={:?})",
+            previous_stack.head(), obligation);
+
+        // Previous_stack stores a TraitObligatiom, while 'obligation' is
+        // a PredicateObligation. These are distinct types, so we can't
+        // use any Option combinator method that would force them to be
+        // the same
+        match previous_stack.head() {
+            Some(h) => self.check_recursion_limit(&obligation, h.obligation)?,
+            None => self.check_recursion_limit(&obligation, &obligation)?
+        }
 
         match obligation.predicate {
             ty::Predicate::Trait(ref t) => {
@@ -695,8 +706,9 @@
                 match self.infcx
                     .subtype_predicate(&obligation.cause, obligation.param_env, p)
                 {
-                    Some(Ok(InferOk { obligations, .. })) => {
-                        self.evaluate_predicates_recursively(previous_stack, &obligations)
+                    Some(Ok(InferOk { mut obligations, .. })) => {
+                        self.add_depth(obligations.iter_mut(), obligation.recursion_depth);
+                        self.evaluate_predicates_recursively(previous_stack,obligations.into_iter())
                     }
                     Some(Err(_)) => Ok(EvaluatedToErr),
                     None => Ok(EvaluatedToAmbig),
@@ -710,8 +722,9 @@
                 ty,
                 obligation.cause.span,
             ) {
-                Some(obligations) => {
-                    self.evaluate_predicates_recursively(previous_stack, obligations.iter())
+                Some(mut obligations) => {
+                    self.add_depth(obligations.iter_mut(), obligation.recursion_depth);
+                    self.evaluate_predicates_recursively(previous_stack, obligations.into_iter())
                 }
                 None => Ok(EvaluatedToAmbig),
             },
@@ -733,10 +746,11 @@
             ty::Predicate::Projection(ref data) => {
                 let project_obligation = obligation.with(data.clone());
                 match project::poly_project_and_unify_type(self, &project_obligation) {
-                    Ok(Some(subobligations)) => {
+                    Ok(Some(mut subobligations)) => {
+                        self.add_depth(subobligations.iter_mut(), obligation.recursion_depth);
                         let result = self.evaluate_predicates_recursively(
                             previous_stack,
-                            subobligations.iter(),
+                            subobligations.into_iter(),
                         );
                         if let Some(key) =
                             ProjectionCacheKey::from_poly_projection_predicate(self, data)
@@ -1005,7 +1019,7 @@
             match this.confirm_candidate(stack.obligation, candidate) {
                 Ok(selection) => this.evaluate_predicates_recursively(
                     stack.list(),
-                    selection.nested_obligations().iter(),
+                    selection.nested_obligations().into_iter()
                 ),
                 Err(..) => Ok(EvaluatedToErr),
             }
@@ -1080,6 +1094,45 @@
             .insert(trait_ref, WithDepNode::new(dep_node, result));
     }
 
+    // For various reasons, it's possible for a subobligation
+    // to have a *lower* recursion_depth than the obligation used to create it.
+    // Projection sub-obligations may be returned from the projection cache,
+    // which results in obligations with an 'old' recursion_depth.
+    // Additionally, methods like ty::wf::obligations and
+    // InferCtxt.subtype_predicate produce subobligations without
+    // taking in a 'parent' depth, causing the generated subobligations
+    // to have a recursion_depth of 0
+    //
+    // To ensure that obligation_depth never decreasees, we force all subobligations
+    // to have at least the depth of the original obligation.
+    fn add_depth<T: 'cx, I: Iterator<Item = &'cx mut Obligation<'tcx, T>>>(&self, it: I,
+                                                                           min_depth: usize) {
+        it.for_each(|o| o.recursion_depth = cmp::max(min_depth, o.recursion_depth) + 1);
+    }
+
+    // Check that the recursion limit has not been exceeded.
+    //
+    // The weird return type of this function allows it to be used with the 'try' (?)
+    // operator within certain functions
+    fn check_recursion_limit<T: Display + TypeFoldable<'tcx>, V: Display + TypeFoldable<'tcx>>(
+        &self,
+        obligation: &Obligation<'tcx, T>,
+        error_obligation: &Obligation<'tcx, V>
+    ) -> Result<(), OverflowError>  {
+        let recursion_limit = *self.infcx.tcx.sess.recursion_limit.get();
+        if obligation.recursion_depth >= recursion_limit {
+            match self.query_mode {
+                TraitQueryMode::Standard => {
+                    self.infcx().report_overflow_error(error_obligation, true);
+                }
+                TraitQueryMode::Canonical => {
+                    return Err(OverflowError);
+                }
+            }
+        }
+        Ok(())
+    }
+
     ///////////////////////////////////////////////////////////////////////////
     // CANDIDATE ASSEMBLY
     //
@@ -1096,17 +1149,8 @@
     ) -> SelectionResult<'tcx, SelectionCandidate<'tcx>> {
         // Watch out for overflow. This intentionally bypasses (and does
         // not update) the cache.
-        let recursion_limit = *self.infcx.tcx.sess.recursion_limit.get();
-        if stack.obligation.recursion_depth >= recursion_limit {
-            match self.query_mode {
-                TraitQueryMode::Standard => {
-                    self.infcx().report_overflow_error(&stack.obligation, true);
-                }
-                TraitQueryMode::Canonical => {
-                    return Err(Overflow);
-                }
-            }
-        }
+        self.check_recursion_limit(&stack.obligation, &stack.obligation)?;
+
 
         // Check the cache. Note that we freshen the trait-ref
         // separately rather than using `stack.fresh_trait_ref` --
@@ -1767,7 +1811,7 @@
         self.evaluation_probe(|this| {
             match this.match_where_clause_trait_ref(stack.obligation, where_clause_trait_ref) {
                 Ok(obligations) => {
-                    this.evaluate_predicates_recursively(stack.list(), obligations.iter())
+                    this.evaluate_predicates_recursively(stack.list(), obligations.into_iter())
                 }
                 Err(()) => Ok(EvaluatedToErr),
             }
@@ -2154,7 +2198,7 @@
 
         let def_id = obligation.predicate.def_id();
 
-        if ty::is_trait_alias(self.tcx(), def_id) {
+        if self.tcx().is_trait_alias(def_id) {
             candidates.vec.push(TraitAliasCandidate(def_id.clone()));
         }
 
@@ -3802,6 +3846,10 @@
     fn with(r: &'o TraitObligationStack<'o, 'tcx>) -> TraitObligationStackList<'o, 'tcx> {
         TraitObligationStackList { head: Some(r) }
     }
+
+    fn head(&self) -> Option<&'o TraitObligationStack<'o, 'tcx>> {
+        self.head
+    }
 }
 
 impl<'o, 'tcx> Iterator for TraitObligationStackList<'o, 'tcx> {
diff --git a/src/librustc/ty/context.rs b/src/librustc/ty/context.rs
index d69219e..e37eab6 100644
--- a/src/librustc/ty/context.rs
+++ b/src/librustc/ty/context.rs
@@ -983,6 +983,9 @@
 
     maybe_unused_trait_imports: FxHashSet<DefId>,
     maybe_unused_extern_crates: Vec<(DefId, Span)>,
+    /// A map of glob use to a set of names it actually imports. Currently only
+    /// used in save-analysis.
+    glob_map: FxHashMap<DefId, FxHashSet<ast::Name>>,
     /// Extern prelude entries. The value is `true` if the entry was introduced
     /// via `extern crate` item and not `--extern` option or compiler built-in.
     pub extern_prelude: FxHashMap<ast::Name, bool>,
@@ -1232,6 +1235,9 @@
                     .into_iter()
                     .map(|(id, sp)| (hir.local_def_id(id), sp))
                     .collect(),
+            glob_map: resolutions.glob_map.into_iter().map(|(id, names)| {
+                (hir.local_def_id(id), names)
+            }).collect(),
             extern_prelude: resolutions.extern_prelude,
             hir_map: hir,
             def_path_hash_to_def_id,
@@ -2972,6 +2978,10 @@
         assert_eq!(cnum, LOCAL_CRATE);
         Lrc::new(tcx.maybe_unused_extern_crates.clone())
     };
+    providers.names_imported_by_glob_use = |tcx, id| {
+        assert_eq!(id.krate, LOCAL_CRATE);
+        Lrc::new(tcx.glob_map.get(&id).cloned().unwrap_or_default())
+    };
 
     providers.stability_index = |tcx, cnum| {
         assert_eq!(cnum, LOCAL_CRATE);
diff --git a/src/librustc/ty/item_path.rs b/src/librustc/ty/item_path.rs
index 417e140..9328de4 100644
--- a/src/librustc/ty/item_path.rs
+++ b/src/librustc/ty/item_path.rs
@@ -311,6 +311,7 @@
             data @ DefPathData::Misc |
             data @ DefPathData::TypeNs(..) |
             data @ DefPathData::Trait(..) |
+            data @ DefPathData::TraitAlias(..) |
             data @ DefPathData::AssocTypeInTrait(..) |
             data @ DefPathData::AssocTypeInImpl(..) |
             data @ DefPathData::AssocExistentialInImpl(..) |
diff --git a/src/librustc/ty/mod.rs b/src/librustc/ty/mod.rs
index cfd9994..dd315cf 100644
--- a/src/librustc/ty/mod.rs
+++ b/src/librustc/ty/mod.rs
@@ -4,7 +4,7 @@
 pub use self::IntVarValue::*;
 pub use self::fold::TypeFoldable;
 
-use hir::{map as hir_map, FreevarMap, TraitMap};
+use hir::{map as hir_map, FreevarMap, GlobMap, TraitMap};
 use hir::Node;
 use hir::def::{Def, CtorKind, ExportMap};
 use hir::def_id::{CrateNum, DefId, LocalDefId, CRATE_DEF_INDEX, LOCAL_CRATE};
@@ -115,16 +115,6 @@
 
 // Data types
 
-/// The complete set of all analyses described in this module. This is
-/// produced by the driver and fed to codegen and later passes.
-///
-/// N.B., these contents are being migrated into queries using the
-/// *on-demand* infrastructure.
-#[derive(Clone)]
-pub struct CrateAnalysis {
-    pub glob_map: Option<hir::GlobMap>,
-}
-
 #[derive(Clone)]
 pub struct Resolutions {
     pub freevars: FreevarMap,
@@ -132,6 +122,7 @@
     pub maybe_unused_trait_imports: NodeSet,
     pub maybe_unused_extern_crates: Vec<(NodeId, Span)>,
     pub export_map: ExportMap,
+    pub glob_map: GlobMap,
     /// Extern prelude entries. The value is `true` if the entry was introduced
     /// via `extern crate` item and not `--extern` option or compiler built-in.
     pub extern_prelude: FxHashMap<Name, bool>,
@@ -3179,18 +3170,6 @@
     None
 }
 
-/// Returns `true` if `def_id` is a trait alias.
-pub fn is_trait_alias(tcx: TyCtxt<'_, '_, '_>, def_id: DefId) -> bool {
-    if let Some(node_id) = tcx.hir().as_local_node_id(def_id) {
-        if let Node::Item(item) = tcx.hir().get(node_id) {
-            if let hir::ItemKind::TraitAlias(..) = item.node {
-                return true;
-            }
-        }
-    }
-    false
-}
-
 /// See `ParamEnv` struct definition for details.
 fn param_env<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
                        def_id: DefId)
diff --git a/src/librustc/ty/query/config.rs b/src/librustc/ty/query/config.rs
index ca5d1f6..ae41ca0 100644
--- a/src/librustc/ty/query/config.rs
+++ b/src/librustc/ty/query/config.rs
@@ -109,6 +109,33 @@
     }
 }
 
+impl<'tcx> QueryDescription<'tcx> for queries::check_mod_privacy<'tcx> {
+    fn describe(
+        tcx: TyCtxt<'_, '_, '_>,
+        key: DefId,
+    ) -> Cow<'static, str> {
+        format!("checking privacy in {}", key.describe_as_module(tcx)).into()
+    }
+}
+
+impl<'tcx> QueryDescription<'tcx> for queries::check_mod_intrinsics<'tcx> {
+    fn describe(
+        tcx: TyCtxt<'_, '_, '_>,
+        key: DefId,
+    ) -> Cow<'static, str> {
+        format!("checking intrinsics in {}", key.describe_as_module(tcx)).into()
+    }
+}
+
+impl<'tcx> QueryDescription<'tcx> for queries::check_mod_liveness<'tcx> {
+    fn describe(
+        tcx: TyCtxt<'_, '_, '_>,
+        key: DefId,
+    ) -> Cow<'static, str> {
+        format!("checking liveness of variables in {}", key.describe_as_module(tcx)).into()
+    }
+}
+
 impl<'tcx> QueryDescription<'tcx> for queries::collect_mod_item_types<'tcx> {
     fn describe(
         tcx: TyCtxt<'_, '_, '_>,
@@ -629,6 +656,12 @@
     }
 }
 
+impl<'tcx> QueryDescription<'tcx> for queries::entry_fn<'tcx> {
+    fn describe(_tcx: TyCtxt<'_, '_, '_>, _: CrateNum) -> Cow<'static, str> {
+        "looking up the entry function of a crate".into()
+    }
+}
+
 impl<'tcx> QueryDescription<'tcx> for queries::plugin_registrar_fn<'tcx> {
     fn describe(_tcx: TyCtxt<'_, '_, '_>, _: CrateNum) -> Cow<'static, str> {
         "looking up the plugin registrar for a crate".into()
diff --git a/src/librustc/ty/query/mod.rs b/src/librustc/ty/query/mod.rs
index 39d76ce..10f3571 100644
--- a/src/librustc/ty/query/mod.rs
+++ b/src/librustc/ty/query/mod.rs
@@ -22,7 +22,7 @@
 use mir;
 use mir::interpret::GlobalId;
 use session::{CompileResult, CrateDisambiguator};
-use session::config::OutputFilenames;
+use session::config::{EntryFnType, OutputFilenames};
 use traits::{self, Vtable};
 use traits::query::{
     CanonicalPredicateGoal, CanonicalProjectionGoal,
@@ -264,6 +264,12 @@
 
         [] fn check_mod_item_types: CheckModItemTypes(DefId) -> (),
 
+        [] fn check_mod_privacy: CheckModPrivacy(DefId) -> (),
+
+        [] fn check_mod_intrinsics: CheckModIntrinsics(DefId) -> (),
+
+        [] fn check_mod_liveness: CheckModLiveness(DefId) -> (),
+
         [] fn collect_mod_item_types: CollectModItemTypes(DefId) -> (),
 
         /// Caches CoerceUnsized kinds for impls on custom types.
@@ -476,6 +482,9 @@
 
         [] fn foreign_modules: ForeignModules(CrateNum) -> Lrc<Vec<ForeignModule>>,
 
+        /// Identifies the entry-point (e.g. the `main` function) for a given
+        /// crate, returning `None` if there is no entry point (such as for library crates).
+        [] fn entry_fn: EntryFn(CrateNum) -> Option<(DefId, EntryFnType)>,
         [] fn plugin_registrar_fn: PluginRegistrarFn(CrateNum) -> Option<DefId>,
         [] fn proc_macro_decls_static: ProcMacroDeclsStatic(CrateNum) -> Option<DefId>,
         [] fn crate_disambiguator: CrateDisambiguator(CrateNum) -> CrateDisambiguator,
@@ -541,6 +550,8 @@
         [] fn maybe_unused_trait_import: MaybeUnusedTraitImport(DefId) -> bool,
         [] fn maybe_unused_extern_crates: maybe_unused_extern_crates_node(CrateNum)
             -> Lrc<Vec<(DefId, Span)>>,
+        [] fn names_imported_by_glob_use: NamesImportedByGlobUse(DefId)
+            -> Lrc<FxHashSet<ast::Name>>,
 
         [] fn stability_index: stability_index_node(CrateNum) -> Lrc<stability::Index<'tcx>>,
         [] fn all_crate_nums: all_crate_nums_node(CrateNum) -> Lrc<Vec<CrateNum>>,
diff --git a/src/librustc/ty/query/plumbing.rs b/src/librustc/ty/query/plumbing.rs
index 32d4070..1cc9bbd 100644
--- a/src/librustc/ty/query/plumbing.rs
+++ b/src/librustc/ty/query/plumbing.rs
@@ -2,7 +2,7 @@
 //! that generate the actual methods on tcx which find and execute the
 //! provider, manage the caches, and so forth.
 
-use dep_graph::{DepNodeIndex, DepNode, DepKind, DepNodeColor};
+use dep_graph::{DepNodeIndex, DepNode, DepKind, SerializedDepNodeIndex};
 use errors::DiagnosticBuilder;
 use errors::Level;
 use errors::Diagnostic;
@@ -335,40 +335,6 @@
         eprintln!("end of query stack");
     }
 
-    /// Try to read a node index for the node dep_node.
-    /// A node will have an index, when it's already been marked green, or when we can mark it
-    /// green. This function will mark the current task as a reader of the specified node, when
-    /// a node index can be found for that node.
-    pub(super) fn try_mark_green_and_read(self, dep_node: &DepNode) -> Option<DepNodeIndex> {
-        match self.dep_graph.node_color(dep_node) {
-            Some(DepNodeColor::Green(dep_node_index)) => {
-                self.dep_graph.read_index(dep_node_index);
-                Some(dep_node_index)
-            }
-            Some(DepNodeColor::Red) => {
-                None
-            }
-            None => {
-                // try_mark_green (called below) will panic when full incremental
-                // compilation is disabled. If that's the case, we can't try to mark nodes
-                // as green anyway, so we can safely return None here.
-                if !self.dep_graph.is_fully_enabled() {
-                    return None;
-                }
-                match self.dep_graph.try_mark_green(self.global_tcx(), &dep_node) {
-                    Some(dep_node_index) => {
-                        debug_assert!(self.dep_graph.is_green(&dep_node));
-                        self.dep_graph.read_index(dep_node_index);
-                        Some(dep_node_index)
-                    }
-                    None => {
-                        None
-                    }
-                }
-            }
-        }
-    }
-
     #[inline(never)]
     fn try_get_with<Q: QueryDescription<'gcx>>(
         self,
@@ -402,7 +368,7 @@
         // expensive for some DepKinds.
         if !self.dep_graph.is_fully_enabled() {
             let null_dep_node = DepNode::new_no_params(::dep_graph::DepKind::Null);
-            return self.force_query_with_job::<Q>(key, job, null_dep_node).map(|(v, _)| v);
+            return Ok(self.force_query_with_job::<Q>(key, job, null_dep_node).0);
         }
 
         let dep_node = Q::to_dep_node(self, &key);
@@ -435,30 +401,32 @@
         }
 
         if !dep_node.kind.is_input() {
-            if let Some(dep_node_index) = self.try_mark_green_and_read(&dep_node) {
-                return self.load_from_disk_and_cache_in_memory::<Q>(key,
-                                                                    job,
-                                                                    dep_node_index,
-                                                                    &dep_node)
+            if let Some((prev_dep_node_index,
+                         dep_node_index)) = self.dep_graph.try_mark_green_and_read(self,
+                                                                                   &dep_node) {
+                return Ok(self.load_from_disk_and_cache_in_memory::<Q>(
+                    key,
+                    job,
+                    prev_dep_node_index,
+                    dep_node_index,
+                    &dep_node
+                ))
             }
         }
 
-        match self.force_query_with_job::<Q>(key, job, dep_node) {
-            Ok((result, dep_node_index)) => {
-                self.dep_graph.read_index(dep_node_index);
-                Ok(result)
-            }
-            Err(e) => Err(e)
-        }
+        let (result, dep_node_index) = self.force_query_with_job::<Q>(key, job, dep_node);
+        self.dep_graph.read_index(dep_node_index);
+        Ok(result)
     }
 
     fn load_from_disk_and_cache_in_memory<Q: QueryDescription<'gcx>>(
         self,
         key: Q::Key,
         job: JobOwner<'a, 'gcx, Q>,
+        prev_dep_node_index: SerializedDepNodeIndex,
         dep_node_index: DepNodeIndex,
         dep_node: &DepNode
-    ) -> Result<Q::Value, Box<CycleError<'gcx>>>
+    ) -> Q::Value
     {
         // Note this function can be called concurrently from the same query
         // We must ensure that this is handled correctly
@@ -468,10 +436,7 @@
         // First we try to load the result from the on-disk cache
         let result = if Q::cache_on_disk(key.clone()) &&
                         self.sess.opts.debugging_opts.incremental_queries {
-            let prev_dep_node_index =
-                self.dep_graph.prev_dep_node_index_of(dep_node);
-            let result = Q::try_load_from_disk(self.global_tcx(),
-                                               prev_dep_node_index);
+            let result = Q::try_load_from_disk(self.global_tcx(), prev_dep_node_index);
 
             // We always expect to find a cached result for things that
             // can be forced from DepNode.
@@ -523,7 +488,7 @@
 
         job.complete(&result, dep_node_index);
 
-        Ok(result)
+        result
     }
 
     #[inline(never)]
@@ -563,7 +528,7 @@
         key: Q::Key,
         job: JobOwner<'_, 'gcx, Q>,
         dep_node: DepNode)
-    -> Result<(Q::Value, DepNodeIndex), Box<CycleError<'gcx>>> {
+    -> (Q::Value, DepNodeIndex) {
         // If the following assertion triggers, it can have two reasons:
         // 1. Something is wrong with DepNode creation, either here or
         //    in DepGraph::try_mark_green()
@@ -610,7 +575,7 @@
 
         job.complete(&result, dep_node_index);
 
-        Ok((result, dep_node_index))
+        (result, dep_node_index)
     }
 
     /// Ensure that either this query has all green inputs or been executed.
@@ -626,7 +591,7 @@
         // Ensuring an "input" or anonymous query makes no sense
         assert!(!dep_node.kind.is_anon());
         assert!(!dep_node.kind.is_input());
-        if self.try_mark_green_and_read(&dep_node).is_none() {
+        if self.dep_graph.try_mark_green_and_read(self, &dep_node).is_none() {
             // A None return from `try_mark_green_and_read` means that this is either
             // a new dep node or that the dep node has already been marked red.
             // Either way, we can't call `dep_graph.read()` as we don't have the
@@ -657,11 +622,14 @@
         // Ensure that only one of them runs the query
         let job = match JobOwner::try_get(self, span, &key) {
             TryGetJob::NotYetStarted(job) => job,
-            TryGetJob::JobCompleted(_) => return,
+            TryGetJob::JobCompleted(result) => {
+                if let Err(e) = result {
+                    self.report_cycle(e).emit();
+                }
+                return
+            }
         };
-        if let Err(e) = self.force_query_with_job::<Q>(key, job, dep_node) {
-            self.report_cycle(e).emit();
-        }
+        self.force_query_with_job::<Q>(key, job, dep_node);
     }
 
     pub(super) fn try_get_query<Q: QueryDescription<'gcx>>(
@@ -1280,6 +1248,9 @@
         DepKind::CheckModLoops => { force!(check_mod_loops, def_id!()); }
         DepKind::CheckModUnstableApiUsage => { force!(check_mod_unstable_api_usage, def_id!()); }
         DepKind::CheckModItemTypes => { force!(check_mod_item_types, def_id!()); }
+        DepKind::CheckModPrivacy => { force!(check_mod_privacy, def_id!()); }
+        DepKind::CheckModIntrinsics => { force!(check_mod_intrinsics, def_id!()); }
+        DepKind::CheckModLiveness => { force!(check_mod_liveness, def_id!()); }
         DepKind::CollectModItemTypes => { force!(collect_mod_item_types, def_id!()); }
         DepKind::Reachability => { force!(reachable_set, LOCAL_CRATE); }
         DepKind::MirKeys => { force!(mir_keys, LOCAL_CRATE); }
@@ -1361,6 +1332,7 @@
         DepKind::CheckImplItemWellFormed => { force!(check_impl_item_well_formed, def_id!()); }
         DepKind::ReachableNonGenerics => { force!(reachable_non_generics, krate!()); }
         DepKind::NativeLibraries => { force!(native_libraries, krate!()); }
+        DepKind::EntryFn => { force!(entry_fn, krate!()); }
         DepKind::PluginRegistrarFn => { force!(plugin_registrar_fn, krate!()); }
         DepKind::ProcMacroDeclsStatic => { force!(proc_macro_decls_static, krate!()); }
         DepKind::CrateDisambiguator => { force!(crate_disambiguator, krate!()); }
@@ -1412,6 +1384,7 @@
         DepKind::MaybeUnusedTraitImport => {
             force!(maybe_unused_trait_import, def_id!());
         }
+        DepKind::NamesImportedByGlobUse => { force!(names_imported_by_glob_use, def_id!()); }
         DepKind::MaybeUnusedExternCrates => { force!(maybe_unused_extern_crates, LOCAL_CRATE); }
         DepKind::StabilityIndex => { force!(stability_index, LOCAL_CRATE); }
         DepKind::AllTraits => { force!(all_traits, LOCAL_CRATE); }
diff --git a/src/librustc/ty/util.rs b/src/librustc/ty/util.rs
index e989ef8..75fc0f7 100644
--- a/src/librustc/ty/util.rs
+++ b/src/librustc/ty/util.rs
@@ -526,6 +526,15 @@
         }
     }
 
+    /// True if `def_id` refers to a trait alias (i.e., `trait Foo = ...;`).
+    pub fn is_trait_alias(self, def_id: DefId) -> bool {
+        if let DefPathData::TraitAlias(_) = self.def_key(def_id).disambiguated_data.data {
+            true
+        } else {
+            false
+        }
+    }
+
     /// True if this def-id refers to the implicit constructor for
     /// a tuple struct like `struct Foo(u32)`.
     pub fn is_struct_constructor(self, def_id: DefId) -> bool {
diff --git a/src/librustc/util/ppaux.rs b/src/librustc/util/ppaux.rs
index 04e5718..51e9192 100644
--- a/src/librustc/util/ppaux.rs
+++ b/src/librustc/util/ppaux.rs
@@ -409,6 +409,7 @@
                     DefPathData::AssocTypeInImpl(_) |
                     DefPathData::AssocExistentialInImpl(_) |
                     DefPathData::Trait(_) |
+                    DefPathData::TraitAlias(_) |
                     DefPathData::Impl |
                     DefPathData::TypeNs(_) => {
                         break;
diff --git a/src/librustc_borrowck/borrowck/mod.rs b/src/librustc_borrowck/borrowck/mod.rs
index 66303ab..72963cb 100644
--- a/src/librustc_borrowck/borrowck/mod.rs
+++ b/src/librustc_borrowck/borrowck/mod.rs
@@ -39,7 +39,6 @@
 use errors::{Applicability, DiagnosticBuilder, DiagnosticId};
 
 use rustc::hir;
-use rustc::hir::intravisit::{self, Visitor};
 
 use dataflow::{DataFlowContext, BitwiseOperator, DataFlowOperator, KillFrom};
 
@@ -157,12 +156,6 @@
     where F: FnOnce(&mut BorrowckCtxt<'a, 'tcx>) -> &'c cfg::CFG
 {
     // Check the body of fn items.
-    let tcx = this.tcx;
-    let id_range = {
-        let mut visitor = intravisit::IdRangeComputingVisitor::new(&tcx.hir());
-        visitor.visit_body(this.body);
-        visitor.result()
-    };
     let (all_loans, move_data) =
         gather_loans::gather_loans_in_fn(this, body_id);
 
@@ -184,7 +177,6 @@
                              Some(this.body),
                              cfg,
                              LoanDataFlowOperator,
-                             id_range,
                              all_loans.len());
     for (loan_idx, loan) in all_loans.iter().enumerate() {
         loan_dfcx.add_gen(loan.gen_scope.item_local_id(), loan_idx);
@@ -198,7 +190,6 @@
     let flowed_moves = move_data::FlowedMoveData::new(move_data,
                                                       this,
                                                       cfg,
-                                                      id_range,
                                                       this.body);
 
     Some(AnalysisData { all_loans,
diff --git a/src/librustc_borrowck/borrowck/move_data.rs b/src/librustc_borrowck/borrowck/move_data.rs
index c5bee87..56c9f92 100644
--- a/src/librustc_borrowck/borrowck/move_data.rs
+++ b/src/librustc_borrowck/borrowck/move_data.rs
@@ -15,7 +15,6 @@
 use std::usize;
 use syntax_pos::Span;
 use rustc::hir;
-use rustc::hir::intravisit::IdRange;
 
 #[derive(Default)]
 pub struct MoveData<'tcx> {
@@ -559,7 +558,6 @@
     pub fn new(move_data: MoveData<'tcx>,
                bccx: &BorrowckCtxt<'a, 'tcx>,
                cfg: &cfg::CFG,
-               id_range: IdRange,
                body: &hir::Body)
                -> FlowedMoveData<'a, 'tcx> {
         let tcx = bccx.tcx;
@@ -570,7 +568,6 @@
                                  Some(body),
                                  cfg,
                                  MoveDataFlowOperator,
-                                 id_range,
                                  move_data.moves.borrow().len());
         let mut dfcx_assign =
             DataFlowContext::new(tcx,
@@ -578,7 +575,6 @@
                                  Some(body),
                                  cfg,
                                  AssignDataFlowOperator,
-                                 id_range,
                                  move_data.var_assignments.borrow().len());
 
         move_data.add_gen_kills(bccx,
diff --git a/src/librustc_borrowck/dataflow.rs b/src/librustc_borrowck/dataflow.rs
index 56e25bd..8cf6205 100644
--- a/src/librustc_borrowck/dataflow.rs
+++ b/src/librustc_borrowck/dataflow.rs
@@ -15,7 +15,7 @@
 
 use rustc::util::nodemap::FxHashMap;
 use rustc::hir;
-use rustc::hir::intravisit::{self, IdRange};
+use rustc::hir::intravisit;
 use rustc::hir::print as pprust;
 
 
@@ -230,16 +230,15 @@
                body: Option<&hir::Body>,
                cfg: &cfg::CFG,
                oper: O,
-               id_range: IdRange,
                bits_per_id: usize) -> DataFlowContext<'a, 'tcx, O> {
         let usize_bits = mem::size_of::<usize>() * 8;
         let words_per_id = (bits_per_id + usize_bits - 1) / usize_bits;
         let num_nodes = cfg.graph.all_nodes().len();
 
-        debug!("DataFlowContext::new(analysis_name: {}, id_range={:?}, \
+        debug!("DataFlowContext::new(analysis_name: {}, \
                                      bits_per_id={}, words_per_id={}) \
                                      num_nodes: {}",
-               analysis_name, id_range, bits_per_id, words_per_id,
+               analysis_name, bits_per_id, words_per_id,
                num_nodes);
 
         let entry = if oper.initial_value() { usize::MAX } else {0};
diff --git a/src/librustc_codegen_llvm/debuginfo/mod.rs b/src/librustc_codegen_llvm/debuginfo/mod.rs
index 2eab626..b504aa5 100644
--- a/src/librustc_codegen_llvm/debuginfo/mod.rs
+++ b/src/librustc_codegen_llvm/debuginfo/mod.rs
@@ -14,7 +14,7 @@
 use llvm::debuginfo::{DIFile, DIType, DIScope, DIBuilder, DISubprogram, DIArray, DIFlags,
     DILexicalBlock};
 use rustc::hir::CodegenFnAttrFlags;
-use rustc::hir::def_id::{DefId, CrateNum};
+use rustc::hir::def_id::{DefId, CrateNum, LOCAL_CRATE};
 use rustc::ty::subst::{Substs, UnpackedKind};
 
 use abi::Abi;
@@ -290,9 +290,8 @@
 
         let mut flags = DIFlags::FlagPrototyped;
 
-        let local_id = self.tcx().hir().as_local_node_id(def_id);
-        if let Some((id, _, _)) = *self.sess().entry_fn.borrow() {
-            if local_id == Some(id) {
+        if let Some((id, _)) = self.tcx.entry_fn(LOCAL_CRATE) {
+            if id == def_id {
                 flags |= DIFlags::FlagMainSubprogram;
             }
         }
diff --git a/src/librustc_codegen_llvm/intrinsic.rs b/src/librustc_codegen_llvm/intrinsic.rs
index f5680b2..eeb6a64 100644
--- a/src/librustc_codegen_llvm/intrinsic.rs
+++ b/src/librustc_codegen_llvm/intrinsic.rs
@@ -1,7 +1,6 @@
 #![allow(non_upper_case_globals)]
 
 use attributes;
-use intrinsics::{self, Intrinsic};
 use llvm;
 use llvm_util;
 use abi::{Abi, FnType, LlvmType, PassMode};
@@ -658,142 +657,7 @@
                 return;
             }
 
-            _ => {
-                let intr = match Intrinsic::find(&name) {
-                    Some(intr) => intr,
-                    None => bug!("unknown intrinsic '{}'", name),
-                };
-                fn one<T>(x: Vec<T>) -> T {
-                    assert_eq!(x.len(), 1);
-                    x.into_iter().next().unwrap()
-                }
-                fn ty_to_type<'ll>(
-                    cx: &CodegenCx<'ll, '_>,
-                     t: &intrinsics::Type
-                 ) -> Vec<&'ll Type> {
-                    use intrinsics::Type::*;
-                    match *t {
-                        Void => vec![cx.type_void()],
-                        Integer(_signed, _width, llvm_width) => {
-                            vec![cx.type_ix( llvm_width as u64)]
-                        }
-                        Float(x) => {
-                            match x {
-                                32 => vec![cx.type_f32()],
-                                64 => vec![cx.type_f64()],
-                                _ => bug!()
-                            }
-                        }
-                        Pointer(ref t, ref llvm_elem, _const) => {
-                            let t = llvm_elem.as_ref().unwrap_or(t);
-                            let elem = one(ty_to_type(cx, t));
-                            vec![cx.type_ptr_to(elem)]
-                        }
-                        Vector(ref t, ref llvm_elem, length) => {
-                            let t = llvm_elem.as_ref().unwrap_or(t);
-                            let elem = one(ty_to_type(cx, t));
-                            vec![cx.type_vector(elem, length as u64)]
-                        }
-                        Aggregate(false, ref contents) => {
-                            let elems = contents.iter()
-                                                .map(|t| one(ty_to_type(cx, t)))
-                                                .collect::<Vec<_>>();
-                            vec![cx.type_struct( &elems, false)]
-                        }
-                        Aggregate(true, ref contents) => {
-                            contents.iter()
-                                    .flat_map(|t| ty_to_type(cx, t))
-                                    .collect()
-                        }
-                    }
-                }
-
-                // This allows an argument list like `foo, (bar, baz),
-                // qux` to be converted into `foo, bar, baz, qux`, integer
-                // arguments to be truncated as needed and pointers to be
-                // cast.
-                fn modify_as_needed<'ll, 'tcx>(
-                    bx: &mut Builder<'_, 'll, 'tcx>,
-                    t: &intrinsics::Type,
-                    arg: &OperandRef<'tcx, &'ll Value>,
-                ) -> Vec<&'ll Value> {
-                    match *t {
-                        intrinsics::Type::Aggregate(true, ref contents) => {
-                            // We found a tuple that needs squishing! So
-                            // run over the tuple and load each field.
-                            //
-                            // This assumes the type is "simple", i.e., no
-                            // destructors, and the contents are SIMD
-                            // etc.
-                            assert!(!bx.type_needs_drop(arg.layout.ty));
-                            let (ptr, align) = match arg.val {
-                                OperandValue::Ref(ptr, None, align) => (ptr, align),
-                                _ => bug!()
-                            };
-                            let arg = PlaceRef::new_sized(ptr, arg.layout, align);
-                            (0..contents.len()).map(|i| {
-                                let field = arg.project_field(bx, i);
-                                bx.load_operand(field).immediate()
-                            }).collect()
-                        }
-                        intrinsics::Type::Pointer(_, Some(ref llvm_elem), _) => {
-                            let llvm_elem = one(ty_to_type(bx, llvm_elem));
-                            vec![bx.pointercast(arg.immediate(), bx.type_ptr_to(llvm_elem))]
-                        }
-                        intrinsics::Type::Vector(_, Some(ref llvm_elem), length) => {
-                            let llvm_elem = one(ty_to_type(bx, llvm_elem));
-                            vec![
-                                bx.bitcast(arg.immediate(),
-                                bx.type_vector(llvm_elem, length as u64))
-                            ]
-                        }
-                        intrinsics::Type::Integer(_, width, llvm_width) if width != llvm_width => {
-                            // the LLVM intrinsic uses a smaller integer
-                            // size than the C intrinsic's signature, so
-                            // we have to trim it down here.
-                            vec![bx.trunc(arg.immediate(), bx.type_ix(llvm_width as u64))]
-                        }
-                        _ => vec![arg.immediate()],
-                    }
-                }
-
-
-                let inputs = intr.inputs.iter()
-                                        .flat_map(|t| ty_to_type(self, t))
-                                        .collect::<Vec<_>>();
-
-                let outputs = one(ty_to_type(self, &intr.output));
-
-                let llargs: Vec<_> = intr.inputs.iter().zip(args).flat_map(|(t, arg)| {
-                    modify_as_needed(self, t, arg)
-                }).collect();
-                assert_eq!(inputs.len(), llargs.len());
-
-                let val = match intr.definition {
-                    intrinsics::IntrinsicDef::Named(name) => {
-                        let f = self.declare_cfn(
-                            name,
-                            self.type_func(&inputs, outputs),
-                        );
-                        self.call(f, &llargs, None)
-                    }
-                };
-
-                match *intr.output {
-                    intrinsics::Type::Aggregate(flatten, ref elems) => {
-                        // the output is a tuple so we need to munge it properly
-                        assert!(!flatten);
-
-                        for i in 0..elems.len() {
-                            let dest = result.project_field(self, i);
-                            let val = self.extract_value(val, i as u64);
-                            self.store(val, dest.llval, dest.align);
-                        }
-                        return;
-                    }
-                    _ => val,
-                }
-            }
+            _ => bug!("unknown intrinsic '{}'", name),
         };
 
         if !fn_ty.ret.is_ignore() {
diff --git a/src/librustc_codegen_llvm/lib.rs b/src/librustc_codegen_llvm/lib.rs
index 3205348..272f34b 100644
--- a/src/librustc_codegen_llvm/lib.rs
+++ b/src/librustc_codegen_llvm/lib.rs
@@ -43,7 +43,6 @@
 extern crate rustc_demangle;
 extern crate rustc_incremental;
 extern crate rustc_llvm;
-extern crate rustc_platform_intrinsics as intrinsics;
 extern crate rustc_codegen_utils;
 extern crate rustc_codegen_ssa;
 extern crate rustc_fs_util;
diff --git a/src/librustc_codegen_llvm/llvm_util.rs b/src/librustc_codegen_llvm/llvm_util.rs
index ad9ebbc..dc70ebc 100644
--- a/src/librustc_codegen_llvm/llvm_util.rs
+++ b/src/librustc_codegen_llvm/llvm_util.rs
@@ -3,6 +3,7 @@
 use llvm;
 use rustc::session::Session;
 use rustc::session::config::PrintRequest;
+use rustc_target::spec::MergeFunctions;
 use libc::c_int;
 use std::ffi::CString;
 use syntax::feature_gate::UnstableFeatures;
@@ -61,7 +62,14 @@
             add("-disable-preinline");
         }
         if llvm::LLVMRustIsRustLLVM() {
-            add("-mergefunc-use-aliases");
+            match sess.opts.debugging_opts.merge_functions
+                  .unwrap_or(sess.target.target.options.merge_functions) {
+                MergeFunctions::Disabled |
+                MergeFunctions::Trampolines => {}
+                MergeFunctions::Aliases => {
+                    add("-mergefunc-use-aliases");
+                }
+            }
         }
 
         // HACK(eddyb) LLVM inserts `llvm.assume` calls to preserve align attributes
diff --git a/src/librustc_codegen_ssa/back/symbol_export.rs b/src/librustc_codegen_ssa/back/symbol_export.rs
index 928e171..c372892 100644
--- a/src/librustc_codegen_ssa/back/symbol_export.rs
+++ b/src/librustc_codegen_ssa/back/symbol_export.rs
@@ -147,14 +147,12 @@
         })
         .collect();
 
-    if let Some(id) = *tcx.sess.proc_macro_decls_static.get() {
-        let def_id = tcx.hir().local_def_id(id);
-        reachable_non_generics.insert(def_id, SymbolExportLevel::C);
+    if let Some(id) = tcx.proc_macro_decls_static(LOCAL_CRATE) {
+        reachable_non_generics.insert(id, SymbolExportLevel::C);
     }
 
-    if let Some(id) = *tcx.sess.plugin_registrar_fn.get() {
-        let def_id = tcx.hir().local_def_id(id);
-        reachable_non_generics.insert(def_id, SymbolExportLevel::C);
+    if let Some(id) = tcx.plugin_registrar_fn(LOCAL_CRATE) {
+        reachable_non_generics.insert(id, SymbolExportLevel::C);
     }
 
     Lrc::new(reachable_non_generics)
@@ -196,7 +194,7 @@
                                  })
                                  .collect();
 
-    if tcx.sess.entry_fn.borrow().is_some() {
+    if tcx.entry_fn(LOCAL_CRATE).is_some() {
         let exported_symbol = ExportedSymbol::NoDefId(SymbolName::new("main"));
 
         symbols.push((exported_symbol, SymbolExportLevel::C));
diff --git a/src/librustc_codegen_ssa/back/write.rs b/src/librustc_codegen_ssa/back/write.rs
index fb3e7ea..39bdc70 100644
--- a/src/librustc_codegen_ssa/back/write.rs
+++ b/src/librustc_codegen_ssa/back/write.rs
@@ -24,6 +24,7 @@
 use rustc_data_structures::svh::Svh;
 use rustc_errors::{Handler, Level, DiagnosticBuilder, FatalError, DiagnosticId};
 use rustc_errors::emitter::{Emitter};
+use rustc_target::spec::MergeFunctions;
 use syntax::attr;
 use syntax::ext::hygiene::Mark;
 use syntax_pos::MultiSpan;
@@ -152,8 +153,24 @@
                             sess.opts.optimize == config::OptLevel::Aggressive &&
                             !sess.target.target.options.is_like_emscripten;
 
-        self.merge_functions = sess.opts.optimize == config::OptLevel::Default ||
-                               sess.opts.optimize == config::OptLevel::Aggressive;
+        // Some targets (namely, NVPTX) interact badly with the MergeFunctions
+        // pass. This is because MergeFunctions can generate new function calls
+        // which may interfere with the target calling convention; e.g. for the
+        // NVPTX target, PTX kernels should not call other PTX kernels.
+        // MergeFunctions can also be configured to generate aliases instead,
+        // but aliases are not supported by some backends (again, NVPTX).
+        // Therefore, allow targets to opt out of the MergeFunctions pass,
+        // but otherwise keep the pass enabled (at O2 and O3) since it can be
+        // useful for reducing code size.
+        self.merge_functions = match sess.opts.debugging_opts.merge_functions
+                                     .unwrap_or(sess.target.target.options.merge_functions) {
+            MergeFunctions::Disabled => false,
+            MergeFunctions::Trampolines |
+            MergeFunctions::Aliases => {
+                sess.opts.optimize == config::OptLevel::Default ||
+                sess.opts.optimize == config::OptLevel::Aggressive
+            }
+        };
     }
 
     pub fn bitcode_needed(&self) -> bool {
diff --git a/src/librustc_codegen_ssa/base.rs b/src/librustc_codegen_ssa/base.rs
index b88ec07..38caacb 100644
--- a/src/librustc_codegen_ssa/base.rs
+++ b/src/librustc_codegen_ssa/base.rs
@@ -441,10 +441,8 @@
 pub fn maybe_create_entry_wrapper<'a, 'tcx: 'a, Bx: BuilderMethods<'a, 'tcx>>(
     cx: &'a Bx::CodegenCx
 ) {
-    let (main_def_id, span) = match *cx.sess().entry_fn.borrow() {
-        Some((id, span, _)) => {
-            (cx.tcx().hir().local_def_id(id), span)
-        }
+    let (main_def_id, span) = match cx.tcx().entry_fn(LOCAL_CRATE) {
+        Some((def_id, _)) => { (def_id, cx.tcx().def_span(def_id)) },
         None => return,
     };
 
@@ -458,7 +456,7 @@
 
     let main_llfn = cx.get_fn(instance);
 
-    let et = cx.sess().entry_fn.get().map(|e| e.2);
+    let et = cx.tcx().entry_fn(LOCAL_CRATE).map(|e| e.1);
     match et {
         Some(EntryFnType::Main) => create_entry_fn::<Bx>(cx, span, main_llfn, main_def_id, true),
         Some(EntryFnType::Start) => create_entry_fn::<Bx>(cx, span, main_llfn, main_def_id, false),
diff --git a/src/librustc_codegen_utils/lib.rs b/src/librustc_codegen_utils/lib.rs
index b59bca0..5f61852 100644
--- a/src/librustc_codegen_utils/lib.rs
+++ b/src/librustc_codegen_utils/lib.rs
@@ -31,6 +31,7 @@
 #[macro_use] extern crate rustc_data_structures;
 
 use rustc::ty::TyCtxt;
+use rustc::hir::def_id::LOCAL_CRATE;
 
 pub mod link;
 pub mod codegen_backend;
@@ -42,11 +43,9 @@
 /// that actually test that compilation succeeds without
 /// reporting an error.
 pub fn check_for_rustc_errors_attr(tcx: TyCtxt) {
-    if let Some((id, span, _)) = *tcx.sess.entry_fn.borrow() {
-        let main_def_id = tcx.hir().local_def_id(id);
-
-        if tcx.has_attr(main_def_id, "rustc_error") {
-            tcx.sess.span_fatal(span, "compilation successful");
+    if let Some((def_id, _)) = tcx.entry_fn(LOCAL_CRATE) {
+        if tcx.has_attr(def_id, "rustc_error") {
+            tcx.sess.span_fatal(tcx.def_span(def_id), "compilation successful");
         }
     }
 }
diff --git a/src/librustc_codegen_utils/symbol_names.rs b/src/librustc_codegen_utils/symbol_names.rs
index 5a5d1b2..9267f14 100644
--- a/src/librustc_codegen_utils/symbol_names.rs
+++ b/src/librustc_codegen_utils/symbol_names.rs
@@ -242,12 +242,12 @@
 
     let node_id = tcx.hir().as_local_node_id(def_id);
 
-    if let Some(id) = node_id {
-        if *tcx.sess.plugin_registrar_fn.get() == Some(id) {
+    if def_id.is_local() {
+        if tcx.plugin_registrar_fn(LOCAL_CRATE) == Some(def_id) {
             let disambiguator = tcx.sess.local_crate_disambiguator();
             return tcx.sess.generate_plugin_registrar_symbol(disambiguator);
         }
-        if *tcx.sess.proc_macro_decls_static.get() == Some(id) {
+        if tcx.proc_macro_decls_static(LOCAL_CRATE) == Some(def_id) {
             let disambiguator = tcx.sess.local_crate_disambiguator();
             return tcx.sess.generate_proc_macro_decls_symbol(disambiguator);
         }
diff --git a/src/librustc_data_structures/sync.rs b/src/librustc_data_structures/sync.rs
index f9f94f0..0253eef 100644
--- a/src/librustc_data_structures/sync.rs
+++ b/src/librustc_data_structures/sync.rs
@@ -70,6 +70,7 @@
         pub struct Atomic<T: Copy>(Cell<T>);
 
         impl<T: Copy> Atomic<T> {
+            #[inline]
             pub fn new(v: T) -> Self {
                 Atomic(Cell::new(v))
             }
@@ -80,10 +81,12 @@
                 self.0.into_inner()
             }
 
+            #[inline]
             pub fn load(&self, _: Ordering) -> T {
                 self.0.get()
             }
 
+            #[inline]
             pub fn store(&self, val: T, _: Ordering) {
                 self.0.set(val)
             }
@@ -118,6 +121,7 @@
 
         pub type AtomicUsize = Atomic<usize>;
         pub type AtomicBool = Atomic<bool>;
+        pub type AtomicU32 = Atomic<u32>;
         pub type AtomicU64 = Atomic<u64>;
 
         pub use self::serial_join as join;
@@ -223,7 +227,7 @@
         pub use parking_lot::MutexGuard as LockGuard;
         pub use parking_lot::MappedMutexGuard as MappedLockGuard;
 
-        pub use std::sync::atomic::{AtomicBool, AtomicUsize, AtomicU64};
+        pub use std::sync::atomic::{AtomicBool, AtomicUsize, AtomicU32, AtomicU64};
 
         pub use std::sync::Arc as Lrc;
         pub use std::sync::Weak as Weak;
diff --git a/src/librustc_driver/driver.rs b/src/librustc_driver/driver.rs
index 380f9af..d23d8b8 100644
--- a/src/librustc_driver/driver.rs
+++ b/src/librustc_driver/driver.rs
@@ -26,7 +26,7 @@
 use rustc_plugin as plugin;
 use rustc_plugin::registry::Registry;
 use rustc_privacy;
-use rustc_resolve::{MakeGlobMap, Resolver, ResolverArenas};
+use rustc_resolve::{Resolver, ResolverArenas};
 use rustc_traits;
 use rustc_typeck as typeck;
 use syntax::{self, ast, attr, diagnostics, visit};
@@ -168,7 +168,6 @@
         let ExpansionResult {
             expanded_crate,
             defs,
-            analysis,
             resolutions,
             mut hir_forest,
         } = {
@@ -179,7 +178,6 @@
                 registry,
                 &crate_name,
                 addl_plugins,
-                control.make_glob_map,
                 |expanded_crate| {
                     let mut state = CompileState::state_after_expand(
                         input,
@@ -252,7 +250,6 @@
                     output,
                     &cstore,
                     &hir_map,
-                    &analysis,
                     &resolutions,
                     &expanded_crate,
                     &hir_map.krate(),
@@ -278,12 +275,11 @@
             sess,
             cstore,
             hir_map,
-            analysis,
             resolutions,
             &mut arenas,
             &crate_name,
             &outputs,
-            |tcx, analysis, rx, result| {
+            |tcx, rx, result| {
                 {
                     // Eventually, we will want to track plugins.
                     tcx.dep_graph.with_ignore(|| {
@@ -294,7 +290,6 @@
                             output,
                             opt_crate,
                             tcx.hir().krate(),
-                            &analysis,
                             tcx,
                             &crate_name,
                         );
@@ -394,7 +389,6 @@
 
     // FIXME we probably want to group the below options together and offer a
     // better API, rather than this ad-hoc approach.
-    pub make_glob_map: MakeGlobMap,
     // Whether the compiler should keep the ast beyond parsing.
     pub keep_ast: bool,
     // -Zcontinue-parse-after-error
@@ -417,7 +411,6 @@
             after_hir_lowering: PhaseController::basic(),
             after_analysis: PhaseController::basic(),
             compilation_done: PhaseController::basic(),
-            make_glob_map: MakeGlobMap::No,
             keep_ast: false,
             continue_parse_after_error: false,
             provide: box |_| {},
@@ -530,7 +523,6 @@
     pub hir_crate: Option<&'a hir::Crate>,
     pub hir_map: Option<&'a hir_map::Map<'tcx>>,
     pub resolutions: Option<&'a Resolutions>,
-    pub analysis: Option<&'a ty::CrateAnalysis>,
     pub tcx: Option<TyCtxt<'a, 'tcx, 'tcx>>,
 }
 
@@ -550,7 +542,6 @@
             hir_crate: None,
             hir_map: None,
             resolutions: None,
-            analysis: None,
             tcx: None,
         }
     }
@@ -598,7 +589,6 @@
         out_file: &'a Option<PathBuf>,
         cstore: &'tcx CStore,
         hir_map: &'a hir_map::Map<'tcx>,
-        analysis: &'a ty::CrateAnalysis,
         resolutions: &'a Resolutions,
         krate: &'a ast::Crate,
         hir_crate: &'a hir::Crate,
@@ -609,7 +599,6 @@
             crate_name: Some(crate_name),
             cstore: Some(cstore),
             hir_map: Some(hir_map),
-            analysis: Some(analysis),
             resolutions: Some(resolutions),
             expanded_crate: Some(krate),
             hir_crate: Some(hir_crate),
@@ -626,12 +615,10 @@
         out_file: &'a Option<PathBuf>,
         krate: Option<&'a ast::Crate>,
         hir_crate: &'a hir::Crate,
-        analysis: &'a ty::CrateAnalysis,
         tcx: TyCtxt<'a, 'tcx, 'tcx>,
         crate_name: &'a str,
     ) -> Self {
         CompileState {
-            analysis: Some(analysis),
             tcx: Some(tcx),
             expanded_crate: krate,
             hir_crate: Some(hir_crate),
@@ -714,7 +701,6 @@
 pub struct ExpansionResult {
     pub expanded_crate: ast::Crate,
     pub defs: hir_map::Definitions,
-    pub analysis: ty::CrateAnalysis,
     pub resolutions: Resolutions,
     pub hir_forest: hir_map::Forest,
 }
@@ -739,7 +725,6 @@
     registry: Option<Registry>,
     crate_name: &str,
     addl_plugins: Option<Vec<String>>,
-    make_glob_map: MakeGlobMap,
     after_expand: F,
 ) -> Result<ExpansionResult, CompileIncomplete>
 where
@@ -759,7 +744,6 @@
         registry,
         crate_name,
         addl_plugins,
-        make_glob_map,
         &resolver_arenas,
         &mut crate_loader,
         after_expand,
@@ -777,20 +761,13 @@
                 freevars: resolver.freevars,
                 export_map: resolver.export_map,
                 trait_map: resolver.trait_map,
+                glob_map: resolver.glob_map,
                 maybe_unused_trait_imports: resolver.maybe_unused_trait_imports,
                 maybe_unused_extern_crates: resolver.maybe_unused_extern_crates,
                 extern_prelude: resolver.extern_prelude.iter().map(|(ident, entry)| {
                     (ident.name, entry.introduced_by_item)
                 }).collect(),
             },
-
-            analysis: ty::CrateAnalysis {
-                glob_map: if resolver.make_glob_map {
-                    Some(resolver.glob_map)
-                } else {
-                    None
-                },
-            },
         }),
         Err(x) => Err(x),
     }
@@ -805,7 +782,6 @@
     registry: Option<Registry>,
     crate_name: &str,
     addl_plugins: Option<Vec<String>>,
-    make_glob_map: MakeGlobMap,
     resolver_arenas: &'a ResolverArenas<'a>,
     crate_loader: &'a mut CrateLoader<'a>,
     after_expand: F,
@@ -937,7 +913,6 @@
         cstore,
         &krate,
         crate_name,
-        make_glob_map,
         crate_loader,
         &resolver_arenas,
     );
@@ -1070,15 +1045,6 @@
         )
     });
 
-    // Add all buffered lints from the `ParseSess` to the `Session`.
-    sess.parse_sess.buffered_lints.with_lock(|buffered_lints| {
-        info!("{} parse sess buffered_lints", buffered_lints.len());
-        for BufferedEarlyLint{id, span, msg, lint_id} in buffered_lints.drain(..) {
-            let lint = lint::Lint::from_parser_lint_id(lint_id);
-            sess.buffer_lint(lint, id, span, &msg);
-        }
-    });
-
     // Done with macro expansion!
 
     after_expand(&krate)?;
@@ -1114,6 +1080,15 @@
         );
     });
 
+    // Add all buffered lints from the `ParseSess` to the `Session`.
+    sess.parse_sess.buffered_lints.with_lock(|buffered_lints| {
+        info!("{} parse sess buffered_lints", buffered_lints.len());
+        for BufferedEarlyLint{id, span, msg, lint_id} in buffered_lints.drain(..) {
+            let lint = lint::Lint::from_parser_lint_id(lint_id);
+            sess.buffer_lint(lint, id, span, &msg);
+        }
+    });
+
     // Lower ast -> hir.
     // First, we need to collect the dep_graph.
     let dep_graph = match future_dep_graph {
@@ -1158,6 +1133,8 @@
 }
 
 pub fn default_provide(providers: &mut ty::query::Providers) {
+    proc_macro_decls::provide(providers);
+    plugin::build::provide(providers);
     hir::provide(providers);
     borrowck::provide(providers);
     mir::provide(providers);
@@ -1168,10 +1145,13 @@
     ty::provide(providers);
     traits::provide(providers);
     stability::provide(providers);
+    middle::intrinsicck::provide(providers);
+    middle::liveness::provide(providers);
     reachable::provide(providers);
     rustc_passes::provide(providers);
     rustc_traits::provide(providers);
     middle::region::provide(providers);
+    middle::entry::provide(providers);
     cstore::provide(providers);
     lint::provide(providers);
 }
@@ -1189,7 +1169,6 @@
     sess: &'tcx Session,
     cstore: &'tcx CStore,
     hir_map: hir_map::Map<'tcx>,
-    analysis: ty::CrateAnalysis,
     resolutions: Resolutions,
     arenas: &'tcx mut AllArenas<'tcx>,
     name: &str,
@@ -1199,7 +1178,6 @@
 where
     F: for<'a> FnOnce(
         TyCtxt<'a, 'tcx, 'tcx>,
-        ty::CrateAnalysis,
         mpsc::Receiver<Box<dyn Any + Send>>,
         CompileResult,
     ) -> R,
@@ -1208,17 +1186,6 @@
         rustc_incremental::load_query_result_cache(sess)
     });
 
-    time(sess, "looking for entry point", || {
-        middle::entry::find_entry_point(sess, &hir_map, name)
-    });
-
-    sess.plugin_registrar_fn
-        .set(time(sess, "looking for plugin registrar", || {
-            plugin::build::find_plugin_registrar(sess.diagnostic(), &hir_map)
-        }));
-    sess.proc_macro_decls_static
-        .set(proc_macro_decls::find(&hir_map));
-
     let mut local_providers = ty::query::Providers::default();
     default_provide(&mut local_providers);
     codegen_backend.provide(&mut local_providers);
@@ -1248,6 +1215,18 @@
             // tcx available.
             time(sess, "dep graph tcx init", || rustc_incremental::dep_graph_tcx_init(tcx));
 
+            time(sess, "looking for entry point", || {
+                middle::entry::find_entry_point(tcx)
+            });
+
+            time(sess, "looking for plugin registrar", || {
+                plugin::build::find_plugin_registrar(tcx)
+            });
+
+            time(sess, "looking for derive registrar", || {
+                proc_macro_decls::find(tcx)
+            });
+
             time(sess, "loop checking", || loops::check_crate(tcx));
 
             time(sess, "attribute checking", || {
@@ -1262,7 +1241,7 @@
             match typeck::check_crate(tcx) {
                 Ok(x) => x,
                 Err(x) => {
-                    f(tcx, analysis, rx, Err(x));
+                    f(tcx, rx, Err(x));
                     return Err(x);
                 }
             }
@@ -1315,7 +1294,7 @@
             // lint warnings and so on -- kindck used to do this abort, but
             // kindck is gone now). -nmatsakis
             if sess.err_count() > 0 {
-                return Ok(f(tcx, analysis, rx, sess.compile_status()));
+                return Ok(f(tcx, rx, sess.compile_status()));
             }
 
             time(sess, "death checking", || middle::dead::check_crate(tcx));
@@ -1326,7 +1305,7 @@
 
             time(sess, "lint checking", || lint::check_crate(tcx));
 
-            return Ok(f(tcx, analysis, rx, tcx.sess.compile_status()));
+            return Ok(f(tcx, rx, tcx.sess.compile_status()));
         },
     )
 }
@@ -1527,13 +1506,7 @@
                         }
                         None
                     }
-                    None => {
-                        session
-                            .struct_span_err(a.span, "`crate_type` requires a value")
-                            .note("for example: `#![crate_type=\"lib\"]`")
-                            .emit();
-                        None
-                    }
+                    None => None
                 }
             } else {
                 None
diff --git a/src/librustc_driver/lib.rs b/src/librustc_driver/lib.rs
index 889e1ec..c8a5bbe 100644
--- a/src/librustc_driver/lib.rs
+++ b/src/librustc_driver/lib.rs
@@ -57,7 +57,6 @@
 use driver::CompileController;
 use pretty::{PpMode, UserIdentifiedItem};
 
-use rustc_resolve as resolve;
 use rustc_save_analysis as save;
 use rustc_save_analysis::DumpHandler;
 use rustc_data_structures::sync::{self, Lrc, Ordering::SeqCst};
@@ -880,7 +879,6 @@
                     pretty::print_after_hir_lowering(state.session,
                                                      state.cstore.unwrap(),
                                                      state.hir_map.unwrap(),
-                                                     state.analysis.unwrap(),
                                                      state.resolutions.unwrap(),
                                                      state.input,
                                                      &state.expanded_crate.take().unwrap(),
@@ -941,7 +939,6 @@
         time(state.session, "save analysis", || {
             save::process_crate(state.tcx.unwrap(),
                                 state.expanded_crate.unwrap(),
-                                state.analysis.unwrap(),
                                 state.crate_name.unwrap(),
                                 state.input,
                                 None,
@@ -950,7 +947,6 @@
         });
     };
     control.after_analysis.run_callback_on_error = true;
-    control.make_glob_map = resolve::MakeGlobMap::Yes;
 }
 
 impl RustcDefaultCalls {
diff --git a/src/librustc_driver/pretty.rs b/src/librustc_driver/pretty.rs
index a9ec993..d980c5a 100644
--- a/src/librustc_driver/pretty.rs
+++ b/src/librustc_driver/pretty.rs
@@ -123,7 +123,8 @@
                 sess.fatal(&format!("argument to `unpretty` must be one of `normal`, \
                                      `expanded`, `flowgraph[,unlabelled]=<nodeid>`, \
                                      `identified`, `expanded,identified`, `everybody_loops`, \
-                                     `hir`, `hir,identified`, `hir,typed`, or `mir`; got {}",
+                                     `hir`, `hir,identified`, `hir,typed`, `hir-tree`, \
+                                     `mir` or `mir-cfg`; got {}",
                                     name));
             } else {
                 sess.fatal(&format!("argument to `pretty` must be one of `normal`, `expanded`, \
@@ -190,7 +191,6 @@
         sess: &'tcx Session,
         cstore: &'tcx CStore,
         hir_map: &hir_map::Map<'tcx>,
-        analysis: &ty::CrateAnalysis,
         resolutions: &Resolutions,
         output_filenames: &OutputFilenames,
         id: &str,
@@ -223,12 +223,11 @@
                                                                  sess,
                                                                  cstore,
                                                                  hir_map.clone(),
-                                                                 analysis.clone(),
                                                                  resolutions.clone(),
                                                                  &mut arenas,
                                                                  id,
                                                                  output_filenames,
-                                                                 |tcx, _, _, _| {
+                                                                 |tcx, _, _| {
                     let empty_tables = ty::TypeckTables::empty(None);
                     let annotation = TypedAnnotation {
                         tcx,
@@ -959,7 +958,6 @@
 pub fn print_after_hir_lowering<'tcx, 'a: 'tcx>(sess: &'a Session,
                                                 cstore: &'tcx CStore,
                                                 hir_map: &hir_map::Map<'tcx>,
-                                                analysis: &ty::CrateAnalysis,
                                                 resolutions: &Resolutions,
                                                 input: &Input,
                                                 krate: &ast::Crate,
@@ -972,7 +970,6 @@
         print_with_analysis(sess,
                             cstore,
                             hir_map,
-                            analysis,
                             resolutions,
                             crate_name,
                             output_filenames,
@@ -1010,7 +1007,6 @@
                 s.call_with_pp_support_hir(sess,
                                            cstore,
                                            hir_map,
-                                           analysis,
                                            resolutions,
                                            output_filenames,
                                            crate_name,
@@ -1033,7 +1029,6 @@
                 s.call_with_pp_support_hir(sess,
                                            cstore,
                                            hir_map,
-                                           analysis,
                                            resolutions,
                                            output_filenames,
                                            crate_name,
@@ -1048,7 +1043,6 @@
                 s.call_with_pp_support_hir(sess,
                                            cstore,
                                            hir_map,
-                                           analysis,
                                            resolutions,
                                            output_filenames,
                                            crate_name,
@@ -1081,7 +1075,6 @@
                 s.call_with_pp_support_hir(sess,
                                            cstore,
                                            hir_map,
-                                           analysis,
                                            resolutions,
                                            output_filenames,
                                            crate_name,
@@ -1103,13 +1096,12 @@
 }
 
 // In an ideal world, this would be a public function called by the driver after
-// analsysis is performed. However, we want to call `phase_3_run_analysis_passes`
+// analysis is performed. However, we want to call `phase_3_run_analysis_passes`
 // with a different callback than the standard driver, so that isn't easy.
 // Instead, we call that function ourselves.
 fn print_with_analysis<'tcx, 'a: 'tcx>(sess: &'a Session,
                                        cstore: &'a CStore,
                                        hir_map: &hir_map::Map<'tcx>,
-                                       analysis: &ty::CrateAnalysis,
                                        resolutions: &Resolutions,
                                        crate_name: &str,
                                        output_filenames: &OutputFilenames,
@@ -1134,12 +1126,11 @@
                                                      sess,
                                                      cstore,
                                                      hir_map.clone(),
-                                                     analysis.clone(),
                                                      resolutions.clone(),
                                                      &mut arenas,
                                                      crate_name,
                                                      output_filenames,
-                                                     |tcx, _, _, _| {
+                                                     |tcx, _, _| {
         match ppm {
             PpmMir | PpmMirCFG => {
                 if let Some(nodeid) = nodeid {
diff --git a/src/librustc_driver/proc_macro_decls.rs b/src/librustc_driver/proc_macro_decls.rs
index bb2ea6c..093d15b 100644
--- a/src/librustc_driver/proc_macro_decls.rs
+++ b/src/librustc_driver/proc_macro_decls.rs
@@ -1,15 +1,25 @@
 use rustc::hir::itemlikevisit::ItemLikeVisitor;
-use rustc::hir::map::Map;
+use rustc::hir::def_id::{CrateNum, DefId, LOCAL_CRATE};
 use rustc::hir;
+use rustc::ty::TyCtxt;
+use rustc::ty::query::Providers;
 use syntax::ast;
 use syntax::attr;
 
-pub fn find(hir_map: &Map) -> Option<ast::NodeId> {
-    let krate = hir_map.krate();
+pub fn find<'tcx>(tcx: TyCtxt<'_, 'tcx, 'tcx>) -> Option<DefId> {
+    tcx.proc_macro_decls_static(LOCAL_CRATE)
+}
+
+fn proc_macro_decls_static<'tcx>(
+    tcx: TyCtxt<'_, 'tcx, 'tcx>,
+    cnum: CrateNum,
+) -> Option<DefId> {
+    assert_eq!(cnum, LOCAL_CRATE);
 
     let mut finder = Finder { decls: None };
-    krate.visit_all_item_likes(&mut finder);
-    finder.decls
+    tcx.hir().krate().visit_all_item_likes(&mut finder);
+
+    finder.decls.map(|id| tcx.hir().local_def_id(id))
 }
 
 struct Finder {
@@ -30,3 +40,9 @@
     }
 }
 
+pub(crate) fn provide(providers: &mut Providers<'_>) {
+    *providers = Providers {
+        proc_macro_decls_static,
+        ..*providers
+    };
+}
diff --git a/src/librustc_driver/test.rs b/src/librustc_driver/test.rs
index 9c027f1..afcf086 100644
--- a/src/librustc_driver/test.rs
+++ b/src/librustc_driver/test.rs
@@ -18,7 +18,6 @@
 use rustc_data_structures::sync::{self, Lrc};
 use rustc_lint;
 use rustc_metadata::cstore::CStore;
-use rustc_resolve::MakeGlobMap;
 use rustc_target::spec::abi::Abi;
 use syntax;
 use syntax::ast;
@@ -134,7 +133,6 @@
             None,
             "test",
             None,
-            MakeGlobMap::No,
             |_| Ok(()),
         ).expect("phase 2 aborted")
     };
diff --git a/src/librustc_errors/diagnostic_builder.rs b/src/librustc_errors/diagnostic_builder.rs
index 7449b2b..736cca6 100644
--- a/src/librustc_errors/diagnostic_builder.rs
+++ b/src/librustc_errors/diagnostic_builder.rs
@@ -33,7 +33,11 @@
 /// it easy to declare such methods on the builder.
 macro_rules! forward {
     // Forward pattern for &self -> &Self
-    (pub fn $n:ident(&self, $($name:ident: $ty:ty),* $(,)*) -> &Self) => {
+    (
+        $(#[$attrs:meta])*
+        pub fn $n:ident(&self, $($name:ident: $ty:ty),* $(,)*) -> &Self
+    ) => {
+        $(#[$attrs])*
         pub fn $n(&self, $($name: $ty),*) -> &Self {
             #[allow(deprecated)]
             self.diagnostic.$n($($name),*);
@@ -42,7 +46,11 @@
     };
 
     // Forward pattern for &mut self -> &mut Self
-    (pub fn $n:ident(&mut self, $($name:ident: $ty:ty),* $(,)*) -> &mut Self) => {
+    (
+        $(#[$attrs:meta])*
+        pub fn $n:ident(&mut self, $($name:ident: $ty:ty),* $(,)*) -> &mut Self
+    ) => {
+        $(#[$attrs])*
         pub fn $n(&mut self, $($name: $ty),*) -> &mut Self {
             #[allow(deprecated)]
             self.diagnostic.$n($($name),*);
@@ -52,10 +60,15 @@
 
     // Forward pattern for &mut self -> &mut Self, with S: Into<MultiSpan>
     // type parameter. No obvious way to make this more generic.
-    (pub fn $n:ident<S: Into<MultiSpan>>(
-                    &mut self,
-                    $($name:ident: $ty:ty),*
-                    $(,)*) -> &mut Self) => {
+    (
+        $(#[$attrs:meta])*
+        pub fn $n:ident<S: Into<MultiSpan>>(
+            &mut self,
+            $($name:ident: $ty:ty),*
+            $(,)*
+        ) -> &mut Self
+    ) => {
+        $(#[$attrs])*
         pub fn $n<S: Into<MultiSpan>>(&mut self, $($name: $ty),*) -> &mut Self {
             #[allow(deprecated)]
             self.diagnostic.$n($($name),*);
@@ -177,34 +190,43 @@
                                                   msg: &str,
                                                   ) -> &mut Self);
 
-    #[deprecated(note = "Use `span_suggestion_short_with_applicability`")]
-    forward!(pub fn span_suggestion_short(
-                                      &mut self,
-                                      sp: Span,
-                                      msg: &str,
-                                      suggestion: String,
-                                      ) -> &mut Self);
+    forward!(
+        #[deprecated(note = "Use `span_suggestion_short_with_applicability`")]
+        pub fn span_suggestion_short(
+            &mut self,
+            sp: Span,
+            msg: &str,
+            suggestion: String,
+        ) -> &mut Self
+    );
 
-    #[deprecated(note = "Use `multipart_suggestion_with_applicability`")]
-    forward!(pub fn multipart_suggestion(
-        &mut self,
-        msg: &str,
-        suggestion: Vec<(Span, String)>,
-    ) -> &mut Self);
+    forward!(
+        #[deprecated(note = "Use `multipart_suggestion_with_applicability`")]
+        pub fn multipart_suggestion(
+            &mut self,
+            msg: &str,
+            suggestion: Vec<(Span, String)>,
+        ) -> &mut Self
+    );
 
-    #[deprecated(note = "Use `span_suggestion_with_applicability`")]
-    forward!(pub fn span_suggestion(&mut self,
-                                    sp: Span,
-                                    msg: &str,
-                                    suggestion: String,
-                                    ) -> &mut Self);
+    forward!(
+        #[deprecated(note = "Use `span_suggestion_with_applicability`")]
+        pub fn span_suggestion(
+            &mut self,
+            sp: Span,
+            msg: &str,
+            suggestion: String,
+        ) -> &mut Self
+    );
 
-    #[deprecated(note = "Use `span_suggestions_with_applicability`")]
-    forward!(pub fn span_suggestions(&mut self,
-                                     sp: Span,
-                                     msg: &str,
-                                     suggestions: Vec<String>,
-                                     ) -> &mut Self);
+    forward!(
+        #[deprecated(note = "Use `span_suggestions_with_applicability`")]
+        pub fn span_suggestions(&mut self,
+            sp: Span,
+            msg: &str,
+            suggestions: Vec<String>,
+        ) -> &mut Self
+    );
 
     pub fn multipart_suggestion_with_applicability(&mut self,
                                               msg: &str,
diff --git a/src/librustc_errors/lib.rs b/src/librustc_errors/lib.rs
index a074441..3e25f98 100644
--- a/src/librustc_errors/lib.rs
+++ b/src/librustc_errors/lib.rs
@@ -135,10 +135,11 @@
             if let Some(line) = line_opt {
                 if let Some(lo) = line.char_indices().map(|(i, _)| i).nth(lo) {
                     let hi_opt = hi_opt.and_then(|hi| line.char_indices().map(|(i, _)| i).nth(hi));
-                    buf.push_str(match hi_opt {
-                        Some(hi) => &line[lo..hi],
-                        None => &line[lo..],
-                    });
+                    match hi_opt {
+                        Some(hi) if hi > lo => buf.push_str(&line[lo..hi]),
+                        Some(_) => (),
+                        None => buf.push_str(&line[lo..]),
+                    }
                 }
                 if let None = hi_opt {
                     buf.push('\n');
diff --git a/src/librustc_lint/builtin.rs b/src/librustc_lint/builtin.rs
index 5678f30..f6c381f 100644
--- a/src/librustc_lint/builtin.rs
+++ b/src/librustc_lint/builtin.rs
@@ -19,7 +19,7 @@
 //! a `pub fn new()`.
 
 use rustc::hir::def::Def;
-use rustc::hir::def_id::DefId;
+use rustc::hir::def_id::{DefId, LOCAL_CRATE};
 use rustc::ty::{self, Ty};
 use hir::Node;
 use util::nodemap::NodeSet;
@@ -35,14 +35,15 @@
 use syntax::attr;
 use syntax::source_map::Spanned;
 use syntax::edition::Edition;
-use syntax::feature_gate::{AttributeGate, AttributeType, Stability, deprecated_attributes};
+use syntax::feature_gate::{AttributeGate, AttributeTemplate, AttributeType};
+use syntax::feature_gate::{Stability, deprecated_attributes};
 use syntax_pos::{BytePos, Span, SyntaxContext};
 use syntax::symbol::keywords;
 use syntax::errors::{Applicability, DiagnosticBuilder};
 use syntax::print::pprust::expr_to_string;
+use syntax::visit::FnKind;
 
 use rustc::hir::{self, GenericParamKind, PatKind};
-use rustc::hir::intravisit::FnKind;
 
 use nonstandard_style::{MethodLateContext, method_context};
 
@@ -216,7 +217,7 @@
 }
 
 impl UnsafeCode {
-    fn report_unsafe(&self, cx: &LateContext, span: Span, desc: &'static str) {
+    fn report_unsafe(&self, cx: &EarlyContext, span: Span, desc: &'static str) {
         // This comes from a macro that has #[allow_internal_unsafe].
         if span.allows_unsafe() {
             return;
@@ -226,23 +227,31 @@
     }
 }
 
-impl<'a, 'tcx> LateLintPass<'a, 'tcx> for UnsafeCode {
-    fn check_expr(&mut self, cx: &LateContext, e: &hir::Expr) {
-        if let hir::ExprKind::Block(ref blk, _) = e.node {
+impl EarlyLintPass for UnsafeCode {
+    fn check_attribute(&mut self, cx: &EarlyContext, attr: &ast::Attribute) {
+        if attr.check_name("allow_internal_unsafe") {
+            self.report_unsafe(cx, attr.span, "`allow_internal_unsafe` allows defining \
+                                               macros using unsafe without triggering \
+                                               the `unsafe_code` lint at their call site");
+        }
+    }
+
+    fn check_expr(&mut self, cx: &EarlyContext, e: &ast::Expr) {
+        if let ast::ExprKind::Block(ref blk, _) = e.node {
             // Don't warn about generated blocks, that'll just pollute the output.
-            if blk.rules == hir::UnsafeBlock(hir::UserProvided) {
+            if blk.rules == ast::BlockCheckMode::Unsafe(ast::UserProvided) {
                 self.report_unsafe(cx, blk.span, "usage of an `unsafe` block");
             }
         }
     }
 
-    fn check_item(&mut self, cx: &LateContext, it: &hir::Item) {
+    fn check_item(&mut self, cx: &EarlyContext, it: &ast::Item) {
         match it.node {
-            hir::ItemKind::Trait(_, hir::Unsafety::Unsafe, ..) => {
+            ast::ItemKind::Trait(_, ast::Unsafety::Unsafe, ..) => {
                 self.report_unsafe(cx, it.span, "declaration of an `unsafe` trait")
             }
 
-            hir::ItemKind::Impl(hir::Unsafety::Unsafe, ..) => {
+            ast::ItemKind::Impl(ast::Unsafety::Unsafe, ..) => {
                 self.report_unsafe(cx, it.span, "implementation of an `unsafe` trait")
             }
 
@@ -251,19 +260,18 @@
     }
 
     fn check_fn(&mut self,
-                cx: &LateContext,
-                fk: FnKind<'tcx>,
-                _: &hir::FnDecl,
-                _: &hir::Body,
+                cx: &EarlyContext,
+                fk: FnKind,
+                _: &ast::FnDecl,
                 span: Span,
                 _: ast::NodeId) {
         match fk {
-            FnKind::ItemFn(_, _, hir::FnHeader { unsafety: hir::Unsafety::Unsafe, .. }, ..) => {
+            FnKind::ItemFn(_, ast::FnHeader { unsafety: ast::Unsafety::Unsafe, .. }, ..) => {
                 self.report_unsafe(cx, span, "declaration of an `unsafe` function")
             }
 
             FnKind::Method(_, sig, ..) => {
-                if sig.header.unsafety == hir::Unsafety::Unsafe {
+                if sig.header.unsafety == ast::Unsafety::Unsafe {
                     self.report_unsafe(cx, span, "implementation of an `unsafe` method")
                 }
             }
@@ -272,9 +280,9 @@
         }
     }
 
-    fn check_trait_item(&mut self, cx: &LateContext, item: &hir::TraitItem) {
-        if let hir::TraitItemKind::Method(ref sig, hir::TraitMethod::Required(_)) = item.node {
-            if sig.header.unsafety == hir::Unsafety::Unsafe {
+    fn check_trait_item(&mut self, cx: &EarlyContext, item: &ast::TraitItem) {
+        if let ast::TraitItemKind::Method(ref sig, None) = item.node {
+            if sig.header.unsafety == ast::Unsafety::Unsafe {
                 self.report_unsafe(cx, item.span, "declaration of an `unsafe` method")
             }
         }
@@ -682,86 +690,12 @@
     }
 }
 
-/// Checks for incorrect use of `repr` attributes.
-#[derive(Clone)]
-pub struct BadRepr;
-
-impl LintPass for BadRepr {
-    fn get_lints(&self) -> LintArray {
-        lint_array!()
-    }
-}
-
-impl EarlyLintPass for BadRepr {
-    fn check_attribute(&mut self, cx: &EarlyContext, attr: &ast::Attribute) {
-        if attr.name() == "repr" {
-            let list = attr.meta_item_list();
-
-            let repr_str = |lit: &str| { format!("#[repr({})]", lit) };
-
-            // Emit warnings with `repr` either has a literal assignment (`#[repr = "C"]`) or
-            // no hints (``#[repr]`)
-            let has_hints = list.as_ref().map(|ref list| !list.is_empty()).unwrap_or(false);
-            if !has_hints {
-                let mut suggested = false;
-                let mut warn = if let Some(ref lit) = attr.value_str() {
-                    // avoid warning about empty `repr` on `#[repr = "foo"]`
-                    let mut warn = cx.struct_span_lint(
-                        BAD_REPR,
-                        attr.span,
-                        "`repr` attribute isn't configurable with a literal",
-                    );
-                    match lit.to_string().as_ref() {
-                        | "C" | "packed" | "rust" | "transparent"
-                        | "u8" | "u16" | "u32" | "u64" | "u128" | "usize"
-                        | "i8" | "i16" | "i32" | "i64" | "i128" | "isize" => {
-                            // if the literal could have been a valid `repr` arg,
-                            // suggest the correct syntax
-                            warn.span_suggestion_with_applicability(
-                                attr.span,
-                                "give `repr` a hint",
-                                repr_str(&lit.as_str()),
-                                Applicability::MachineApplicable
-                            );
-                            suggested = true;
-                        }
-                        _ => {  // the literal wasn't a valid `repr` arg
-                            warn.span_label(attr.span, "needs a hint");
-                        }
-                    };
-                    warn
-                } else {
-                    let mut warn = cx.struct_span_lint(
-                        BAD_REPR,
-                        attr.span,
-                        "`repr` attribute must have a hint",
-                    );
-                    warn.span_label(attr.span, "needs a hint");
-                    warn
-                };
-                if !suggested {
-                    warn.help(&format!(
-                        "valid hints include `{}`, `{}`, `{}` and `{}`",
-                        repr_str("C"),
-                        repr_str("packed"),
-                        repr_str("rust"),
-                        repr_str("transparent"),
-                    ));
-                    warn.note("for more information, visit \
-                               <https://doc.rust-lang.org/reference/type-layout.html>");
-                }
-                warn.emit();
-            }
-        }
-    }
-}
-
 /// Checks for use of attributes which have been deprecated.
 #[derive(Clone)]
 pub struct DeprecatedAttr {
     // This is not free to compute, so we want to keep it around, rather than
     // compute it for every attribute.
-    depr_attrs: Vec<&'static (&'static str, AttributeType, AttributeGate)>,
+    depr_attrs: Vec<&'static (&'static str, AttributeType, AttributeTemplate, AttributeGate)>,
 }
 
 impl DeprecatedAttr {
@@ -780,7 +714,7 @@
 
 impl EarlyLintPass for DeprecatedAttr {
     fn check_attribute(&mut self, cx: &EarlyContext, attr: &ast::Attribute) {
-        for &&(n, _, ref g) in &self.depr_attrs {
+        for &&(n, _, _, ref g) in &self.depr_attrs {
             if attr.name() == n {
                 if let &AttributeGate::Gated(Stability::Deprecated(link, suggestion),
                                              ref name,
@@ -860,7 +794,7 @@
 
 impl<'a, 'tcx> LateLintPass<'a, 'tcx> for PluginAsLibrary {
     fn check_item(&mut self, cx: &LateContext, it: &hir::Item) {
-        if cx.sess().plugin_registrar_fn.get().is_some() {
+        if cx.tcx.plugin_registrar_fn(LOCAL_CRATE).is_some() {
             // We're compiling a plugin; it's fine to link other plugins.
             return;
         }
@@ -1540,7 +1474,7 @@
                     _ => {},
                 }
                 TokenTree::Delimited(_, _, tts) => {
-                    self.check_tokens(cx, tts.stream())
+                    self.check_tokens(cx, tts)
                 },
             }
         }
diff --git a/src/librustc_lint/lib.rs b/src/librustc_lint/lib.rs
index 4dfb664..71c859d 100644
--- a/src/librustc_lint/lib.rs
+++ b/src/librustc_lint/lib.rs
@@ -48,7 +48,8 @@
     INTRA_DOC_LINK_RESOLUTION_FAILURE,
     MISSING_DOC_CODE_EXAMPLES,
     PRIVATE_DOC_TESTS,
-    parser::QUESTION_MARK_MACRO_SEP
+    parser::QUESTION_MARK_MACRO_SEP,
+    parser::ILL_FORMED_ATTRIBUTE_INPUT,
 };
 use rustc::session;
 use rustc::util;
@@ -111,9 +112,9 @@
     add_early_builtin!(sess,
                        UnusedParens,
                        UnusedImportBraces,
+                       UnsafeCode,
                        AnonymousParameters,
                        UnusedDocComment,
-                       BadRepr,
                        EllipsisInclusiveRangePatterns,
                        NonCamelCaseTypes,
                        );
@@ -134,7 +135,6 @@
         NonSnakeCase: NonSnakeCase,
         NonUpperCaseGlobals: NonUpperCaseGlobals,
         NonShorthandFieldPatterns: NonShorthandFieldPatterns,
-        UnsafeCode: UnsafeCode,
         UnusedAllocation: UnusedAllocation,
         MissingCopyImplementations: MissingCopyImplementations,
         UnstableFeatures: UnstableFeatures,
@@ -336,6 +336,16 @@
             reference: "issue #52234 <https://github.com/rust-lang/rust/issues/52234>",
             edition: None,
         },
+        FutureIncompatibleInfo {
+            id: LintId::of(ILL_FORMED_ATTRIBUTE_INPUT),
+            reference: "issue #57571 <https://github.com/rust-lang/rust/issues/57571>",
+            edition: None,
+        },
+        FutureIncompatibleInfo {
+            id: LintId::of(AMBIGUOUS_ASSOCIATED_ITEMS),
+            reference: "issue #57644 <https://github.com/rust-lang/rust/issues/57644>",
+            edition: None,
+        },
         ]);
 
     // Register renamed and removed lints.
@@ -385,4 +395,6 @@
         "no longer a warning, #[no_mangle] functions always exported");
     store.register_removed("private_no_mangle_statics",
         "no longer a warning, #[no_mangle] statics always exported");
+    store.register_removed("bad_repr",
+        "replaced with a generic attribute input check");
 }
diff --git a/src/librustc_lint/unused.rs b/src/librustc_lint/unused.rs
index 205f894..8a68f1b 100644
--- a/src/librustc_lint/unused.rs
+++ b/src/librustc_lint/unused.rs
@@ -41,7 +41,7 @@
 impl<'a, 'tcx> LateLintPass<'a, 'tcx> for UnusedResults {
     fn check_stmt(&mut self, cx: &LateContext, s: &hir::Stmt) {
         let expr = match s.node {
-            hir::StmtKind::Semi(ref expr, _) => &**expr,
+            hir::StmtKind::Semi(ref expr) => &**expr,
             _ => return,
         };
 
@@ -205,7 +205,7 @@
 
 impl<'a, 'tcx> LateLintPass<'a, 'tcx> for PathStatements {
     fn check_stmt(&mut self, cx: &LateContext, s: &hir::Stmt) {
-        if let hir::StmtKind::Semi(ref expr, _) = s.node {
+        if let hir::StmtKind::Semi(ref expr) = s.node {
             if let hir::ExprKind::Path(_) = expr.node {
                 cx.span_lint(PATH_STATEMENTS, s.span, "path statement with no effect");
             }
@@ -232,7 +232,7 @@
     fn check_attribute(&mut self, cx: &LateContext, attr: &ast::Attribute) {
         debug!("checking attribute: {:?}", attr);
         // Note that check_name() marks the attribute as used if it matches.
-        for &(ref name, ty, _) in BUILTIN_ATTRIBUTES {
+        for &(name, ty, ..) in BUILTIN_ATTRIBUTES {
             match ty {
                 AttributeType::Whitelisted if attr.check_name(name) => {
                     debug!("{:?} is Whitelisted", name);
@@ -256,7 +256,7 @@
             cx.span_lint(UNUSED_ATTRIBUTES, attr.span, "unused attribute");
             // Is it a builtin attribute that must be used at the crate level?
             let known_crate = BUILTIN_ATTRIBUTES.iter()
-                .find(|&&(builtin, ty, _)| name == builtin && ty == AttributeType::CrateLevel)
+                .find(|&&(builtin, ty, ..)| name == builtin && ty == AttributeType::CrateLevel)
                 .is_some();
 
             // Has a plugin registered this attribute as one that must be used at
diff --git a/src/librustc_metadata/decoder.rs b/src/librustc_metadata/decoder.rs
index dc8db5b..1f07e8f 100644
--- a/src/librustc_metadata/decoder.rs
+++ b/src/librustc_metadata/decoder.rs
@@ -418,6 +418,7 @@
             EntryKind::Mod(_) => Def::Mod(did),
             EntryKind::Variant(_) => Def::Variant(did),
             EntryKind::Trait(_) => Def::Trait(did),
+            EntryKind::TraitAlias(_) => Def::TraitAlias(did),
             EntryKind::Enum(..) => Def::Enum(did),
             EntryKind::MacroDef(_) => Def::Macro(did, MacroKind::Bang),
             EntryKind::ForeignType => Def::ForeignTy(did),
@@ -520,17 +521,26 @@
     }
 
     pub fn get_trait_def(&self, item_id: DefIndex, sess: &Session) -> ty::TraitDef {
-        let data = match self.entry(item_id).kind {
-            EntryKind::Trait(data) => data.decode((self, sess)),
-            _ => bug!(),
-        };
-
-        ty::TraitDef::new(self.local_def_id(item_id),
-                          data.unsafety,
-                          data.paren_sugar,
-                          data.has_auto_impl,
-                          data.is_marker,
-                          self.def_path_table.def_path_hash(item_id))
+        match self.entry(item_id).kind {
+            EntryKind::Trait(data) => {
+                let data = data.decode((self, sess));
+                ty::TraitDef::new(self.local_def_id(item_id),
+                                  data.unsafety,
+                                  data.paren_sugar,
+                                  data.has_auto_impl,
+                                  data.is_marker,
+                                  self.def_path_table.def_path_hash(item_id))
+            },
+            EntryKind::TraitAlias(_) => {
+                ty::TraitDef::new(self.local_def_id(item_id),
+                                  hir::Unsafety::Normal,
+                                  false,
+                                  false,
+                                  false,
+                                  self.def_path_table.def_path_hash(item_id))
+            },
+            _ => bug!("def-index does not refer to trait or trait alias"),
+        }
     }
 
     fn get_variant(&self,
@@ -615,10 +625,13 @@
                                 item_id: DefIndex,
                                 tcx: TyCtxt<'a, 'tcx, 'tcx>)
                                 -> ty::GenericPredicates<'tcx> {
-        match self.entry(item_id).kind {
-            EntryKind::Trait(data) => data.decode(self).super_predicates.decode((self, tcx)),
-            _ => bug!(),
-        }
+        let super_predicates = match self.entry(item_id).kind {
+            EntryKind::Trait(data) => data.decode(self).super_predicates,
+            EntryKind::TraitAlias(data) => data.decode(self).super_predicates,
+            _ => bug!("def-index does not refer to trait or trait alias"),
+        };
+
+        super_predicates.decode((self, tcx))
     }
 
     pub fn get_generics(&self,
@@ -1014,7 +1027,8 @@
         }
         def_key.parent.and_then(|parent_index| {
             match self.entry(parent_index).kind {
-                EntryKind::Trait(_) => Some(self.local_def_id(parent_index)),
+                EntryKind::Trait(_) |
+                EntryKind::TraitAlias(_) => Some(self.local_def_id(parent_index)),
                 _ => None,
             }
         })
diff --git a/src/librustc_metadata/encoder.rs b/src/librustc_metadata/encoder.rs
index 032a465..afb0218 100644
--- a/src/librustc_metadata/encoder.rs
+++ b/src/librustc_metadata/encoder.rs
@@ -482,13 +482,10 @@
             has_global_allocator: has_global_allocator,
             has_panic_handler: has_panic_handler,
             has_default_lib_allocator: has_default_lib_allocator,
-            plugin_registrar_fn: tcx.sess
-                .plugin_registrar_fn
-                .get()
-                .map(|id| tcx.hir().local_def_id(id).index),
+            plugin_registrar_fn: tcx.plugin_registrar_fn(LOCAL_CRATE).map(|id| id.index),
             proc_macro_decls_static: if is_proc_macro {
-                let id = tcx.sess.proc_macro_decls_static.get().unwrap();
-                Some(tcx.hir().local_def_id(id).index)
+                let id = tcx.proc_macro_decls_static(LOCAL_CRATE).unwrap();
+                Some(id.index)
             } else {
                 None
             },
@@ -1131,8 +1128,7 @@
 
                 EntryKind::Impl(self.lazy(&data))
             }
-            hir::ItemKind::Trait(..) |
-            hir::ItemKind::TraitAlias(..) => {
+            hir::ItemKind::Trait(..) => {
                 let trait_def = tcx.trait_def(def_id);
                 let data = TraitData {
                     unsafety: trait_def.unsafety,
@@ -1144,6 +1140,13 @@
 
                 EntryKind::Trait(self.lazy(&data))
             }
+            hir::ItemKind::TraitAlias(..) => {
+                let data = TraitAliasData {
+                    super_predicates: self.lazy(&tcx.super_predicates_of(def_id)),
+                };
+
+                EntryKind::TraitAlias(self.lazy(&data))
+            }
             hir::ItemKind::ExternCrate(_) |
             hir::ItemKind::Use(..) => bug!("cannot encode info for item {:?}", item),
         };
@@ -1217,6 +1220,7 @@
                 hir::ItemKind::Impl(..) |
                 hir::ItemKind::Existential(..) |
                 hir::ItemKind::Trait(..) => Some(self.encode_generics(def_id)),
+                hir::ItemKind::TraitAlias(..) => Some(self.encode_generics(def_id)),
                 _ => None,
             },
             predicates: match item.node {
@@ -1229,7 +1233,8 @@
                 hir::ItemKind::Union(..) |
                 hir::ItemKind::Impl(..) |
                 hir::ItemKind::Existential(..) |
-                hir::ItemKind::Trait(..) => Some(self.encode_predicates(def_id)),
+                hir::ItemKind::Trait(..) |
+                hir::ItemKind::TraitAlias(..) => Some(self.encode_predicates(def_id)),
                 _ => None,
             },
 
@@ -1239,7 +1244,8 @@
             // hack. (No reason not to expand it in the future if
             // necessary.)
             predicates_defined_on: match item.node {
-                hir::ItemKind::Trait(..) => Some(self.encode_predicates_defined_on(def_id)),
+                hir::ItemKind::Trait(..) |
+                hir::ItemKind::TraitAlias(..) => Some(self.encode_predicates_defined_on(def_id)),
                 _ => None, // not *wrong* for other kinds of items, but not needed
             },
 
diff --git a/src/librustc_metadata/native_libs.rs b/src/librustc_metadata/native_libs.rs
index d35d649..1f00086 100644
--- a/src/librustc_metadata/native_libs.rs
+++ b/src/librustc_metadata/native_libs.rs
@@ -163,7 +163,7 @@
            !self.tcx.features().static_nobundle {
             feature_gate::emit_feature_err(&self.tcx.sess.parse_sess,
                                            "static_nobundle",
-                                           span.unwrap(),
+                                           span.unwrap_or_else(|| syntax_pos::DUMMY_SP),
                                            GateIssue::Language,
                                            "kind=\"static-nobundle\" is feature gated");
         }
diff --git a/src/librustc_metadata/schema.rs b/src/librustc_metadata/schema.rs
index 25f499b..f3ff974 100644
--- a/src/librustc_metadata/schema.rs
+++ b/src/librustc_metadata/schema.rs
@@ -316,6 +316,7 @@
     AssociatedType(AssociatedContainer),
     AssociatedExistential(AssociatedContainer),
     AssociatedConst(AssociatedContainer, ConstQualif, Lazy<RenderedConst>),
+    TraitAlias(Lazy<TraitAliasData<'tcx>>),
 }
 
 impl<'a, 'gcx> HashStable<StableHashingContext<'a>> for EntryKind<'gcx> {
@@ -370,6 +371,9 @@
             EntryKind::Trait(ref trait_data) => {
                 trait_data.hash_stable(hcx, hasher);
             }
+            EntryKind::TraitAlias(ref trait_alias_data) => {
+                trait_alias_data.hash_stable(hcx, hasher);
+            }
             EntryKind::Impl(ref impl_data) => {
                 impl_data.hash_stable(hcx, hasher);
             }
@@ -475,6 +479,15 @@
 });
 
 #[derive(RustcEncodable, RustcDecodable)]
+pub struct TraitAliasData<'tcx> {
+    pub super_predicates: Lazy<ty::GenericPredicates<'tcx>>,
+}
+
+impl_stable_hash_for!(struct TraitAliasData<'tcx> {
+    super_predicates
+});
+
+#[derive(RustcEncodable, RustcDecodable)]
 pub struct ImplData<'tcx> {
     pub polarity: hir::ImplPolarity,
     pub defaultness: hir::Defaultness,
diff --git a/src/librustc_mir/borrow_check/nll/region_infer/error_reporting/mod.rs b/src/librustc_mir/borrow_check/nll/region_infer/error_reporting/mod.rs
index 77c8a89..2a858bd 100644
--- a/src/librustc_mir/borrow_check/nll/region_infer/error_reporting/mod.rs
+++ b/src/librustc_mir/borrow_check/nll/region_infer/error_reporting/mod.rs
@@ -505,7 +505,7 @@
     ) {
         let mut diag = infcx.tcx.sess.struct_span_err(
             span,
-            "unsatisfied lifetime constraints", // FIXME
+            "lifetime may not live long enough"
         );
 
         let counter = &mut 1;
diff --git a/src/librustc_mir/build/mod.rs b/src/librustc_mir/build/mod.rs
index 65ae111..2bf2824 100644
--- a/src/librustc_mir/build/mod.rs
+++ b/src/librustc_mir/build/mod.rs
@@ -910,6 +910,13 @@
             let place = Place::Local(local);
             let &ArgInfo(ty, opt_ty_info, pattern, ref self_binding) = arg_info;
 
+            // Make sure we drop (parts of) the argument even when not matched on.
+            self.schedule_drop(
+                pattern.as_ref().map_or(ast_body.span, |pat| pat.span),
+                argument_scope, &place, ty,
+                DropKind::Value { cached_block: CachedBlock::default() },
+            );
+
             if let Some(pattern) = pattern {
                 let pattern = self.hir.pattern_from_hir(pattern);
                 let span = pattern.span;
@@ -941,13 +948,6 @@
                     }
                 }
             }
-
-            // Make sure we drop (parts of) the argument even when not matched on.
-            self.schedule_drop(
-                pattern.as_ref().map_or(ast_body.span, |pat| pat.span),
-                argument_scope, &place, ty,
-                DropKind::Value { cached_block: CachedBlock::default() },
-            );
         }
 
         // Enter the argument pattern bindings source scope, if it exists.
diff --git a/src/librustc_mir/hair/cx/block.rs b/src/librustc_mir/hair/cx/block.rs
index ea8b282..c50d9dd 100644
--- a/src/librustc_mir/hair/cx/block.rs
+++ b/src/librustc_mir/hair/cx/block.rs
@@ -46,12 +46,12 @@
                                 -> Vec<StmtRef<'tcx>> {
     let mut result = vec![];
     for (index, stmt) in stmts.iter().enumerate() {
-        let hir_id = cx.tcx.hir().node_to_hir_id(stmt.node.id());
+        let hir_id = cx.tcx.hir().node_to_hir_id(stmt.id);
         let opt_dxn_ext = cx.region_scope_tree.opt_destruction_scope(hir_id.local_id);
-        let stmt_span = StatementSpan(cx.tcx.hir().span(stmt.node.id()));
+        let stmt_span = StatementSpan(cx.tcx.hir().span(stmt.id));
         match stmt.node {
-            hir::StmtKind::Expr(ref expr, _) |
-            hir::StmtKind::Semi(ref expr, _) => {
+            hir::StmtKind::Expr(ref expr) |
+            hir::StmtKind::Semi(ref expr) => {
                 result.push(StmtRef::Mirror(Box::new(Stmt {
                     kind: StmtKind::Expr {
                         scope: region::Scope {
@@ -64,52 +64,48 @@
                     span: stmt_span,
                 })))
             }
-            hir::StmtKind::Decl(ref decl, _) => {
-                match decl.node {
-                    hir::DeclKind::Item(..) => {
-                        // ignore for purposes of the MIR
-                    }
-                    hir::DeclKind::Local(ref local) => {
-                        let remainder_scope = region::Scope {
-                            id: block_id,
-                            data: region::ScopeData::Remainder(
-                                region::FirstStatementIndex::new(index)),
+            hir::StmtKind::Item(..) => {
+                // ignore for purposes of the MIR
+            }
+            hir::StmtKind::Local(ref local) => {
+                let remainder_scope = region::Scope {
+                    id: block_id,
+                    data: region::ScopeData::Remainder(
+                        region::FirstStatementIndex::new(index)),
+                };
+
+                let mut pattern = cx.pattern_from_hir(&local.pat);
+
+                if let Some(ty) = &local.ty {
+                    if let Some(&user_ty) = cx.tables.user_provided_types().get(ty.hir_id) {
+                        debug!("mirror_stmts: user_ty={:?}", user_ty);
+                        pattern = Pattern {
+                            ty: pattern.ty,
+                            span: pattern.span,
+                            kind: Box::new(PatternKind::AscribeUserType {
+                                user_ty: PatternTypeProjection::from_user_type(user_ty),
+                                user_ty_span: ty.span,
+                                subpattern: pattern,
+                                variance: ty::Variance::Covariant,
+                            })
                         };
-
-                        let mut pattern = cx.pattern_from_hir(&local.pat);
-
-                        if let Some(ty) = &local.ty {
-                            if let Some(&user_ty) = cx.tables.user_provided_types().get(ty.hir_id) {
-                                debug!("mirror_stmts: user_ty={:?}", user_ty);
-                                pattern = Pattern {
-                                    ty: pattern.ty,
-                                    span: pattern.span,
-                                    kind: Box::new(PatternKind::AscribeUserType {
-                                        user_ty: PatternTypeProjection::from_user_type(user_ty),
-                                        user_ty_span: ty.span,
-                                        subpattern: pattern,
-                                        variance: ty::Variance::Covariant,
-                                    })
-                                };
-                            }
-                        }
-
-                        result.push(StmtRef::Mirror(Box::new(Stmt {
-                            kind: StmtKind::Let {
-                                remainder_scope: remainder_scope,
-                                init_scope: region::Scope {
-                                    id: hir_id.local_id,
-                                    data: region::ScopeData::Node
-                                },
-                                pattern,
-                                initializer: local.init.to_ref(),
-                                lint_level: cx.lint_level_of(local.id),
-                            },
-                            opt_destruction_scope: opt_dxn_ext,
-                            span: stmt_span,
-                        })));
                     }
                 }
+
+                result.push(StmtRef::Mirror(Box::new(Stmt {
+                    kind: StmtKind::Let {
+                        remainder_scope: remainder_scope,
+                        init_scope: region::Scope {
+                            id: hir_id.local_id,
+                            data: region::ScopeData::Node
+                        },
+                        pattern,
+                        initializer: local.init.to_ref(),
+                        lint_level: cx.lint_level_of(local.id),
+                    },
+                    opt_destruction_scope: opt_dxn_ext,
+                    span: stmt_span,
+                })));
             }
         }
     }
diff --git a/src/librustc_mir/monomorphize/collector.rs b/src/librustc_mir/monomorphize/collector.rs
index a6a8fe5..eb49547 100644
--- a/src/librustc_mir/monomorphize/collector.rs
+++ b/src/librustc_mir/monomorphize/collector.rs
@@ -177,13 +177,13 @@
 use rustc::hir::{self, CodegenFnAttrFlags};
 use rustc::hir::itemlikevisit::ItemLikeVisitor;
 
-use rustc::hir::def_id::DefId;
+use rustc::hir::def_id::{DefId, LOCAL_CRATE};
 use rustc::mir::interpret::{AllocId, ConstValue};
 use rustc::middle::lang_items::{ExchangeMallocFnLangItem, StartFnLangItem};
 use rustc::ty::subst::Substs;
 use rustc::ty::{self, TypeFoldable, Ty, TyCtxt, GenericParamDefKind};
 use rustc::ty::adjustment::CustomCoerceUnsized;
-use rustc::session::config;
+use rustc::session::config::EntryFnType;
 use rustc::mir::{self, Location, Promoted};
 use rustc::mir::visit::Visitor as MirVisitor;
 use rustc::mir::mono::MonoItem;
@@ -321,9 +321,7 @@
     let mut roots = Vec::new();
 
     {
-        let entry_fn = tcx.sess.entry_fn.borrow().map(|(node_id, _, _)| {
-            tcx.hir().local_def_id(node_id)
-        });
+        let entry_fn = tcx.entry_fn(LOCAL_CRATE);
 
         debug!("collect_roots: entry_fn = {:?}", entry_fn);
 
@@ -924,7 +922,7 @@
     tcx: TyCtxt<'a, 'tcx, 'tcx>,
     mode: MonoItemCollectionMode,
     output: &'b mut Vec<MonoItem<'tcx>>,
-    entry_fn: Option<DefId>,
+    entry_fn: Option<(DefId, EntryFnType)>,
 }
 
 impl<'b, 'a, 'v> ItemLikeVisitor<'v> for RootCollector<'b, 'a, 'v> {
@@ -1023,7 +1021,7 @@
                 true
             }
             MonoItemCollectionMode::Lazy => {
-                self.entry_fn == Some(def_id) ||
+                self.entry_fn.map(|(id, _)| id) == Some(def_id) ||
                 self.tcx.is_reachable_non_generic(def_id) ||
                 self.tcx.codegen_fn_attrs(def_id).flags.contains(
                     CodegenFnAttrFlags::RUSTC_STD_INTERNAL_SYMBOL)
@@ -1048,14 +1046,9 @@
     /// the return type of `main`. This is not needed when
     /// the user writes their own `start` manually.
     fn push_extra_entry_roots(&mut self) {
-        if self.tcx.sess.entry_fn.get().map(|e| e.2) != Some(config::EntryFnType::Main) {
-            return
-        }
-
-        let main_def_id = if let Some(def_id) = self.entry_fn {
-            def_id
-        } else {
-            return
+        let main_def_id = match self.entry_fn {
+            Some((def_id, EntryFnType::Main)) => def_id,
+            _ => return,
         };
 
         let start_def_id = match self.tcx.lang_items().require(StartFnLangItem) {
diff --git a/src/librustc_mir/monomorphize/item.rs b/src/librustc_mir/monomorphize/item.rs
index 7014f53..c831cbd 100644
--- a/src/librustc_mir/monomorphize/item.rs
+++ b/src/librustc_mir/monomorphize/item.rs
@@ -1,6 +1,6 @@
 use monomorphize::Instance;
 use rustc::hir;
-use rustc::hir::def_id::DefId;
+use rustc::hir::def_id::{DefId, LOCAL_CRATE};
 use rustc::session::config::OptLevel;
 use rustc::ty::{self, Ty, TyCtxt, ClosureSubsts, GeneratorSubsts};
 use rustc::ty::subst::Substs;
@@ -75,8 +75,7 @@
 
         match *self.as_mono_item() {
             MonoItem::Fn(ref instance) => {
-                let entry_def_id =
-                    tcx.sess.entry_fn.borrow().map(|(id, _, _)| tcx.hir().local_def_id(id));
+                let entry_def_id = tcx.entry_fn(LOCAL_CRATE).map(|(id, _)| id);
                 // If this function isn't inlined or otherwise has explicit
                 // linkage, then we'll be creating a globally shared version.
                 if self.explicit_linkage(tcx).is_some() ||
diff --git a/src/librustc_mir/transform/qualify_min_const_fn.rs b/src/librustc_mir/transform/qualify_min_const_fn.rs
index 059b88a..85bf1e7 100644
--- a/src/librustc_mir/transform/qualify_min_const_fn.rs
+++ b/src/librustc_mir/transform/qualify_min_const_fn.rs
@@ -21,6 +21,7 @@
                 | Predicate::RegionOutlives(_)
                 | Predicate::TypeOutlives(_)
                 | Predicate::WellFormed(_)
+                | Predicate::Projection(_)
                 | Predicate::ConstEvaluatable(..) => continue,
                 | Predicate::ObjectSafe(_) => {
                     bug!("object safe predicate on function: {:#?}", predicate)
@@ -29,13 +30,6 @@
                     bug!("closure kind predicate on function: {:#?}", predicate)
                 }
                 Predicate::Subtype(_) => bug!("subtype predicate on function: {:#?}", predicate),
-                Predicate::Projection(_) => {
-                    let span = tcx.def_span(current);
-                    // we'll hit a `Predicate::Trait` later which will report an error
-                    tcx.sess
-                        .delay_span_bug(span, "projection without trait bound");
-                    continue;
-                }
                 Predicate::Trait(pred) => {
                     if Some(pred.def_id()) == tcx.lang_items().sized_trait() {
                         continue;
diff --git a/src/librustc_passes/hir_stats.rs b/src/librustc_passes/hir_stats.rs
index 604b31e..74d6d75 100644
--- a/src/librustc_passes/hir_stats.rs
+++ b/src/librustc_passes/hir_stats.rs
@@ -144,7 +144,7 @@
     }
 
     fn visit_stmt(&mut self, s: &'v hir::Stmt) {
-        self.record("Stmt", Id::Node(s.node.id()), s);
+        self.record("Stmt", Id::Node(s.id), s);
         hir_visit::walk_stmt(self, s)
     }
 
@@ -158,11 +158,6 @@
         hir_visit::walk_pat(self, p)
     }
 
-    fn visit_decl(&mut self, d: &'v hir::Decl) {
-        self.record("Decl", Id::None, d);
-        hir_visit::walk_decl(self, d)
-    }
-
     fn visit_expr(&mut self, ex: &'v hir::Expr) {
         self.record("Expr", Id::Node(ex.id), ex);
         hir_visit::walk_expr(self, ex)
diff --git a/src/librustc_passes/rvalue_promotion.rs b/src/librustc_passes/rvalue_promotion.rs
index f0b559f..49914dc 100644
--- a/src/librustc_passes/rvalue_promotion.rs
+++ b/src/librustc_passes/rvalue_promotion.rs
@@ -220,26 +220,22 @@
 
     fn check_stmt(&mut self, stmt: &'tcx hir::Stmt) -> Promotability {
         match stmt.node {
-            hir::StmtKind::Decl(ref decl, _node_id) => {
-                match &decl.node {
-                    hir::DeclKind::Local(local) => {
-                        if self.remove_mut_rvalue_borrow(&local.pat) {
-                            if let Some(init) = &local.init {
-                                self.mut_rvalue_borrows.insert(init.id);
-                            }
-                        }
-
-                        if let Some(ref expr) = local.init {
-                            let _ = self.check_expr(&expr);
-                        }
-                        NotPromotable
+            hir::StmtKind::Local(ref local) => {
+                if self.remove_mut_rvalue_borrow(&local.pat) {
+                    if let Some(init) = &local.init {
+                        self.mut_rvalue_borrows.insert(init.id);
                     }
-                    // Item statements are allowed
-                    hir::DeclKind::Item(_) => Promotable
                 }
+
+                if let Some(ref expr) = local.init {
+                    let _ = self.check_expr(&expr);
+                }
+                NotPromotable
             }
-            hir::StmtKind::Expr(ref box_expr, _node_id) |
-            hir::StmtKind::Semi(ref box_expr, _node_id) => {
+            // Item statements are allowed
+            hir::StmtKind::Item(..) => Promotable,
+            hir::StmtKind::Expr(ref box_expr) |
+            hir::StmtKind::Semi(ref box_expr) => {
                 let _ = self.check_expr(box_expr);
                 NotPromotable
             }
diff --git a/src/librustc_platform_intrinsics/Cargo.toml b/src/librustc_platform_intrinsics/Cargo.toml
deleted file mode 100644
index 92f37f9..0000000
--- a/src/librustc_platform_intrinsics/Cargo.toml
+++ /dev/null
@@ -1,9 +0,0 @@
-[package]
-authors = ["The Rust Project Developers"]
-name = "rustc_platform_intrinsics"
-version = "0.0.0"
-
-[lib]
-name = "rustc_platform_intrinsics"
-path = "lib.rs"
-crate-type = ["dylib"]
diff --git a/src/librustc_platform_intrinsics/aarch64.rs b/src/librustc_platform_intrinsics/aarch64.rs
deleted file mode 100644
index 833a312..0000000
--- a/src/librustc_platform_intrinsics/aarch64.rs
+++ /dev/null
@@ -1,3404 +0,0 @@
-// DO NOT EDIT: autogenerated by etc/platform-intrinsics/generator.py
-// ignore-tidy-linelength
-
-#![allow(unused_imports)]
-
-use {Intrinsic, Type};
-use IntrinsicDef::Named;
-
-pub fn find(name: &str) -> Option<Intrinsic> {
-    if !name.starts_with("aarch64_v") { return None }
-    Some(match &name["aarch64_v".len()..] {
-        "hadd_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x8, &::I8x8]; &INPUTS },
-            output: &::I8x8,
-            definition: Named("llvm.aarch64.neon.shadd.v8i8")
-        },
-        "hadd_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x8, &::U8x8]; &INPUTS },
-            output: &::U8x8,
-            definition: Named("llvm.aarch64.neon.uhadd.v8i8")
-        },
-        "hadd_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x4, &::I16x4]; &INPUTS },
-            output: &::I16x4,
-            definition: Named("llvm.aarch64.neon.shadd.v4i16")
-        },
-        "hadd_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x4, &::U16x4]; &INPUTS },
-            output: &::U16x4,
-            definition: Named("llvm.aarch64.neon.uhadd.v4i16")
-        },
-        "hadd_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x2, &::I32x2]; &INPUTS },
-            output: &::I32x2,
-            definition: Named("llvm.aarch64.neon.shadd.v2i32")
-        },
-        "hadd_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x2, &::U32x2]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.aarch64.neon.uhadd.v2i32")
-        },
-        "haddq_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x16, &::I8x16]; &INPUTS },
-            output: &::I8x16,
-            definition: Named("llvm.aarch64.neon.shadd.v16i8")
-        },
-        "haddq_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x16, &::U8x16]; &INPUTS },
-            output: &::U8x16,
-            definition: Named("llvm.aarch64.neon.uhadd.v16i8")
-        },
-        "haddq_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x8, &::I16x8]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.aarch64.neon.shadd.v8i16")
-        },
-        "haddq_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x8, &::U16x8]; &INPUTS },
-            output: &::U16x8,
-            definition: Named("llvm.aarch64.neon.uhadd.v8i16")
-        },
-        "haddq_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x4, &::I32x4]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.aarch64.neon.shadd.v4i32")
-        },
-        "haddq_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x4, &::U32x4]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.aarch64.neon.uhadd.v4i32")
-        },
-        "rhadd_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x8, &::I8x8]; &INPUTS },
-            output: &::I8x8,
-            definition: Named("llvm.aarch64.neon.srhadd.v8i8")
-        },
-        "rhadd_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x8, &::U8x8]; &INPUTS },
-            output: &::U8x8,
-            definition: Named("llvm.aarch64.neon.urhadd.v8i8")
-        },
-        "rhadd_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x4, &::I16x4]; &INPUTS },
-            output: &::I16x4,
-            definition: Named("llvm.aarch64.neon.srhadd.v4i16")
-        },
-        "rhadd_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x4, &::U16x4]; &INPUTS },
-            output: &::U16x4,
-            definition: Named("llvm.aarch64.neon.urhadd.v4i16")
-        },
-        "rhadd_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x2, &::I32x2]; &INPUTS },
-            output: &::I32x2,
-            definition: Named("llvm.aarch64.neon.srhadd.v2i32")
-        },
-        "rhadd_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x2, &::U32x2]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.aarch64.neon.urhadd.v2i32")
-        },
-        "rhaddq_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x16, &::I8x16]; &INPUTS },
-            output: &::I8x16,
-            definition: Named("llvm.aarch64.neon.srhadd.v16i8")
-        },
-        "rhaddq_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x16, &::U8x16]; &INPUTS },
-            output: &::U8x16,
-            definition: Named("llvm.aarch64.neon.urhadd.v16i8")
-        },
-        "rhaddq_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x8, &::I16x8]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.aarch64.neon.srhadd.v8i16")
-        },
-        "rhaddq_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x8, &::U16x8]; &INPUTS },
-            output: &::U16x8,
-            definition: Named("llvm.aarch64.neon.urhadd.v8i16")
-        },
-        "rhaddq_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x4, &::I32x4]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.aarch64.neon.srhadd.v4i32")
-        },
-        "rhaddq_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x4, &::U32x4]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.aarch64.neon.urhadd.v4i32")
-        },
-        "qadd_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x8, &::I8x8]; &INPUTS },
-            output: &::I8x8,
-            definition: Named("llvm.aarch64.neon.sqadd.v8i8")
-        },
-        "qadd_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x8, &::U8x8]; &INPUTS },
-            output: &::U8x8,
-            definition: Named("llvm.aarch64.neon.uqadd.v8i8")
-        },
-        "qadd_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x4, &::I16x4]; &INPUTS },
-            output: &::I16x4,
-            definition: Named("llvm.aarch64.neon.sqadd.v4i16")
-        },
-        "qadd_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x4, &::U16x4]; &INPUTS },
-            output: &::U16x4,
-            definition: Named("llvm.aarch64.neon.uqadd.v4i16")
-        },
-        "qadd_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x2, &::I32x2]; &INPUTS },
-            output: &::I32x2,
-            definition: Named("llvm.aarch64.neon.sqadd.v2i32")
-        },
-        "qadd_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x2, &::U32x2]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.aarch64.neon.uqadd.v2i32")
-        },
-        "qadd_s64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I64x1, &::I64x1]; &INPUTS },
-            output: &::I64x1,
-            definition: Named("llvm.aarch64.neon.sqadd.v1i64")
-        },
-        "qadd_u64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U64x1, &::U64x1]; &INPUTS },
-            output: &::U64x1,
-            definition: Named("llvm.aarch64.neon.uqadd.v1i64")
-        },
-        "qaddq_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x16, &::I8x16]; &INPUTS },
-            output: &::I8x16,
-            definition: Named("llvm.aarch64.neon.sqadd.v16i8")
-        },
-        "qaddq_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x16, &::U8x16]; &INPUTS },
-            output: &::U8x16,
-            definition: Named("llvm.aarch64.neon.uqadd.v16i8")
-        },
-        "qaddq_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x8, &::I16x8]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.aarch64.neon.sqadd.v8i16")
-        },
-        "qaddq_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x8, &::U16x8]; &INPUTS },
-            output: &::U16x8,
-            definition: Named("llvm.aarch64.neon.uqadd.v8i16")
-        },
-        "qaddq_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x4, &::I32x4]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.aarch64.neon.sqadd.v4i32")
-        },
-        "qaddq_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x4, &::U32x4]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.aarch64.neon.uqadd.v4i32")
-        },
-        "qaddq_s64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I64x2, &::I64x2]; &INPUTS },
-            output: &::I64x2,
-            definition: Named("llvm.aarch64.neon.sqadd.v2i64")
-        },
-        "qaddq_u64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U64x2, &::U64x2]; &INPUTS },
-            output: &::U64x2,
-            definition: Named("llvm.aarch64.neon.uqadd.v2i64")
-        },
-        "uqadd_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x16, &::U8x16]; &INPUTS },
-            output: &::I8x16,
-            definition: Named("llvm.aarch64.neon.suqadd.v16i8")
-        },
-        "uqadd_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x8, &::U16x8]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.aarch64.neon.suqadd.v8i16")
-        },
-        "uqadd_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x4, &::U32x4]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.aarch64.neon.suqadd.v4i32")
-        },
-        "uqadd_s64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I64x2, &::U64x2]; &INPUTS },
-            output: &::I64x2,
-            definition: Named("llvm.aarch64.neon.suqadd.v2i64")
-        },
-        "sqadd_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x16, &::I8x16]; &INPUTS },
-            output: &::U8x16,
-            definition: Named("llvm.aarch64.neon.usqadd.v16i8")
-        },
-        "sqadd_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x8, &::I16x8]; &INPUTS },
-            output: &::U16x8,
-            definition: Named("llvm.aarch64.neon.usqadd.v8i16")
-        },
-        "sqadd_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x4, &::I32x4]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.aarch64.neon.usqadd.v4i32")
-        },
-        "sqadd_u64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U64x2, &::I64x2]; &INPUTS },
-            output: &::U64x2,
-            definition: Named("llvm.aarch64.neon.usqadd.v2i64")
-        },
-        "raddhn_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x8, &::I16x8]; &INPUTS },
-            output: &::I8x8,
-            definition: Named("llvm.aarch64.neon.raddhn.v8i8")
-        },
-        "raddhn_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x8, &::U16x8]; &INPUTS },
-            output: &::U8x8,
-            definition: Named("llvm.aarch64.neon.raddhn.v8i8")
-        },
-        "raddhn_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x4, &::I32x4]; &INPUTS },
-            output: &::I16x4,
-            definition: Named("llvm.aarch64.neon.raddhn.v4i16")
-        },
-        "raddhn_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x4, &::U32x4]; &INPUTS },
-            output: &::U16x4,
-            definition: Named("llvm.aarch64.neon.raddhn.v4i16")
-        },
-        "raddhn_s64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I64x2, &::I64x2]; &INPUTS },
-            output: &::I32x2,
-            definition: Named("llvm.aarch64.neon.raddhn.v2i32")
-        },
-        "raddhn_u64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U64x2, &::U64x2]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.aarch64.neon.raddhn.v2i32")
-        },
-        "fmulx_f32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F32x2, &::F32x2]; &INPUTS },
-            output: &::F32x2,
-            definition: Named("llvm.aarch64.neon.fmulx.v2f32")
-        },
-        "fmulx_f64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F64x1, &::F64x1]; &INPUTS },
-            output: &::F64x1,
-            definition: Named("llvm.aarch64.neon.fmulx.v1f64")
-        },
-        "fmulxq_f32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F32x4, &::F32x4]; &INPUTS },
-            output: &::F32x4,
-            definition: Named("llvm.aarch64.neon.fmulx.v4f32")
-        },
-        "fmulxq_f64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F64x2, &::F64x2]; &INPUTS },
-            output: &::F64x2,
-            definition: Named("llvm.aarch64.neon.fmulx.v2f64")
-        },
-        "fma_f32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F32x2, &::F32x2]; &INPUTS },
-            output: &::F32x2,
-            definition: Named("llvm.fma.v2f32")
-        },
-        "fma_f64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F64x1, &::F64x1]; &INPUTS },
-            output: &::F64x1,
-            definition: Named("llvm.fma.v1f64")
-        },
-        "fmaq_f32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F32x4, &::F32x4]; &INPUTS },
-            output: &::F32x4,
-            definition: Named("llvm.fma.v4f32")
-        },
-        "fmaq_f64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F64x2, &::F64x2]; &INPUTS },
-            output: &::F64x2,
-            definition: Named("llvm.fma.v2f64")
-        },
-        "qdmulh_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x4, &::I16x4]; &INPUTS },
-            output: &::I16x4,
-            definition: Named("llvm.aarch64.neon.sqdmulh.v4i16")
-        },
-        "qdmulh_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x2, &::I32x2]; &INPUTS },
-            output: &::I32x2,
-            definition: Named("llvm.aarch64.neon.sqdmulh.v2i32")
-        },
-        "qdmulhq_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x8, &::I16x8]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.aarch64.neon.sqdmulh.v8i16")
-        },
-        "qdmulhq_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x4, &::I32x4]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.aarch64.neon.sqdmulh.v4i32")
-        },
-        "qrdmulh_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x4, &::I16x4]; &INPUTS },
-            output: &::I16x4,
-            definition: Named("llvm.aarch64.neon.sqrdmulh.v4i16")
-        },
-        "qrdmulh_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x2, &::I32x2]; &INPUTS },
-            output: &::I32x2,
-            definition: Named("llvm.aarch64.neon.sqrdmulh.v2i32")
-        },
-        "qrdmulhq_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x8, &::I16x8]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.aarch64.neon.sqrdmulh.v8i16")
-        },
-        "qrdmulhq_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x4, &::I32x4]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.aarch64.neon.sqrdmulh.v4i32")
-        },
-        "mull_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x8, &::I8x8]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.aarch64.neon.smull.v8i16")
-        },
-        "mull_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x8, &::U8x8]; &INPUTS },
-            output: &::U16x8,
-            definition: Named("llvm.aarch64.neon.umull.v8i16")
-        },
-        "mull_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x4, &::I16x4]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.aarch64.neon.smull.v4i32")
-        },
-        "mull_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x4, &::U16x4]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.aarch64.neon.umull.v4i32")
-        },
-        "mull_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x2, &::I32x2]; &INPUTS },
-            output: &::I64x2,
-            definition: Named("llvm.aarch64.neon.smull.v2i64")
-        },
-        "mull_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x2, &::U32x2]; &INPUTS },
-            output: &::U64x2,
-            definition: Named("llvm.aarch64.neon.umull.v2i64")
-        },
-        "qdmullq_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x8, &::I8x8]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.aarch64.neon.sqdmull.v8i16")
-        },
-        "qdmullq_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x4, &::I16x4]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.aarch64.neon.sqdmull.v4i32")
-        },
-        "hsub_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x8, &::I8x8]; &INPUTS },
-            output: &::I8x8,
-            definition: Named("llvm.aarch64.neon.shsub.v8i8")
-        },
-        "hsub_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x8, &::U8x8]; &INPUTS },
-            output: &::U8x8,
-            definition: Named("llvm.aarch64.neon.uhsub.v8i8")
-        },
-        "hsub_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x4, &::I16x4]; &INPUTS },
-            output: &::I16x4,
-            definition: Named("llvm.aarch64.neon.shsub.v4i16")
-        },
-        "hsub_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x4, &::U16x4]; &INPUTS },
-            output: &::U16x4,
-            definition: Named("llvm.aarch64.neon.uhsub.v4i16")
-        },
-        "hsub_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x2, &::I32x2]; &INPUTS },
-            output: &::I32x2,
-            definition: Named("llvm.aarch64.neon.shsub.v2i32")
-        },
-        "hsub_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x2, &::U32x2]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.aarch64.neon.uhsub.v2i32")
-        },
-        "hsubq_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x16, &::I8x16]; &INPUTS },
-            output: &::I8x16,
-            definition: Named("llvm.aarch64.neon.shsub.v16i8")
-        },
-        "hsubq_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x16, &::U8x16]; &INPUTS },
-            output: &::U8x16,
-            definition: Named("llvm.aarch64.neon.uhsub.v16i8")
-        },
-        "hsubq_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x8, &::I16x8]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.aarch64.neon.shsub.v8i16")
-        },
-        "hsubq_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x8, &::U16x8]; &INPUTS },
-            output: &::U16x8,
-            definition: Named("llvm.aarch64.neon.uhsub.v8i16")
-        },
-        "hsubq_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x4, &::I32x4]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.aarch64.neon.shsub.v4i32")
-        },
-        "hsubq_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x4, &::U32x4]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.aarch64.neon.uhsub.v4i32")
-        },
-        "qsub_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x8, &::I8x8]; &INPUTS },
-            output: &::I8x8,
-            definition: Named("llvm.aarch64.neon.sqsub.v8i8")
-        },
-        "qsub_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x8, &::U8x8]; &INPUTS },
-            output: &::U8x8,
-            definition: Named("llvm.aarch64.neon.uqsub.v8i8")
-        },
-        "qsub_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x4, &::I16x4]; &INPUTS },
-            output: &::I16x4,
-            definition: Named("llvm.aarch64.neon.sqsub.v4i16")
-        },
-        "qsub_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x4, &::U16x4]; &INPUTS },
-            output: &::U16x4,
-            definition: Named("llvm.aarch64.neon.uqsub.v4i16")
-        },
-        "qsub_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x2, &::I32x2]; &INPUTS },
-            output: &::I32x2,
-            definition: Named("llvm.aarch64.neon.sqsub.v2i32")
-        },
-        "qsub_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x2, &::U32x2]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.aarch64.neon.uqsub.v2i32")
-        },
-        "qsub_s64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I64x1, &::I64x1]; &INPUTS },
-            output: &::I64x1,
-            definition: Named("llvm.aarch64.neon.sqsub.v1i64")
-        },
-        "qsub_u64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U64x1, &::U64x1]; &INPUTS },
-            output: &::U64x1,
-            definition: Named("llvm.aarch64.neon.uqsub.v1i64")
-        },
-        "qsubq_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x16, &::I8x16]; &INPUTS },
-            output: &::I8x16,
-            definition: Named("llvm.aarch64.neon.sqsub.v16i8")
-        },
-        "qsubq_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x16, &::U8x16]; &INPUTS },
-            output: &::U8x16,
-            definition: Named("llvm.aarch64.neon.uqsub.v16i8")
-        },
-        "qsubq_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x8, &::I16x8]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.aarch64.neon.sqsub.v8i16")
-        },
-        "qsubq_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x8, &::U16x8]; &INPUTS },
-            output: &::U16x8,
-            definition: Named("llvm.aarch64.neon.uqsub.v8i16")
-        },
-        "qsubq_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x4, &::I32x4]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.aarch64.neon.sqsub.v4i32")
-        },
-        "qsubq_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x4, &::U32x4]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.aarch64.neon.uqsub.v4i32")
-        },
-        "qsubq_s64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I64x2, &::I64x2]; &INPUTS },
-            output: &::I64x2,
-            definition: Named("llvm.aarch64.neon.sqsub.v2i64")
-        },
-        "qsubq_u64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U64x2, &::U64x2]; &INPUTS },
-            output: &::U64x2,
-            definition: Named("llvm.aarch64.neon.uqsub.v2i64")
-        },
-        "rsubhn_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x8, &::I16x8]; &INPUTS },
-            output: &::I8x8,
-            definition: Named("llvm.aarch64.neon.rsubhn.v8i8")
-        },
-        "rsubhn_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x8, &::U16x8]; &INPUTS },
-            output: &::U8x8,
-            definition: Named("llvm.aarch64.neon.rsubhn.v8i8")
-        },
-        "rsubhn_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x4, &::I32x4]; &INPUTS },
-            output: &::I16x4,
-            definition: Named("llvm.aarch64.neon.rsubhn.v4i16")
-        },
-        "rsubhn_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x4, &::U32x4]; &INPUTS },
-            output: &::U16x4,
-            definition: Named("llvm.aarch64.neon.rsubhn.v4i16")
-        },
-        "rsubhn_s64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I64x2, &::I64x2]; &INPUTS },
-            output: &::I32x2,
-            definition: Named("llvm.aarch64.neon.rsubhn.v2i32")
-        },
-        "rsubhn_u64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U64x2, &::U64x2]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.aarch64.neon.rsubhn.v2i32")
-        },
-        "abd_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x8, &::I8x8]; &INPUTS },
-            output: &::I8x8,
-            definition: Named("llvm.aarch64.neon.sabd.v8i8")
-        },
-        "abd_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x8, &::U8x8]; &INPUTS },
-            output: &::U8x8,
-            definition: Named("llvm.aarch64.neon.uabd.v8i8")
-        },
-        "abd_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x4, &::I16x4]; &INPUTS },
-            output: &::I16x4,
-            definition: Named("llvm.aarch64.neon.sabd.v4i16")
-        },
-        "abd_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x4, &::U16x4]; &INPUTS },
-            output: &::U16x4,
-            definition: Named("llvm.aarch64.neon.uabd.v4i16")
-        },
-        "abd_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x2, &::I32x2]; &INPUTS },
-            output: &::I32x2,
-            definition: Named("llvm.aarch64.neon.sabd.v2i32")
-        },
-        "abd_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x2, &::U32x2]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.aarch64.neon.uabd.v2i32")
-        },
-        "abd_f32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F32x2, &::F32x2]; &INPUTS },
-            output: &::F32x2,
-            definition: Named("llvm.aarch64.neon.fabd.v2f32")
-        },
-        "abd_f64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F64x1, &::F64x1]; &INPUTS },
-            output: &::F64x1,
-            definition: Named("llvm.aarch64.neon.fabd.v1f64")
-        },
-        "abdq_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x16, &::I8x16]; &INPUTS },
-            output: &::I8x16,
-            definition: Named("llvm.aarch64.neon.sabd.v16i8")
-        },
-        "abdq_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x16, &::U8x16]; &INPUTS },
-            output: &::U8x16,
-            definition: Named("llvm.aarch64.neon.uabd.v16i8")
-        },
-        "abdq_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x8, &::I16x8]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.aarch64.neon.sabd.v8i16")
-        },
-        "abdq_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x8, &::U16x8]; &INPUTS },
-            output: &::U16x8,
-            definition: Named("llvm.aarch64.neon.uabd.v8i16")
-        },
-        "abdq_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x4, &::I32x4]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.aarch64.neon.sabd.v4i32")
-        },
-        "abdq_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x4, &::U32x4]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.aarch64.neon.uabd.v4i32")
-        },
-        "abdq_f32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F32x4, &::F32x4]; &INPUTS },
-            output: &::F32x4,
-            definition: Named("llvm.aarch64.neon.fabd.v4f32")
-        },
-        "abdq_f64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F64x2, &::F64x2]; &INPUTS },
-            output: &::F64x2,
-            definition: Named("llvm.aarch64.neon.fabd.v2f64")
-        },
-        "max_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x8, &::I8x8]; &INPUTS },
-            output: &::I8x8,
-            definition: Named("llvm.aarch64.neon.smax.v8i8")
-        },
-        "max_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x8, &::U8x8]; &INPUTS },
-            output: &::U8x8,
-            definition: Named("llvm.aarch64.neon.umax.v8i8")
-        },
-        "max_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x4, &::I16x4]; &INPUTS },
-            output: &::I16x4,
-            definition: Named("llvm.aarch64.neon.smax.v4i16")
-        },
-        "max_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x4, &::U16x4]; &INPUTS },
-            output: &::U16x4,
-            definition: Named("llvm.aarch64.neon.umax.v4i16")
-        },
-        "max_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x2, &::I32x2]; &INPUTS },
-            output: &::I32x2,
-            definition: Named("llvm.aarch64.neon.smax.v2i32")
-        },
-        "max_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x2, &::U32x2]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.aarch64.neon.umax.v2i32")
-        },
-        "max_f32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F32x2, &::F32x2]; &INPUTS },
-            output: &::F32x2,
-            definition: Named("llvm.aarch64.neon.fmax.v2f32")
-        },
-        "max_f64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F64x1, &::F64x1]; &INPUTS },
-            output: &::F64x1,
-            definition: Named("llvm.aarch64.neon.fmax.v1f64")
-        },
-        "maxq_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x16, &::I8x16]; &INPUTS },
-            output: &::I8x16,
-            definition: Named("llvm.aarch64.neon.smax.v16i8")
-        },
-        "maxq_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x16, &::U8x16]; &INPUTS },
-            output: &::U8x16,
-            definition: Named("llvm.aarch64.neon.umax.v16i8")
-        },
-        "maxq_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x8, &::I16x8]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.aarch64.neon.smax.v8i16")
-        },
-        "maxq_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x8, &::U16x8]; &INPUTS },
-            output: &::U16x8,
-            definition: Named("llvm.aarch64.neon.umax.v8i16")
-        },
-        "maxq_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x4, &::I32x4]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.aarch64.neon.smax.v4i32")
-        },
-        "maxq_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x4, &::U32x4]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.aarch64.neon.umax.v4i32")
-        },
-        "maxq_f32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F32x4, &::F32x4]; &INPUTS },
-            output: &::F32x4,
-            definition: Named("llvm.aarch64.neon.fmax.v4f32")
-        },
-        "maxq_f64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F64x2, &::F64x2]; &INPUTS },
-            output: &::F64x2,
-            definition: Named("llvm.aarch64.neon.fmax.v2f64")
-        },
-        "min_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x8, &::I8x8]; &INPUTS },
-            output: &::I8x8,
-            definition: Named("llvm.aarch64.neon.smin.v8i8")
-        },
-        "min_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x8, &::U8x8]; &INPUTS },
-            output: &::U8x8,
-            definition: Named("llvm.aarch64.neon.umin.v8i8")
-        },
-        "min_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x4, &::I16x4]; &INPUTS },
-            output: &::I16x4,
-            definition: Named("llvm.aarch64.neon.smin.v4i16")
-        },
-        "min_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x4, &::U16x4]; &INPUTS },
-            output: &::U16x4,
-            definition: Named("llvm.aarch64.neon.umin.v4i16")
-        },
-        "min_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x2, &::I32x2]; &INPUTS },
-            output: &::I32x2,
-            definition: Named("llvm.aarch64.neon.smin.v2i32")
-        },
-        "min_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x2, &::U32x2]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.aarch64.neon.umin.v2i32")
-        },
-        "min_f32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F32x2, &::F32x2]; &INPUTS },
-            output: &::F32x2,
-            definition: Named("llvm.aarch64.neon.fmin.v2f32")
-        },
-        "min_f64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F64x1, &::F64x1]; &INPUTS },
-            output: &::F64x1,
-            definition: Named("llvm.aarch64.neon.fmin.v1f64")
-        },
-        "minq_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x16, &::I8x16]; &INPUTS },
-            output: &::I8x16,
-            definition: Named("llvm.aarch64.neon.smin.v16i8")
-        },
-        "minq_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x16, &::U8x16]; &INPUTS },
-            output: &::U8x16,
-            definition: Named("llvm.aarch64.neon.umin.v16i8")
-        },
-        "minq_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x8, &::I16x8]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.aarch64.neon.smin.v8i16")
-        },
-        "minq_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x8, &::U16x8]; &INPUTS },
-            output: &::U16x8,
-            definition: Named("llvm.aarch64.neon.umin.v8i16")
-        },
-        "minq_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x4, &::I32x4]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.aarch64.neon.smin.v4i32")
-        },
-        "minq_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x4, &::U32x4]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.aarch64.neon.umin.v4i32")
-        },
-        "minq_f32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F32x4, &::F32x4]; &INPUTS },
-            output: &::F32x4,
-            definition: Named("llvm.aarch64.neon.fmin.v4f32")
-        },
-        "minq_f64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F64x2, &::F64x2]; &INPUTS },
-            output: &::F64x2,
-            definition: Named("llvm.aarch64.neon.fmin.v2f64")
-        },
-        "maxnm_f32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F32x2, &::F32x2]; &INPUTS },
-            output: &::F32x2,
-            definition: Named("llvm.aarch64.neon.fmaxnm.v2f32")
-        },
-        "maxnm_f64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F64x1, &::F64x1]; &INPUTS },
-            output: &::F64x1,
-            definition: Named("llvm.aarch64.neon.fmaxnm.v1f64")
-        },
-        "maxnmq_f32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F32x4, &::F32x4]; &INPUTS },
-            output: &::F32x4,
-            definition: Named("llvm.aarch64.neon.fmaxnm.v4f32")
-        },
-        "maxnmq_f64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F64x2, &::F64x2]; &INPUTS },
-            output: &::F64x2,
-            definition: Named("llvm.aarch64.neon.fmaxnm.v2f64")
-        },
-        "minnm_f32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F32x2, &::F32x2]; &INPUTS },
-            output: &::F32x2,
-            definition: Named("llvm.aarch64.neon.fminnm.v2f32")
-        },
-        "minnm_f64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F64x1, &::F64x1]; &INPUTS },
-            output: &::F64x1,
-            definition: Named("llvm.aarch64.neon.fminnm.v1f64")
-        },
-        "minnmq_f32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F32x4, &::F32x4]; &INPUTS },
-            output: &::F32x4,
-            definition: Named("llvm.aarch64.neon.fminnm.v4f32")
-        },
-        "minnmq_f64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F64x2, &::F64x2]; &INPUTS },
-            output: &::F64x2,
-            definition: Named("llvm.aarch64.neon.fminnm.v2f64")
-        },
-        "shl_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x8, &::I8x8]; &INPUTS },
-            output: &::I8x8,
-            definition: Named("llvm.aarch64.neon.sshl.v8i8")
-        },
-        "shl_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x8, &::I8x8]; &INPUTS },
-            output: &::U8x8,
-            definition: Named("llvm.aarch64.neon.ushl.v8i8")
-        },
-        "shl_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x4, &::I16x4]; &INPUTS },
-            output: &::I16x4,
-            definition: Named("llvm.aarch64.neon.sshl.v4i16")
-        },
-        "shl_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x4, &::I16x4]; &INPUTS },
-            output: &::U16x4,
-            definition: Named("llvm.aarch64.neon.ushl.v4i16")
-        },
-        "shl_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x2, &::I32x2]; &INPUTS },
-            output: &::I32x2,
-            definition: Named("llvm.aarch64.neon.sshl.v2i32")
-        },
-        "shl_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x2, &::I32x2]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.aarch64.neon.ushl.v2i32")
-        },
-        "shl_s64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I64x1, &::I64x1]; &INPUTS },
-            output: &::I64x1,
-            definition: Named("llvm.aarch64.neon.sshl.v1i64")
-        },
-        "shl_u64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U64x1, &::I64x1]; &INPUTS },
-            output: &::U64x1,
-            definition: Named("llvm.aarch64.neon.ushl.v1i64")
-        },
-        "shlq_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x16, &::I8x16]; &INPUTS },
-            output: &::I8x16,
-            definition: Named("llvm.aarch64.neon.sshl.v16i8")
-        },
-        "shlq_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x16, &::I8x16]; &INPUTS },
-            output: &::U8x16,
-            definition: Named("llvm.aarch64.neon.ushl.v16i8")
-        },
-        "shlq_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x8, &::I16x8]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.aarch64.neon.sshl.v8i16")
-        },
-        "shlq_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x8, &::I16x8]; &INPUTS },
-            output: &::U16x8,
-            definition: Named("llvm.aarch64.neon.ushl.v8i16")
-        },
-        "shlq_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x4, &::I32x4]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.aarch64.neon.sshl.v4i32")
-        },
-        "shlq_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x4, &::I32x4]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.aarch64.neon.ushl.v4i32")
-        },
-        "shlq_s64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I64x2, &::I64x2]; &INPUTS },
-            output: &::I64x2,
-            definition: Named("llvm.aarch64.neon.sshl.v2i64")
-        },
-        "shlq_u64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U64x2, &::I64x2]; &INPUTS },
-            output: &::U64x2,
-            definition: Named("llvm.aarch64.neon.ushl.v2i64")
-        },
-        "qshl_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x8, &::I8x8]; &INPUTS },
-            output: &::I8x8,
-            definition: Named("llvm.aarch64.neon.sqshl.v8i8")
-        },
-        "qshl_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x8, &::I8x8]; &INPUTS },
-            output: &::U8x8,
-            definition: Named("llvm.aarch64.neon.uqshl.v8i8")
-        },
-        "qshl_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x4, &::I16x4]; &INPUTS },
-            output: &::I16x4,
-            definition: Named("llvm.aarch64.neon.sqshl.v4i16")
-        },
-        "qshl_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x4, &::I16x4]; &INPUTS },
-            output: &::U16x4,
-            definition: Named("llvm.aarch64.neon.uqshl.v4i16")
-        },
-        "qshl_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x2, &::I32x2]; &INPUTS },
-            output: &::I32x2,
-            definition: Named("llvm.aarch64.neon.sqshl.v2i32")
-        },
-        "qshl_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x2, &::I32x2]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.aarch64.neon.uqshl.v2i32")
-        },
-        "qshl_s64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I64x1, &::I64x1]; &INPUTS },
-            output: &::I64x1,
-            definition: Named("llvm.aarch64.neon.sqshl.v1i64")
-        },
-        "qshl_u64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U64x1, &::I64x1]; &INPUTS },
-            output: &::U64x1,
-            definition: Named("llvm.aarch64.neon.uqshl.v1i64")
-        },
-        "qshlq_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x16, &::I8x16]; &INPUTS },
-            output: &::I8x16,
-            definition: Named("llvm.aarch64.neon.sqshl.v16i8")
-        },
-        "qshlq_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x16, &::I8x16]; &INPUTS },
-            output: &::U8x16,
-            definition: Named("llvm.aarch64.neon.uqshl.v16i8")
-        },
-        "qshlq_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x8, &::I16x8]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.aarch64.neon.sqshl.v8i16")
-        },
-        "qshlq_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x8, &::I16x8]; &INPUTS },
-            output: &::U16x8,
-            definition: Named("llvm.aarch64.neon.uqshl.v8i16")
-        },
-        "qshlq_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x4, &::I32x4]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.aarch64.neon.sqshl.v4i32")
-        },
-        "qshlq_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x4, &::I32x4]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.aarch64.neon.uqshl.v4i32")
-        },
-        "qshlq_s64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I64x2, &::I64x2]; &INPUTS },
-            output: &::I64x2,
-            definition: Named("llvm.aarch64.neon.sqshl.v2i64")
-        },
-        "qshlq_u64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U64x2, &::I64x2]; &INPUTS },
-            output: &::U64x2,
-            definition: Named("llvm.aarch64.neon.uqshl.v2i64")
-        },
-        "rshl_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x8, &::I8x8]; &INPUTS },
-            output: &::I8x8,
-            definition: Named("llvm.aarch64.neon.srshl.v8i8")
-        },
-        "rshl_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x8, &::I8x8]; &INPUTS },
-            output: &::U8x8,
-            definition: Named("llvm.aarch64.neon.urshl.v8i8")
-        },
-        "rshl_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x4, &::I16x4]; &INPUTS },
-            output: &::I16x4,
-            definition: Named("llvm.aarch64.neon.srshl.v4i16")
-        },
-        "rshl_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x4, &::I16x4]; &INPUTS },
-            output: &::U16x4,
-            definition: Named("llvm.aarch64.neon.urshl.v4i16")
-        },
-        "rshl_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x2, &::I32x2]; &INPUTS },
-            output: &::I32x2,
-            definition: Named("llvm.aarch64.neon.srshl.v2i32")
-        },
-        "rshl_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x2, &::I32x2]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.aarch64.neon.urshl.v2i32")
-        },
-        "rshl_s64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I64x1, &::I64x1]; &INPUTS },
-            output: &::I64x1,
-            definition: Named("llvm.aarch64.neon.srshl.v1i64")
-        },
-        "rshl_u64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U64x1, &::I64x1]; &INPUTS },
-            output: &::U64x1,
-            definition: Named("llvm.aarch64.neon.urshl.v1i64")
-        },
-        "rshlq_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x16, &::I8x16]; &INPUTS },
-            output: &::I8x16,
-            definition: Named("llvm.aarch64.neon.srshl.v16i8")
-        },
-        "rshlq_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x16, &::I8x16]; &INPUTS },
-            output: &::U8x16,
-            definition: Named("llvm.aarch64.neon.urshl.v16i8")
-        },
-        "rshlq_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x8, &::I16x8]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.aarch64.neon.srshl.v8i16")
-        },
-        "rshlq_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x8, &::I16x8]; &INPUTS },
-            output: &::U16x8,
-            definition: Named("llvm.aarch64.neon.urshl.v8i16")
-        },
-        "rshlq_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x4, &::I32x4]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.aarch64.neon.srshl.v4i32")
-        },
-        "rshlq_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x4, &::I32x4]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.aarch64.neon.urshl.v4i32")
-        },
-        "rshlq_s64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I64x2, &::I64x2]; &INPUTS },
-            output: &::I64x2,
-            definition: Named("llvm.aarch64.neon.srshl.v2i64")
-        },
-        "rshlq_u64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U64x2, &::I64x2]; &INPUTS },
-            output: &::U64x2,
-            definition: Named("llvm.aarch64.neon.urshl.v2i64")
-        },
-        "qrshl_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x8, &::I8x8]; &INPUTS },
-            output: &::I8x8,
-            definition: Named("llvm.aarch64.neon.sqrshl.v8i8")
-        },
-        "qrshl_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x8, &::I8x8]; &INPUTS },
-            output: &::U8x8,
-            definition: Named("llvm.aarch64.neon.uqrshl.v8i8")
-        },
-        "qrshl_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x4, &::I16x4]; &INPUTS },
-            output: &::I16x4,
-            definition: Named("llvm.aarch64.neon.sqrshl.v4i16")
-        },
-        "qrshl_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x4, &::I16x4]; &INPUTS },
-            output: &::U16x4,
-            definition: Named("llvm.aarch64.neon.uqrshl.v4i16")
-        },
-        "qrshl_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x2, &::I32x2]; &INPUTS },
-            output: &::I32x2,
-            definition: Named("llvm.aarch64.neon.sqrshl.v2i32")
-        },
-        "qrshl_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x2, &::I32x2]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.aarch64.neon.uqrshl.v2i32")
-        },
-        "qrshl_s64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I64x1, &::I64x1]; &INPUTS },
-            output: &::I64x1,
-            definition: Named("llvm.aarch64.neon.sqrshl.v1i64")
-        },
-        "qrshl_u64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U64x1, &::I64x1]; &INPUTS },
-            output: &::U64x1,
-            definition: Named("llvm.aarch64.neon.uqrshl.v1i64")
-        },
-        "qrshlq_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x16, &::I8x16]; &INPUTS },
-            output: &::I8x16,
-            definition: Named("llvm.aarch64.neon.sqrshl.v16i8")
-        },
-        "qrshlq_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x16, &::I8x16]; &INPUTS },
-            output: &::U8x16,
-            definition: Named("llvm.aarch64.neon.uqrshl.v16i8")
-        },
-        "qrshlq_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x8, &::I16x8]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.aarch64.neon.sqrshl.v8i16")
-        },
-        "qrshlq_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x8, &::I16x8]; &INPUTS },
-            output: &::U16x8,
-            definition: Named("llvm.aarch64.neon.uqrshl.v8i16")
-        },
-        "qrshlq_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x4, &::I32x4]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.aarch64.neon.sqrshl.v4i32")
-        },
-        "qrshlq_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x4, &::I32x4]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.aarch64.neon.uqrshl.v4i32")
-        },
-        "qrshlq_s64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I64x2, &::I64x2]; &INPUTS },
-            output: &::I64x2,
-            definition: Named("llvm.aarch64.neon.sqrshl.v2i64")
-        },
-        "qrshlq_u64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U64x2, &::I64x2]; &INPUTS },
-            output: &::U64x2,
-            definition: Named("llvm.aarch64.neon.uqrshl.v2i64")
-        },
-        "qshrun_n_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x8, &::U32]; &INPUTS },
-            output: &::I8x8,
-            definition: Named("llvm.aarch64.neon.sqshrun.v8i8")
-        },
-        "qshrun_n_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x4, &::U32]; &INPUTS },
-            output: &::I16x4,
-            definition: Named("llvm.aarch64.neon.sqshrun.v4i16")
-        },
-        "qshrun_n_s64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I64x2, &::U32]; &INPUTS },
-            output: &::I32x2,
-            definition: Named("llvm.aarch64.neon.sqshrun.v2i32")
-        },
-        "qrshrun_n_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x8, &::U32]; &INPUTS },
-            output: &::I8x8,
-            definition: Named("llvm.aarch64.neon.sqrshrun.v8i8")
-        },
-        "qrshrun_n_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x4, &::U32]; &INPUTS },
-            output: &::I16x4,
-            definition: Named("llvm.aarch64.neon.sqrshrun.v4i16")
-        },
-        "qrshrun_n_s64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I64x2, &::U32]; &INPUTS },
-            output: &::I32x2,
-            definition: Named("llvm.aarch64.neon.sqrshrun.v2i32")
-        },
-        "qshrn_n_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x8, &::U32]; &INPUTS },
-            output: &::I8x8,
-            definition: Named("llvm.aarch64.neon.sqshrn.v8i8")
-        },
-        "qshrn_n_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x8, &::U32]; &INPUTS },
-            output: &::U8x8,
-            definition: Named("llvm.aarch64.neon.uqshrn.v8i8")
-        },
-        "qshrn_n_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x4, &::U32]; &INPUTS },
-            output: &::I16x4,
-            definition: Named("llvm.aarch64.neon.sqshrn.v4i16")
-        },
-        "qshrn_n_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x4, &::U32]; &INPUTS },
-            output: &::U16x4,
-            definition: Named("llvm.aarch64.neon.uqshrn.v4i16")
-        },
-        "qshrn_n_s64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I64x2, &::U32]; &INPUTS },
-            output: &::I32x2,
-            definition: Named("llvm.aarch64.neon.sqshrn.v2i32")
-        },
-        "qshrn_n_u64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U64x2, &::U32]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.aarch64.neon.uqshrn.v2i32")
-        },
-        "rshrn_n_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x8, &::U32]; &INPUTS },
-            output: &::I8x8,
-            definition: Named("llvm.aarch64.neon.rshrn.v8i8")
-        },
-        "rshrn_n_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x8, &::U32]; &INPUTS },
-            output: &::U8x8,
-            definition: Named("llvm.aarch64.neon.rshrn.v8i8")
-        },
-        "rshrn_n_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x4, &::U32]; &INPUTS },
-            output: &::I16x4,
-            definition: Named("llvm.aarch64.neon.rshrn.v4i16")
-        },
-        "rshrn_n_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x4, &::U32]; &INPUTS },
-            output: &::U16x4,
-            definition: Named("llvm.aarch64.neon.rshrn.v4i16")
-        },
-        "rshrn_n_s64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I64x2, &::U32]; &INPUTS },
-            output: &::I32x2,
-            definition: Named("llvm.aarch64.neon.rshrn.v2i32")
-        },
-        "rshrn_n_u64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U64x2, &::U32]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.aarch64.neon.rshrn.v2i32")
-        },
-        "qrshrn_n_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x8, &::U32]; &INPUTS },
-            output: &::I8x8,
-            definition: Named("llvm.aarch64.neon.sqrshrn.v8i8")
-        },
-        "qrshrn_n_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x8, &::U32]; &INPUTS },
-            output: &::U8x8,
-            definition: Named("llvm.aarch64.neon.uqrshrn.v8i8")
-        },
-        "qrshrn_n_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x4, &::U32]; &INPUTS },
-            output: &::I16x4,
-            definition: Named("llvm.aarch64.neon.sqrshrn.v4i16")
-        },
-        "qrshrn_n_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x4, &::U32]; &INPUTS },
-            output: &::U16x4,
-            definition: Named("llvm.aarch64.neon.uqrshrn.v4i16")
-        },
-        "qrshrn_n_s64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I64x2, &::U32]; &INPUTS },
-            output: &::I32x2,
-            definition: Named("llvm.aarch64.neon.sqrshrn.v2i32")
-        },
-        "qrshrn_n_u64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U64x2, &::U32]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.aarch64.neon.uqrshrn.v2i32")
-        },
-        "sri_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x8, &::I8x8]; &INPUTS },
-            output: &::I8x8,
-            definition: Named("llvm.aarch64.neon.vsri.v8i8")
-        },
-        "sri_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x8, &::U8x8]; &INPUTS },
-            output: &::U8x8,
-            definition: Named("llvm.aarch64.neon.vsri.v8i8")
-        },
-        "sri_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x4, &::I16x4]; &INPUTS },
-            output: &::I16x4,
-            definition: Named("llvm.aarch64.neon.vsri.v4i16")
-        },
-        "sri_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x4, &::U16x4]; &INPUTS },
-            output: &::U16x4,
-            definition: Named("llvm.aarch64.neon.vsri.v4i16")
-        },
-        "sri_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x2, &::I32x2]; &INPUTS },
-            output: &::I32x2,
-            definition: Named("llvm.aarch64.neon.vsri.v2i32")
-        },
-        "sri_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x2, &::U32x2]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.aarch64.neon.vsri.v2i32")
-        },
-        "sri_s64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I64x1, &::I64x1]; &INPUTS },
-            output: &::I64x1,
-            definition: Named("llvm.aarch64.neon.vsri.v1i64")
-        },
-        "sri_u64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U64x1, &::U64x1]; &INPUTS },
-            output: &::U64x1,
-            definition: Named("llvm.aarch64.neon.vsri.v1i64")
-        },
-        "sriq_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x16, &::I8x16]; &INPUTS },
-            output: &::I8x16,
-            definition: Named("llvm.aarch64.neon.vsri.v16i8")
-        },
-        "sriq_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x16, &::U8x16]; &INPUTS },
-            output: &::U8x16,
-            definition: Named("llvm.aarch64.neon.vsri.v16i8")
-        },
-        "sriq_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x8, &::I16x8]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.aarch64.neon.vsri.v8i16")
-        },
-        "sriq_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x8, &::U16x8]; &INPUTS },
-            output: &::U16x8,
-            definition: Named("llvm.aarch64.neon.vsri.v8i16")
-        },
-        "sriq_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x4, &::I32x4]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.aarch64.neon.vsri.v4i32")
-        },
-        "sriq_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x4, &::U32x4]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.aarch64.neon.vsri.v4i32")
-        },
-        "sriq_s64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I64x2, &::I64x2]; &INPUTS },
-            output: &::I64x2,
-            definition: Named("llvm.aarch64.neon.vsri.v2i64")
-        },
-        "sriq_u64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U64x2, &::U64x2]; &INPUTS },
-            output: &::U64x2,
-            definition: Named("llvm.aarch64.neon.vsri.v2i64")
-        },
-        "sli_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x8, &::I8x8]; &INPUTS },
-            output: &::I8x8,
-            definition: Named("llvm.aarch64.neon.vsli.v8i8")
-        },
-        "sli_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x8, &::U8x8]; &INPUTS },
-            output: &::U8x8,
-            definition: Named("llvm.aarch64.neon.vsli.v8i8")
-        },
-        "sli_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x4, &::I16x4]; &INPUTS },
-            output: &::I16x4,
-            definition: Named("llvm.aarch64.neon.vsli.v4i16")
-        },
-        "sli_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x4, &::U16x4]; &INPUTS },
-            output: &::U16x4,
-            definition: Named("llvm.aarch64.neon.vsli.v4i16")
-        },
-        "sli_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x2, &::I32x2]; &INPUTS },
-            output: &::I32x2,
-            definition: Named("llvm.aarch64.neon.vsli.v2i32")
-        },
-        "sli_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x2, &::U32x2]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.aarch64.neon.vsli.v2i32")
-        },
-        "sli_s64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I64x1, &::I64x1]; &INPUTS },
-            output: &::I64x1,
-            definition: Named("llvm.aarch64.neon.vsli.v1i64")
-        },
-        "sli_u64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U64x1, &::U64x1]; &INPUTS },
-            output: &::U64x1,
-            definition: Named("llvm.aarch64.neon.vsli.v1i64")
-        },
-        "sliq_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x16, &::I8x16]; &INPUTS },
-            output: &::I8x16,
-            definition: Named("llvm.aarch64.neon.vsli.v16i8")
-        },
-        "sliq_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x16, &::U8x16]; &INPUTS },
-            output: &::U8x16,
-            definition: Named("llvm.aarch64.neon.vsli.v16i8")
-        },
-        "sliq_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x8, &::I16x8]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.aarch64.neon.vsli.v8i16")
-        },
-        "sliq_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x8, &::U16x8]; &INPUTS },
-            output: &::U16x8,
-            definition: Named("llvm.aarch64.neon.vsli.v8i16")
-        },
-        "sliq_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x4, &::I32x4]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.aarch64.neon.vsli.v4i32")
-        },
-        "sliq_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x4, &::U32x4]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.aarch64.neon.vsli.v4i32")
-        },
-        "sliq_s64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I64x2, &::I64x2]; &INPUTS },
-            output: &::I64x2,
-            definition: Named("llvm.aarch64.neon.vsli.v2i64")
-        },
-        "sliq_u64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U64x2, &::U64x2]; &INPUTS },
-            output: &::U64x2,
-            definition: Named("llvm.aarch64.neon.vsli.v2i64")
-        },
-        "vqmovn_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I16x8]; &INPUTS },
-            output: &::I8x8,
-            definition: Named("llvm.aarch64.neon.sqxtn.v8i8")
-        },
-        "vqmovn_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U16x8]; &INPUTS },
-            output: &::U8x8,
-            definition: Named("llvm.aarch64.neon.uqxtn.v8i8")
-        },
-        "vqmovn_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I32x4]; &INPUTS },
-            output: &::I16x4,
-            definition: Named("llvm.aarch64.neon.sqxtn.v4i16")
-        },
-        "vqmovn_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U32x4]; &INPUTS },
-            output: &::U16x4,
-            definition: Named("llvm.aarch64.neon.uqxtn.v4i16")
-        },
-        "vqmovn_s64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I64x2]; &INPUTS },
-            output: &::I32x2,
-            definition: Named("llvm.aarch64.neon.sqxtn.v2i32")
-        },
-        "vqmovn_u64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U64x2]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.aarch64.neon.uqxtn.v2i32")
-        },
-        "abs_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I8x8]; &INPUTS },
-            output: &::I8x8,
-            definition: Named("llvm.aarch64.neon.abs.v8i8")
-        },
-        "abs_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I16x4]; &INPUTS },
-            output: &::I16x4,
-            definition: Named("llvm.aarch64.neon.abs.v4i16")
-        },
-        "abs_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I32x2]; &INPUTS },
-            output: &::I32x2,
-            definition: Named("llvm.aarch64.neon.abs.v2i32")
-        },
-        "abs_s64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I64x1]; &INPUTS },
-            output: &::I64x1,
-            definition: Named("llvm.aarch64.neon.abs.v1i64")
-        },
-        "absq_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I8x16]; &INPUTS },
-            output: &::I8x16,
-            definition: Named("llvm.aarch64.neon.abs.v16i8")
-        },
-        "absq_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I16x8]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.aarch64.neon.abs.v8i16")
-        },
-        "absq_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I32x4]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.aarch64.neon.abs.v4i32")
-        },
-        "absq_s64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I64x2]; &INPUTS },
-            output: &::I64x2,
-            definition: Named("llvm.aarch64.neon.abs.v2i64")
-        },
-        "abs_f32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::F32x2]; &INPUTS },
-            output: &::F32x2,
-            definition: Named("llvm.fabs.v2f32")
-        },
-        "abs_f64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::F64x1]; &INPUTS },
-            output: &::F64x1,
-            definition: Named("llvm.fabs.v1f64")
-        },
-        "absq_f32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::F32x4]; &INPUTS },
-            output: &::F32x4,
-            definition: Named("llvm.fabs.v4f32")
-        },
-        "absq_f64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::F64x2]; &INPUTS },
-            output: &::F64x2,
-            definition: Named("llvm.fabs.v2f64")
-        },
-        "qabs_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I8x8]; &INPUTS },
-            output: &::I8x8,
-            definition: Named("llvm.aarch64.neon.sqabs.v8i8")
-        },
-        "qabs_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I16x4]; &INPUTS },
-            output: &::I16x4,
-            definition: Named("llvm.aarch64.neon.sqabs.v4i16")
-        },
-        "qabs_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I32x2]; &INPUTS },
-            output: &::I32x2,
-            definition: Named("llvm.aarch64.neon.sqabs.v2i32")
-        },
-        "qabs_s64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I64x1]; &INPUTS },
-            output: &::I64x1,
-            definition: Named("llvm.aarch64.neon.sqabs.v1i64")
-        },
-        "qabsq_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I8x16]; &INPUTS },
-            output: &::I8x16,
-            definition: Named("llvm.aarch64.neon.sqabs.v16i8")
-        },
-        "qabsq_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I16x8]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.aarch64.neon.sqabs.v8i16")
-        },
-        "qabsq_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I32x4]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.aarch64.neon.sqabs.v4i32")
-        },
-        "qabsq_s64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I64x2]; &INPUTS },
-            output: &::I64x2,
-            definition: Named("llvm.aarch64.neon.sqabs.v2i64")
-        },
-        "qneg_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I8x8]; &INPUTS },
-            output: &::I8x8,
-            definition: Named("llvm.aarch64.neon.sqneg.v8i8")
-        },
-        "qneg_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I16x4]; &INPUTS },
-            output: &::I16x4,
-            definition: Named("llvm.aarch64.neon.sqneg.v4i16")
-        },
-        "qneg_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I32x2]; &INPUTS },
-            output: &::I32x2,
-            definition: Named("llvm.aarch64.neon.sqneg.v2i32")
-        },
-        "qneg_s64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I64x1]; &INPUTS },
-            output: &::I64x1,
-            definition: Named("llvm.aarch64.neon.sqneg.v1i64")
-        },
-        "qnegq_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I8x16]; &INPUTS },
-            output: &::I8x16,
-            definition: Named("llvm.aarch64.neon.sqneg.v16i8")
-        },
-        "qnegq_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I16x8]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.aarch64.neon.sqneg.v8i16")
-        },
-        "qnegq_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I32x4]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.aarch64.neon.sqneg.v4i32")
-        },
-        "qnegq_s64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I64x2]; &INPUTS },
-            output: &::I64x2,
-            definition: Named("llvm.aarch64.neon.sqneg.v2i64")
-        },
-        "clz_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I8x8]; &INPUTS },
-            output: &::I8x8,
-            definition: Named("llvm.ctlz.v8i8")
-        },
-        "clz_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U8x8]; &INPUTS },
-            output: &::U8x8,
-            definition: Named("llvm.ctlz.v8i8")
-        },
-        "clz_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I16x4]; &INPUTS },
-            output: &::I16x4,
-            definition: Named("llvm.ctlz.v4i16")
-        },
-        "clz_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U16x4]; &INPUTS },
-            output: &::U16x4,
-            definition: Named("llvm.ctlz.v4i16")
-        },
-        "clz_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I32x2]; &INPUTS },
-            output: &::I32x2,
-            definition: Named("llvm.ctlz.v2i32")
-        },
-        "clz_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U32x2]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.ctlz.v2i32")
-        },
-        "clzq_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I8x16]; &INPUTS },
-            output: &::I8x16,
-            definition: Named("llvm.ctlz.v16i8")
-        },
-        "clzq_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U8x16]; &INPUTS },
-            output: &::U8x16,
-            definition: Named("llvm.ctlz.v16i8")
-        },
-        "clzq_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I16x8]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.ctlz.v8i16")
-        },
-        "clzq_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U16x8]; &INPUTS },
-            output: &::U16x8,
-            definition: Named("llvm.ctlz.v8i16")
-        },
-        "clzq_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I32x4]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.ctlz.v4i32")
-        },
-        "clzq_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U32x4]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.ctlz.v4i32")
-        },
-        "cls_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I8x8]; &INPUTS },
-            output: &::I8x8,
-            definition: Named("llvm.aarch64.neon.cls.v8i8")
-        },
-        "cls_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U8x8]; &INPUTS },
-            output: &::U8x8,
-            definition: Named("llvm.aarch64.neon.cls.v8i8")
-        },
-        "cls_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I16x4]; &INPUTS },
-            output: &::I16x4,
-            definition: Named("llvm.aarch64.neon.cls.v4i16")
-        },
-        "cls_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U16x4]; &INPUTS },
-            output: &::U16x4,
-            definition: Named("llvm.aarch64.neon.cls.v4i16")
-        },
-        "cls_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I32x2]; &INPUTS },
-            output: &::I32x2,
-            definition: Named("llvm.aarch64.neon.cls.v2i32")
-        },
-        "cls_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U32x2]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.aarch64.neon.cls.v2i32")
-        },
-        "clsq_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I8x16]; &INPUTS },
-            output: &::I8x16,
-            definition: Named("llvm.aarch64.neon.cls.v16i8")
-        },
-        "clsq_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U8x16]; &INPUTS },
-            output: &::U8x16,
-            definition: Named("llvm.aarch64.neon.cls.v16i8")
-        },
-        "clsq_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I16x8]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.aarch64.neon.cls.v8i16")
-        },
-        "clsq_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U16x8]; &INPUTS },
-            output: &::U16x8,
-            definition: Named("llvm.aarch64.neon.cls.v8i16")
-        },
-        "clsq_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I32x4]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.aarch64.neon.cls.v4i32")
-        },
-        "clsq_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U32x4]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.aarch64.neon.cls.v4i32")
-        },
-        "cnt_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I8x8]; &INPUTS },
-            output: &::I8x8,
-            definition: Named("llvm.ctpop.v8i8")
-        },
-        "cnt_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U8x8]; &INPUTS },
-            output: &::U8x8,
-            definition: Named("llvm.ctpop.v8i8")
-        },
-        "cntq_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I8x16]; &INPUTS },
-            output: &::I8x16,
-            definition: Named("llvm.ctpop.v16i8")
-        },
-        "cntq_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U8x16]; &INPUTS },
-            output: &::U8x16,
-            definition: Named("llvm.ctpop.v16i8")
-        },
-        "recpe_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U32x2]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.aarch64.neon.urecpe.v2i32")
-        },
-        "recpe_f32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::F32x2]; &INPUTS },
-            output: &::F32x2,
-            definition: Named("llvm.aarch64.neon.frecpe.v2f32")
-        },
-        "recpe_f64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::F64x1]; &INPUTS },
-            output: &::F64x1,
-            definition: Named("llvm.aarch64.neon.frecpe.v1f64")
-        },
-        "recpeq_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U32x4]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.aarch64.neon.urecpe.v4i32")
-        },
-        "recpeq_f32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::F32x4]; &INPUTS },
-            output: &::F32x4,
-            definition: Named("llvm.aarch64.neon.frecpe.v4f32")
-        },
-        "recpeq_f64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::F64x2]; &INPUTS },
-            output: &::F64x2,
-            definition: Named("llvm.aarch64.neon.frecpe.v2f64")
-        },
-        "recps_f32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F32x2, &::F32x2]; &INPUTS },
-            output: &::F32x2,
-            definition: Named("llvm.aarch64.neon.frecps.v2f32")
-        },
-        "recps_f64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F64x1, &::F64x1]; &INPUTS },
-            output: &::F64x1,
-            definition: Named("llvm.aarch64.neon.frecps.v1f64")
-        },
-        "recpsq_f32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F32x4, &::F32x4]; &INPUTS },
-            output: &::F32x4,
-            definition: Named("llvm.aarch64.neon.frecps.v4f32")
-        },
-        "recpsq_f64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F64x2, &::F64x2]; &INPUTS },
-            output: &::F64x2,
-            definition: Named("llvm.aarch64.neon.frecps.v2f64")
-        },
-        "sqrt_f32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::F32x2]; &INPUTS },
-            output: &::F32x2,
-            definition: Named("llvm.sqrt.v2f32")
-        },
-        "sqrt_f64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::F64x1]; &INPUTS },
-            output: &::F64x1,
-            definition: Named("llvm.sqrt.v1f64")
-        },
-        "sqrtq_f32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::F32x4]; &INPUTS },
-            output: &::F32x4,
-            definition: Named("llvm.sqrt.v4f32")
-        },
-        "sqrtq_f64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::F64x2]; &INPUTS },
-            output: &::F64x2,
-            definition: Named("llvm.sqrt.v2f64")
-        },
-        "rsqrte_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U32x2]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.aarch64.neon.ursqrte.v2i32")
-        },
-        "rsqrte_f32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::F32x2]; &INPUTS },
-            output: &::F32x2,
-            definition: Named("llvm.aarch64.neon.frsqrte.v2f32")
-        },
-        "rsqrte_f64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::F64x1]; &INPUTS },
-            output: &::F64x1,
-            definition: Named("llvm.aarch64.neon.frsqrte.v1f64")
-        },
-        "rsqrteq_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U32x4]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.aarch64.neon.ursqrte.v4i32")
-        },
-        "rsqrteq_f32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::F32x4]; &INPUTS },
-            output: &::F32x4,
-            definition: Named("llvm.aarch64.neon.frsqrte.v4f32")
-        },
-        "rsqrteq_f64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::F64x2]; &INPUTS },
-            output: &::F64x2,
-            definition: Named("llvm.aarch64.neon.frsqrte.v2f64")
-        },
-        "rsqrts_f32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F32x2, &::F32x2]; &INPUTS },
-            output: &::F32x2,
-            definition: Named("llvm.aarch64.neon.frsqrts.v2f32")
-        },
-        "rsqrts_f64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F64x1, &::F64x1]; &INPUTS },
-            output: &::F64x1,
-            definition: Named("llvm.aarch64.neon.frsqrts.v1f64")
-        },
-        "rsqrtsq_f32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F32x4, &::F32x4]; &INPUTS },
-            output: &::F32x4,
-            definition: Named("llvm.aarch64.neon.frsqrts.v4f32")
-        },
-        "rsqrtsq_f64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F64x2, &::F64x2]; &INPUTS },
-            output: &::F64x2,
-            definition: Named("llvm.aarch64.neon.frsqrts.v2f64")
-        },
-        "rbit_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I8x8]; &INPUTS },
-            output: &::I8x8,
-            definition: Named("llvm.aarch64.neon.rbit.v8i8")
-        },
-        "rbit_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U8x8]; &INPUTS },
-            output: &::U8x8,
-            definition: Named("llvm.aarch64.neon.rbit.v8i8")
-        },
-        "rbitq_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I8x16]; &INPUTS },
-            output: &::I8x16,
-            definition: Named("llvm.aarch64.neon.rbit.v16i8")
-        },
-        "rbitq_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U8x16]; &INPUTS },
-            output: &::U8x16,
-            definition: Named("llvm.aarch64.neon.rbit.v16i8")
-        },
-        "ld2_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::I8, Some(&::I8x8), true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 2] = [&::I8x8, &::I8x8]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld2.v8i8.p0v8i8")
-        },
-        "ld2_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::U8, Some(&::U8x8), true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 2] = [&::U8x8, &::U8x8]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld2.v8i8.p0v8i8")
-        },
-        "ld2_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::I16, Some(&::I16x4), true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 2] = [&::I16x4, &::I16x4]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld2.v4i16.p0v4i16")
-        },
-        "ld2_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::U16, Some(&::U16x4), true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 2] = [&::U16x4, &::U16x4]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld2.v4i16.p0v4i16")
-        },
-        "ld2_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::I32, Some(&::I32x2), true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 2] = [&::I32x2, &::I32x2]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld2.v2i32.p0v2i32")
-        },
-        "ld2_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::U32, Some(&::U32x2), true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 2] = [&::U32x2, &::U32x2]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld2.v2i32.p0v2i32")
-        },
-        "ld2_s64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::I64, Some(&::I64x1), true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 2] = [&::I64x1, &::I64x1]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld2.v1i64.p0v1i64")
-        },
-        "ld2_u64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::U64, Some(&::U64x1), true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 2] = [&::U64x1, &::U64x1]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld2.v1i64.p0v1i64")
-        },
-        "ld2_f32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::F32, Some(&::F32x2), true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 2] = [&::F32x2, &::F32x2]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld2.v2f32.p0v2f32")
-        },
-        "ld2_f64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::F64, Some(&::F64x1), true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 2] = [&::F64x1, &::F64x1]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld2.v1f64.p0v1f64")
-        },
-        "ld2q_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::I8, Some(&::I8x16), true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 2] = [&::I8x16, &::I8x16]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld2.v16i8.p0v16i8")
-        },
-        "ld2q_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::U8, Some(&::U8x16), true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 2] = [&::U8x16, &::U8x16]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld2.v16i8.p0v16i8")
-        },
-        "ld2q_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::I16, Some(&::I16x8), true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 2] = [&::I16x8, &::I16x8]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld2.v8i16.p0v8i16")
-        },
-        "ld2q_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::U16, Some(&::U16x8), true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 2] = [&::U16x8, &::U16x8]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld2.v8i16.p0v8i16")
-        },
-        "ld2q_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::I32, Some(&::I32x4), true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 2] = [&::I32x4, &::I32x4]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld2.v4i32.p0v4i32")
-        },
-        "ld2q_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::U32, Some(&::U32x4), true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 2] = [&::U32x4, &::U32x4]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld2.v4i32.p0v4i32")
-        },
-        "ld2q_s64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::I64, Some(&::I64x2), true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 2] = [&::I64x2, &::I64x2]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld2.v2i64.p0v2i64")
-        },
-        "ld2q_u64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::U64, Some(&::U64x2), true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 2] = [&::U64x2, &::U64x2]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld2.v2i64.p0v2i64")
-        },
-        "ld2q_f32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::F32, Some(&::F32x4), true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 2] = [&::F32x4, &::F32x4]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld2.v4f32.p0v4f32")
-        },
-        "ld2q_f64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::F64, Some(&::F64x2), true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 2] = [&::F64x2, &::F64x2]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld2.v2f64.p0v2f64")
-        },
-        "ld3_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::I8, Some(&::I8x8), true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 3] = [&::I8x8, &::I8x8, &::I8x8]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld3.v8i8.p0v8i8")
-        },
-        "ld3_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::U8, Some(&::U8x8), true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 3] = [&::U8x8, &::U8x8, &::U8x8]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld3.v8i8.p0v8i8")
-        },
-        "ld3_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::I16, Some(&::I16x4), true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 3] = [&::I16x4, &::I16x4, &::I16x4]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld3.v4i16.p0v4i16")
-        },
-        "ld3_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::U16, Some(&::U16x4), true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 3] = [&::U16x4, &::U16x4, &::U16x4]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld3.v4i16.p0v4i16")
-        },
-        "ld3_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::I32, Some(&::I32x2), true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 3] = [&::I32x2, &::I32x2, &::I32x2]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld3.v2i32.p0v2i32")
-        },
-        "ld3_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::U32, Some(&::U32x2), true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 3] = [&::U32x2, &::U32x2, &::U32x2]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld3.v2i32.p0v2i32")
-        },
-        "ld3_s64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::I64, Some(&::I64x1), true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 3] = [&::I64x1, &::I64x1, &::I64x1]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld3.v1i64.p0v1i64")
-        },
-        "ld3_u64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::U64, Some(&::U64x1), true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 3] = [&::U64x1, &::U64x1, &::U64x1]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld3.v1i64.p0v1i64")
-        },
-        "ld3_f32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::F32, Some(&::F32x2), true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 3] = [&::F32x2, &::F32x2, &::F32x2]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld3.v2f32.p0v2f32")
-        },
-        "ld3_f64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::F64, Some(&::F64x1), true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 3] = [&::F64x1, &::F64x1, &::F64x1]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld3.v1f64.p0v1f64")
-        },
-        "ld3q_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::I8, Some(&::I8x16), true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 3] = [&::I8x16, &::I8x16, &::I8x16]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld3.v16i8.p0v16i8")
-        },
-        "ld3q_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::U8, Some(&::U8x16), true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 3] = [&::U8x16, &::U8x16, &::U8x16]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld3.v16i8.p0v16i8")
-        },
-        "ld3q_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::I16, Some(&::I16x8), true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 3] = [&::I16x8, &::I16x8, &::I16x8]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld3.v8i16.p0v8i16")
-        },
-        "ld3q_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::U16, Some(&::U16x8), true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 3] = [&::U16x8, &::U16x8, &::U16x8]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld3.v8i16.p0v8i16")
-        },
-        "ld3q_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::I32, Some(&::I32x4), true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 3] = [&::I32x4, &::I32x4, &::I32x4]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld3.v4i32.p0v4i32")
-        },
-        "ld3q_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::U32, Some(&::U32x4), true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 3] = [&::U32x4, &::U32x4, &::U32x4]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld3.v4i32.p0v4i32")
-        },
-        "ld3q_s64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::I64, Some(&::I64x2), true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 3] = [&::I64x2, &::I64x2, &::I64x2]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld3.v2i64.p0v2i64")
-        },
-        "ld3q_u64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::U64, Some(&::U64x2), true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 3] = [&::U64x2, &::U64x2, &::U64x2]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld3.v2i64.p0v2i64")
-        },
-        "ld3q_f32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::F32, Some(&::F32x4), true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 3] = [&::F32x4, &::F32x4, &::F32x4]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld3.v4f32.p0v4f32")
-        },
-        "ld3q_f64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::F64, Some(&::F64x2), true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 3] = [&::F64x2, &::F64x2, &::F64x2]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld3.v2f64.p0v2f64")
-        },
-        "ld4_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::I8, Some(&::I8x8), true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 4] = [&::I8x8, &::I8x8, &::I8x8, &::I8x8]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld4.v8i8.p0v8i8")
-        },
-        "ld4_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::U8, Some(&::U8x8), true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 4] = [&::U8x8, &::U8x8, &::U8x8, &::U8x8]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld4.v8i8.p0v8i8")
-        },
-        "ld4_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::I16, Some(&::I16x4), true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 4] = [&::I16x4, &::I16x4, &::I16x4, &::I16x4]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld4.v4i16.p0v4i16")
-        },
-        "ld4_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::U16, Some(&::U16x4), true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 4] = [&::U16x4, &::U16x4, &::U16x4, &::U16x4]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld4.v4i16.p0v4i16")
-        },
-        "ld4_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::I32, Some(&::I32x2), true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 4] = [&::I32x2, &::I32x2, &::I32x2, &::I32x2]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld4.v2i32.p0v2i32")
-        },
-        "ld4_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::U32, Some(&::U32x2), true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 4] = [&::U32x2, &::U32x2, &::U32x2, &::U32x2]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld4.v2i32.p0v2i32")
-        },
-        "ld4_s64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::I64, Some(&::I64x1), true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 4] = [&::I64x1, &::I64x1, &::I64x1, &::I64x1]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld4.v1i64.p0v1i64")
-        },
-        "ld4_u64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::U64, Some(&::U64x1), true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 4] = [&::U64x1, &::U64x1, &::U64x1, &::U64x1]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld4.v1i64.p0v1i64")
-        },
-        "ld4_f32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::F32, Some(&::F32x2), true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 4] = [&::F32x2, &::F32x2, &::F32x2, &::F32x2]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld4.v2f32.p0v2f32")
-        },
-        "ld4_f64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::F64, Some(&::F64x1), true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 4] = [&::F64x1, &::F64x1, &::F64x1, &::F64x1]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld4.v1f64.p0v1f64")
-        },
-        "ld4q_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::I8, Some(&::I8x16), true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 4] = [&::I8x16, &::I8x16, &::I8x16, &::I8x16]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld4.v16i8.p0v16i8")
-        },
-        "ld4q_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::U8, Some(&::U8x16), true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 4] = [&::U8x16, &::U8x16, &::U8x16, &::U8x16]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld4.v16i8.p0v16i8")
-        },
-        "ld4q_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::I16, Some(&::I16x8), true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 4] = [&::I16x8, &::I16x8, &::I16x8, &::I16x8]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld4.v8i16.p0v8i16")
-        },
-        "ld4q_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::U16, Some(&::U16x8), true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 4] = [&::U16x8, &::U16x8, &::U16x8, &::U16x8]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld4.v8i16.p0v8i16")
-        },
-        "ld4q_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::I32, Some(&::I32x4), true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 4] = [&::I32x4, &::I32x4, &::I32x4, &::I32x4]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld4.v4i32.p0v4i32")
-        },
-        "ld4q_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::U32, Some(&::U32x4), true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 4] = [&::U32x4, &::U32x4, &::U32x4, &::U32x4]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld4.v4i32.p0v4i32")
-        },
-        "ld4q_s64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::I64, Some(&::I64x2), true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 4] = [&::I64x2, &::I64x2, &::I64x2, &::I64x2]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld4.v2i64.p0v2i64")
-        },
-        "ld4q_u64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::U64, Some(&::U64x2), true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 4] = [&::U64x2, &::U64x2, &::U64x2, &::U64x2]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld4.v2i64.p0v2i64")
-        },
-        "ld4q_f32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::F32, Some(&::F32x4), true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 4] = [&::F32x4, &::F32x4, &::F32x4, &::F32x4]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld4.v4f32.p0v4f32")
-        },
-        "ld4q_f64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::F64, Some(&::F64x2), true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 4] = [&::F64x2, &::F64x2, &::F64x2, &::F64x2]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld4.v2f64.p0v2f64")
-        },
-        "ld2_dup_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::I8, None, true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 2] = [&::I8x8, &::I8x8]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld2.v8i8.p0i8")
-        },
-        "ld2_dup_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::U8, None, true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 2] = [&::U8x8, &::U8x8]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld2.v8i8.p0i8")
-        },
-        "ld2_dup_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::I16, None, true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 2] = [&::I16x4, &::I16x4]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld2.v4i16.p0i16")
-        },
-        "ld2_dup_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::U16, None, true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 2] = [&::U16x4, &::U16x4]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld2.v4i16.p0i16")
-        },
-        "ld2_dup_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::I32, None, true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 2] = [&::I32x2, &::I32x2]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld2.v2i32.p0i32")
-        },
-        "ld2_dup_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::U32, None, true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 2] = [&::U32x2, &::U32x2]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld2.v2i32.p0i32")
-        },
-        "ld2_dup_s64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::I64, None, true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 2] = [&::I64x1, &::I64x1]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld2.v1i64.p0i64")
-        },
-        "ld2_dup_u64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::U64, None, true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 2] = [&::U64x1, &::U64x1]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld2.v1i64.p0i64")
-        },
-        "ld2_dup_f32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::F32, None, true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 2] = [&::F32x2, &::F32x2]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld2.v2f32.p0f32")
-        },
-        "ld2_dup_f64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::F64, None, true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 2] = [&::F64x1, &::F64x1]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld2.v1f64.p0f64")
-        },
-        "ld2q_dup_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::I8, None, true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 2] = [&::I8x16, &::I8x16]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld2.v16i8.p0i8")
-        },
-        "ld2q_dup_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::U8, None, true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 2] = [&::U8x16, &::U8x16]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld2.v16i8.p0i8")
-        },
-        "ld2q_dup_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::I16, None, true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 2] = [&::I16x8, &::I16x8]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld2.v8i16.p0i16")
-        },
-        "ld2q_dup_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::U16, None, true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 2] = [&::U16x8, &::U16x8]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld2.v8i16.p0i16")
-        },
-        "ld2q_dup_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::I32, None, true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 2] = [&::I32x4, &::I32x4]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld2.v4i32.p0i32")
-        },
-        "ld2q_dup_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::U32, None, true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 2] = [&::U32x4, &::U32x4]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld2.v4i32.p0i32")
-        },
-        "ld2q_dup_s64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::I64, None, true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 2] = [&::I64x2, &::I64x2]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld2.v2i64.p0i64")
-        },
-        "ld2q_dup_u64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::U64, None, true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 2] = [&::U64x2, &::U64x2]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld2.v2i64.p0i64")
-        },
-        "ld2q_dup_f32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::F32, None, true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 2] = [&::F32x4, &::F32x4]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld2.v4f32.p0f32")
-        },
-        "ld2q_dup_f64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::F64, None, true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 2] = [&::F64x2, &::F64x2]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld2.v2f64.p0f64")
-        },
-        "ld3_dup_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::I8, None, true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 3] = [&::I8x8, &::I8x8, &::I8x8]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld3.v8i8.p0i8")
-        },
-        "ld3_dup_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::U8, None, true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 3] = [&::U8x8, &::U8x8, &::U8x8]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld3.v8i8.p0i8")
-        },
-        "ld3_dup_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::I16, None, true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 3] = [&::I16x4, &::I16x4, &::I16x4]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld3.v4i16.p0i16")
-        },
-        "ld3_dup_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::U16, None, true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 3] = [&::U16x4, &::U16x4, &::U16x4]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld3.v4i16.p0i16")
-        },
-        "ld3_dup_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::I32, None, true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 3] = [&::I32x2, &::I32x2, &::I32x2]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld3.v2i32.p0i32")
-        },
-        "ld3_dup_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::U32, None, true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 3] = [&::U32x2, &::U32x2, &::U32x2]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld3.v2i32.p0i32")
-        },
-        "ld3_dup_s64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::I64, None, true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 3] = [&::I64x1, &::I64x1, &::I64x1]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld3.v1i64.p0i64")
-        },
-        "ld3_dup_u64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::U64, None, true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 3] = [&::U64x1, &::U64x1, &::U64x1]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld3.v1i64.p0i64")
-        },
-        "ld3_dup_f32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::F32, None, true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 3] = [&::F32x2, &::F32x2, &::F32x2]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld3.v2f32.p0f32")
-        },
-        "ld3_dup_f64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::F64, None, true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 3] = [&::F64x1, &::F64x1, &::F64x1]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld3.v1f64.p0f64")
-        },
-        "ld3q_dup_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::I8, None, true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 3] = [&::I8x16, &::I8x16, &::I8x16]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld3.v16i8.p0i8")
-        },
-        "ld3q_dup_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::U8, None, true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 3] = [&::U8x16, &::U8x16, &::U8x16]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld3.v16i8.p0i8")
-        },
-        "ld3q_dup_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::I16, None, true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 3] = [&::I16x8, &::I16x8, &::I16x8]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld3.v8i16.p0i16")
-        },
-        "ld3q_dup_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::U16, None, true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 3] = [&::U16x8, &::U16x8, &::U16x8]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld3.v8i16.p0i16")
-        },
-        "ld3q_dup_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::I32, None, true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 3] = [&::I32x4, &::I32x4, &::I32x4]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld3.v4i32.p0i32")
-        },
-        "ld3q_dup_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::U32, None, true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 3] = [&::U32x4, &::U32x4, &::U32x4]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld3.v4i32.p0i32")
-        },
-        "ld3q_dup_s64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::I64, None, true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 3] = [&::I64x2, &::I64x2, &::I64x2]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld3.v2i64.p0i64")
-        },
-        "ld3q_dup_u64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::U64, None, true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 3] = [&::U64x2, &::U64x2, &::U64x2]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld3.v2i64.p0i64")
-        },
-        "ld3q_dup_f32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::F32, None, true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 3] = [&::F32x4, &::F32x4, &::F32x4]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld3.v4f32.p0f32")
-        },
-        "ld3q_dup_f64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::F64, None, true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 3] = [&::F64x2, &::F64x2, &::F64x2]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld3.v2f64.p0f64")
-        },
-        "ld4_dup_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::I8, None, true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 4] = [&::I8x8, &::I8x8, &::I8x8, &::I8x8]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld4.v8i8.p0i8")
-        },
-        "ld4_dup_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::U8, None, true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 4] = [&::U8x8, &::U8x8, &::U8x8, &::U8x8]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld4.v8i8.p0i8")
-        },
-        "ld4_dup_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::I16, None, true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 4] = [&::I16x4, &::I16x4, &::I16x4, &::I16x4]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld4.v4i16.p0i16")
-        },
-        "ld4_dup_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::U16, None, true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 4] = [&::U16x4, &::U16x4, &::U16x4, &::U16x4]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld4.v4i16.p0i16")
-        },
-        "ld4_dup_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::I32, None, true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 4] = [&::I32x2, &::I32x2, &::I32x2, &::I32x2]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld4.v2i32.p0i32")
-        },
-        "ld4_dup_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::U32, None, true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 4] = [&::U32x2, &::U32x2, &::U32x2, &::U32x2]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld4.v2i32.p0i32")
-        },
-        "ld4_dup_s64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::I64, None, true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 4] = [&::I64x1, &::I64x1, &::I64x1, &::I64x1]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld4.v1i64.p0i64")
-        },
-        "ld4_dup_u64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::U64, None, true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 4] = [&::U64x1, &::U64x1, &::U64x1, &::U64x1]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld4.v1i64.p0i64")
-        },
-        "ld4_dup_f32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::F32, None, true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 4] = [&::F32x2, &::F32x2, &::F32x2, &::F32x2]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld4.v2f32.p0f32")
-        },
-        "ld4_dup_f64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::F64, None, true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 4] = [&::F64x1, &::F64x1, &::F64x1, &::F64x1]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld4.v1f64.p0f64")
-        },
-        "ld4q_dup_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::I8, None, true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 4] = [&::I8x16, &::I8x16, &::I8x16, &::I8x16]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld4.v16i8.p0i8")
-        },
-        "ld4q_dup_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::U8, None, true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 4] = [&::U8x16, &::U8x16, &::U8x16, &::U8x16]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld4.v16i8.p0i8")
-        },
-        "ld4q_dup_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::I16, None, true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 4] = [&::I16x8, &::I16x8, &::I16x8, &::I16x8]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld4.v8i16.p0i16")
-        },
-        "ld4q_dup_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::U16, None, true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 4] = [&::U16x8, &::U16x8, &::U16x8, &::U16x8]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld4.v8i16.p0i16")
-        },
-        "ld4q_dup_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::I32, None, true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 4] = [&::I32x4, &::I32x4, &::I32x4, &::I32x4]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld4.v4i32.p0i32")
-        },
-        "ld4q_dup_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::U32, None, true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 4] = [&::U32x4, &::U32x4, &::U32x4, &::U32x4]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld4.v4i32.p0i32")
-        },
-        "ld4q_dup_s64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::I64, None, true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 4] = [&::I64x2, &::I64x2, &::I64x2, &::I64x2]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld4.v2i64.p0i64")
-        },
-        "ld4q_dup_u64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::U64, None, true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 4] = [&::U64x2, &::U64x2, &::U64x2, &::U64x2]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld4.v2i64.p0i64")
-        },
-        "ld4q_dup_f32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::F32, None, true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 4] = [&::F32x4, &::F32x4, &::F32x4, &::F32x4]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld4.v4f32.p0f32")
-        },
-        "ld4q_dup_f64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::F64, None, true); &PTR }]; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 4] = [&::F64x2, &::F64x2, &::F64x2, &::F64x2]; &PARTS }); &AGG },
-            definition: Named("llvm.aarch64.neon.ld4.v2f64.p0f64")
-        },
-        "padd_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x8, &::I8x8]; &INPUTS },
-            output: &::I8x8,
-            definition: Named("llvm.aarch64.neon.addp.v8i8")
-        },
-        "padd_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x8, &::U8x8]; &INPUTS },
-            output: &::U8x8,
-            definition: Named("llvm.aarch64.neon.addp.v8i8")
-        },
-        "padd_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x4, &::I16x4]; &INPUTS },
-            output: &::I16x4,
-            definition: Named("llvm.aarch64.neon.addp.v4i16")
-        },
-        "padd_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x4, &::U16x4]; &INPUTS },
-            output: &::U16x4,
-            definition: Named("llvm.aarch64.neon.addp.v4i16")
-        },
-        "padd_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x2, &::I32x2]; &INPUTS },
-            output: &::I32x2,
-            definition: Named("llvm.aarch64.neon.addp.v2i32")
-        },
-        "padd_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x2, &::U32x2]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.aarch64.neon.addp.v2i32")
-        },
-        "padd_f32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F32x2, &::F32x2]; &INPUTS },
-            output: &::F32x2,
-            definition: Named("llvm.aarch64.neon.addp.v2f32")
-        },
-        "paddq_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x16, &::I8x16]; &INPUTS },
-            output: &::I8x16,
-            definition: Named("llvm.aarch64.neon.addp.v16i8")
-        },
-        "paddq_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x16, &::U8x16]; &INPUTS },
-            output: &::U8x16,
-            definition: Named("llvm.aarch64.neon.addp.v16i8")
-        },
-        "paddq_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x8, &::I16x8]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.aarch64.neon.addp.v8i16")
-        },
-        "paddq_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x8, &::U16x8]; &INPUTS },
-            output: &::U16x8,
-            definition: Named("llvm.aarch64.neon.addp.v8i16")
-        },
-        "paddq_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x4, &::I32x4]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.aarch64.neon.addp.v4i32")
-        },
-        "paddq_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x4, &::U32x4]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.aarch64.neon.addp.v4i32")
-        },
-        "paddq_f32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F32x4, &::F32x4]; &INPUTS },
-            output: &::F32x4,
-            definition: Named("llvm.aarch64.neon.addp.v4f32")
-        },
-        "paddq_s64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I64x2, &::I64x2]; &INPUTS },
-            output: &::I64x2,
-            definition: Named("llvm.aarch64.neon.addp.v2i64")
-        },
-        "paddq_u64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U64x2, &::U64x2]; &INPUTS },
-            output: &::U64x2,
-            definition: Named("llvm.aarch64.neon.addp.v2i64")
-        },
-        "paddq_f64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F64x2, &::F64x2]; &INPUTS },
-            output: &::F64x2,
-            definition: Named("llvm.aarch64.neon.addp.v2f64")
-        },
-        "paddl_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I8x8]; &INPUTS },
-            output: &::I16x4,
-            definition: Named("llvm.aarch64.neon.saddlp.v4i16.v8i8")
-        },
-        "paddl_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U8x8]; &INPUTS },
-            output: &::U16x4,
-            definition: Named("llvm.aarch64.neon.uaddlp.v4i16.v8i8")
-        },
-        "paddl_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I16x4]; &INPUTS },
-            output: &::I32x2,
-            definition: Named("llvm.aarch64.neon.saddlp.v2i32.v4i16")
-        },
-        "paddl_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U16x4]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.aarch64.neon.uaddlp.v2i32.v4i16")
-        },
-        "paddl_s64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I32x2]; &INPUTS },
-            output: &::I64x1,
-            definition: Named("llvm.aarch64.neon.saddlp.v1i64.v2i32")
-        },
-        "paddl_u64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U32x2]; &INPUTS },
-            output: &::U64x1,
-            definition: Named("llvm.aarch64.neon.uaddlp.v1i64.v2i32")
-        },
-        "paddlq_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I8x16]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.aarch64.neon.saddlp.v8i16.v16i8")
-        },
-        "paddlq_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U8x16]; &INPUTS },
-            output: &::U16x8,
-            definition: Named("llvm.aarch64.neon.uaddlp.v8i16.v16i8")
-        },
-        "paddlq_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I16x8]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.aarch64.neon.saddlp.v4i32.v8i16")
-        },
-        "paddlq_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U16x8]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.aarch64.neon.uaddlp.v4i32.v8i16")
-        },
-        "paddlq_s64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I32x4]; &INPUTS },
-            output: &::I64x2,
-            definition: Named("llvm.aarch64.neon.saddlp.v2i64.v4i32")
-        },
-        "paddlq_u64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U32x4]; &INPUTS },
-            output: &::U64x2,
-            definition: Named("llvm.aarch64.neon.uaddlp.v2i64.v4i32")
-        },
-        "pmax_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x8, &::I8x8]; &INPUTS },
-            output: &::I8x8,
-            definition: Named("llvm.aarch64.neon.smaxp.v8i8")
-        },
-        "pmax_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x8, &::U8x8]; &INPUTS },
-            output: &::U8x8,
-            definition: Named("llvm.aarch64.neon.umaxp.v8i8")
-        },
-        "pmax_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x4, &::I16x4]; &INPUTS },
-            output: &::I16x4,
-            definition: Named("llvm.aarch64.neon.smaxp.v4i16")
-        },
-        "pmax_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x4, &::U16x4]; &INPUTS },
-            output: &::U16x4,
-            definition: Named("llvm.aarch64.neon.umaxp.v4i16")
-        },
-        "pmax_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x2, &::I32x2]; &INPUTS },
-            output: &::I32x2,
-            definition: Named("llvm.aarch64.neon.smaxp.v2i32")
-        },
-        "pmax_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x2, &::U32x2]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.aarch64.neon.umaxp.v2i32")
-        },
-        "pmax_f32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F32x2, &::F32x2]; &INPUTS },
-            output: &::F32x2,
-            definition: Named("llvm.aarch64.neon.fmaxp.v2f32")
-        },
-        "pmaxq_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x16, &::I8x16]; &INPUTS },
-            output: &::I8x16,
-            definition: Named("llvm.aarch64.neon.smaxp.v16i8")
-        },
-        "pmaxq_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x16, &::U8x16]; &INPUTS },
-            output: &::U8x16,
-            definition: Named("llvm.aarch64.neon.umaxp.v16i8")
-        },
-        "pmaxq_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x8, &::I16x8]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.aarch64.neon.smaxp.v8i16")
-        },
-        "pmaxq_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x8, &::U16x8]; &INPUTS },
-            output: &::U16x8,
-            definition: Named("llvm.aarch64.neon.umaxp.v8i16")
-        },
-        "pmaxq_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x4, &::I32x4]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.aarch64.neon.smaxp.v4i32")
-        },
-        "pmaxq_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x4, &::U32x4]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.aarch64.neon.umaxp.v4i32")
-        },
-        "pmaxq_f32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F32x4, &::F32x4]; &INPUTS },
-            output: &::F32x4,
-            definition: Named("llvm.aarch64.neon.fmaxp.v4f32")
-        },
-        "pmaxq_s64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I64x2, &::I64x2]; &INPUTS },
-            output: &::I64x2,
-            definition: Named("llvm.aarch64.neon.smaxp.v2i64")
-        },
-        "pmaxq_u64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U64x2, &::U64x2]; &INPUTS },
-            output: &::U64x2,
-            definition: Named("llvm.aarch64.neon.umaxp.v2i64")
-        },
-        "pmaxq_f64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F64x2, &::F64x2]; &INPUTS },
-            output: &::F64x2,
-            definition: Named("llvm.aarch64.neon.fmaxp.v2f64")
-        },
-        "pmin_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x8, &::I8x8]; &INPUTS },
-            output: &::I8x8,
-            definition: Named("llvm.aarch64.neon.sminp.v8i8")
-        },
-        "pmin_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x8, &::U8x8]; &INPUTS },
-            output: &::U8x8,
-            definition: Named("llvm.aarch64.neon.uminp.v8i8")
-        },
-        "pmin_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x4, &::I16x4]; &INPUTS },
-            output: &::I16x4,
-            definition: Named("llvm.aarch64.neon.sminp.v4i16")
-        },
-        "pmin_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x4, &::U16x4]; &INPUTS },
-            output: &::U16x4,
-            definition: Named("llvm.aarch64.neon.uminp.v4i16")
-        },
-        "pmin_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x2, &::I32x2]; &INPUTS },
-            output: &::I32x2,
-            definition: Named("llvm.aarch64.neon.sminp.v2i32")
-        },
-        "pmin_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x2, &::U32x2]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.aarch64.neon.uminp.v2i32")
-        },
-        "pmin_f32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F32x2, &::F32x2]; &INPUTS },
-            output: &::F32x2,
-            definition: Named("llvm.aarch64.neon.fminp.v2f32")
-        },
-        "pminq_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x16, &::I8x16]; &INPUTS },
-            output: &::I8x16,
-            definition: Named("llvm.aarch64.neon.sminp.v16i8")
-        },
-        "pminq_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x16, &::U8x16]; &INPUTS },
-            output: &::U8x16,
-            definition: Named("llvm.aarch64.neon.uminp.v16i8")
-        },
-        "pminq_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x8, &::I16x8]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.aarch64.neon.sminp.v8i16")
-        },
-        "pminq_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x8, &::U16x8]; &INPUTS },
-            output: &::U16x8,
-            definition: Named("llvm.aarch64.neon.uminp.v8i16")
-        },
-        "pminq_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x4, &::I32x4]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.aarch64.neon.sminp.v4i32")
-        },
-        "pminq_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x4, &::U32x4]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.aarch64.neon.uminp.v4i32")
-        },
-        "pminq_f32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F32x4, &::F32x4]; &INPUTS },
-            output: &::F32x4,
-            definition: Named("llvm.aarch64.neon.fminp.v4f32")
-        },
-        "pminq_s64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I64x2, &::I64x2]; &INPUTS },
-            output: &::I64x2,
-            definition: Named("llvm.aarch64.neon.sminp.v2i64")
-        },
-        "pminq_u64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U64x2, &::U64x2]; &INPUTS },
-            output: &::U64x2,
-            definition: Named("llvm.aarch64.neon.uminp.v2i64")
-        },
-        "pminq_f64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F64x2, &::F64x2]; &INPUTS },
-            output: &::F64x2,
-            definition: Named("llvm.aarch64.neon.fminp.v2f64")
-        },
-        "pmaxnm_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x8, &::I8x8]; &INPUTS },
-            output: &::I8x8,
-            definition: Named("llvm.aarch64.neon.smaxnmp.v8i8")
-        },
-        "pmaxnm_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x8, &::U8x8]; &INPUTS },
-            output: &::U8x8,
-            definition: Named("llvm.aarch64.neon.umaxnmp.v8i8")
-        },
-        "pmaxnm_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x4, &::I16x4]; &INPUTS },
-            output: &::I16x4,
-            definition: Named("llvm.aarch64.neon.smaxnmp.v4i16")
-        },
-        "pmaxnm_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x4, &::U16x4]; &INPUTS },
-            output: &::U16x4,
-            definition: Named("llvm.aarch64.neon.umaxnmp.v4i16")
-        },
-        "pmaxnm_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x2, &::I32x2]; &INPUTS },
-            output: &::I32x2,
-            definition: Named("llvm.aarch64.neon.smaxnmp.v2i32")
-        },
-        "pmaxnm_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x2, &::U32x2]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.aarch64.neon.umaxnmp.v2i32")
-        },
-        "pmaxnm_f32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F32x2, &::F32x2]; &INPUTS },
-            output: &::F32x2,
-            definition: Named("llvm.aarch64.neon.fmaxnmp.v2f32")
-        },
-        "pmaxnmq_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x16, &::I8x16]; &INPUTS },
-            output: &::I8x16,
-            definition: Named("llvm.aarch64.neon.smaxnmp.v16i8")
-        },
-        "pmaxnmq_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x16, &::U8x16]; &INPUTS },
-            output: &::U8x16,
-            definition: Named("llvm.aarch64.neon.umaxnmp.v16i8")
-        },
-        "pmaxnmq_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x8, &::I16x8]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.aarch64.neon.smaxnmp.v8i16")
-        },
-        "pmaxnmq_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x8, &::U16x8]; &INPUTS },
-            output: &::U16x8,
-            definition: Named("llvm.aarch64.neon.umaxnmp.v8i16")
-        },
-        "pmaxnmq_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x4, &::I32x4]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.aarch64.neon.smaxnmp.v4i32")
-        },
-        "pmaxnmq_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x4, &::U32x4]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.aarch64.neon.umaxnmp.v4i32")
-        },
-        "pmaxnmq_f32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F32x4, &::F32x4]; &INPUTS },
-            output: &::F32x4,
-            definition: Named("llvm.aarch64.neon.fmaxnmp.v4f32")
-        },
-        "pmaxnmq_s64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I64x2, &::I64x2]; &INPUTS },
-            output: &::I64x2,
-            definition: Named("llvm.aarch64.neon.smaxnmp.v2i64")
-        },
-        "pmaxnmq_u64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U64x2, &::U64x2]; &INPUTS },
-            output: &::U64x2,
-            definition: Named("llvm.aarch64.neon.umaxnmp.v2i64")
-        },
-        "pmaxnmq_f64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F64x2, &::F64x2]; &INPUTS },
-            output: &::F64x2,
-            definition: Named("llvm.aarch64.neon.fmaxnmp.v2f64")
-        },
-        "pminnm_f32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F32x2, &::F32x2]; &INPUTS },
-            output: &::F32x2,
-            definition: Named("llvm.aarch64.neon.fminnmp.v2f32")
-        },
-        "pminnmq_f32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F32x4, &::F32x4]; &INPUTS },
-            output: &::F32x4,
-            definition: Named("llvm.aarch64.neon.fminnmp.v4f32")
-        },
-        "pminnmq_f64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F64x2, &::F64x2]; &INPUTS },
-            output: &::F64x2,
-            definition: Named("llvm.aarch64.neon.fminnmp.v2f64")
-        },
-        "addv_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I8x8]; &INPUTS },
-            output: &::I8,
-            definition: Named("llvm.aarch64.neon.saddv.i8.v8i8")
-        },
-        "addv_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U8x8]; &INPUTS },
-            output: &::U8,
-            definition: Named("llvm.aarch64.neon.uaddv.i8.v8i8")
-        },
-        "addv_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I16x4]; &INPUTS },
-            output: &::I16,
-            definition: Named("llvm.aarch64.neon.saddv.i16.v4i16")
-        },
-        "addv_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U16x4]; &INPUTS },
-            output: &::U16,
-            definition: Named("llvm.aarch64.neon.uaddv.i16.v4i16")
-        },
-        "addv_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I32x2]; &INPUTS },
-            output: &::I32,
-            definition: Named("llvm.aarch64.neon.saddv.i32.v2i32")
-        },
-        "addv_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U32x2]; &INPUTS },
-            output: &::U32,
-            definition: Named("llvm.aarch64.neon.uaddv.i32.v2i32")
-        },
-        "addv_f32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::F32x2]; &INPUTS },
-            output: &::F32,
-            definition: Named("llvm.aarch64.neon.faddv.f32.v2f32")
-        },
-        "addvq_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I8x16]; &INPUTS },
-            output: &::I8,
-            definition: Named("llvm.aarch64.neon.saddv.i8.v16i8")
-        },
-        "addvq_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U8x16]; &INPUTS },
-            output: &::U8,
-            definition: Named("llvm.aarch64.neon.uaddv.i8.v16i8")
-        },
-        "addvq_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I16x8]; &INPUTS },
-            output: &::I16,
-            definition: Named("llvm.aarch64.neon.saddv.i16.v8i16")
-        },
-        "addvq_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U16x8]; &INPUTS },
-            output: &::U16,
-            definition: Named("llvm.aarch64.neon.uaddv.i16.v8i16")
-        },
-        "addvq_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I32x4]; &INPUTS },
-            output: &::I32,
-            definition: Named("llvm.aarch64.neon.saddv.i32.v4i32")
-        },
-        "addvq_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U32x4]; &INPUTS },
-            output: &::U32,
-            definition: Named("llvm.aarch64.neon.uaddv.i32.v4i32")
-        },
-        "addvq_f32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::F32x4]; &INPUTS },
-            output: &::F32,
-            definition: Named("llvm.aarch64.neon.faddv.f32.v4f32")
-        },
-        "addvq_s64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I64x2]; &INPUTS },
-            output: &::I64,
-            definition: Named("llvm.aarch64.neon.saddv.i64.v2i64")
-        },
-        "addvq_u64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U64x2]; &INPUTS },
-            output: &::U64,
-            definition: Named("llvm.aarch64.neon.uaddv.i64.v2i64")
-        },
-        "addvq_f64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::F64x2]; &INPUTS },
-            output: &::F64,
-            definition: Named("llvm.aarch64.neon.faddv.f64.v2f64")
-        },
-        "addlv_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I8x8]; &INPUTS },
-            output: &::I16,
-            definition: Named("llvm.aarch64.neon.saddlv.i16.v8i8")
-        },
-        "addlv_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U8x8]; &INPUTS },
-            output: &::U16,
-            definition: Named("llvm.aarch64.neon.uaddlv.i16.v8i8")
-        },
-        "addlv_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I16x4]; &INPUTS },
-            output: &::I32,
-            definition: Named("llvm.aarch64.neon.saddlv.i32.v4i16")
-        },
-        "addlv_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U16x4]; &INPUTS },
-            output: &::U32,
-            definition: Named("llvm.aarch64.neon.uaddlv.i32.v4i16")
-        },
-        "addlv_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I32x2]; &INPUTS },
-            output: &::I64,
-            definition: Named("llvm.aarch64.neon.saddlv.i64.v2i32")
-        },
-        "addlv_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U32x2]; &INPUTS },
-            output: &::U64,
-            definition: Named("llvm.aarch64.neon.uaddlv.i64.v2i32")
-        },
-        "addlvq_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I8x16]; &INPUTS },
-            output: &::I16,
-            definition: Named("llvm.aarch64.neon.saddlv.i16.v16i8")
-        },
-        "addlvq_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U8x16]; &INPUTS },
-            output: &::U16,
-            definition: Named("llvm.aarch64.neon.uaddlv.i16.v16i8")
-        },
-        "addlvq_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I16x8]; &INPUTS },
-            output: &::I32,
-            definition: Named("llvm.aarch64.neon.saddlv.i32.v8i16")
-        },
-        "addlvq_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U16x8]; &INPUTS },
-            output: &::U32,
-            definition: Named("llvm.aarch64.neon.uaddlv.i32.v8i16")
-        },
-        "addlvq_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I32x4]; &INPUTS },
-            output: &::I64,
-            definition: Named("llvm.aarch64.neon.saddlv.i64.v4i32")
-        },
-        "addlvq_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U32x4]; &INPUTS },
-            output: &::U64,
-            definition: Named("llvm.aarch64.neon.uaddlv.i64.v4i32")
-        },
-        "maxv_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I8x8]; &INPUTS },
-            output: &::I8,
-            definition: Named("llvm.aarch64.neon.smaxv.i8.v8i8")
-        },
-        "maxv_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U8x8]; &INPUTS },
-            output: &::U8,
-            definition: Named("llvm.aarch64.neon.umaxv.i8.v8i8")
-        },
-        "maxv_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I16x4]; &INPUTS },
-            output: &::I16,
-            definition: Named("llvm.aarch64.neon.smaxv.i16.v4i16")
-        },
-        "maxv_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U16x4]; &INPUTS },
-            output: &::U16,
-            definition: Named("llvm.aarch64.neon.umaxv.i16.v4i16")
-        },
-        "maxv_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I32x2]; &INPUTS },
-            output: &::I32,
-            definition: Named("llvm.aarch64.neon.smaxv.i32.v2i32")
-        },
-        "maxv_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U32x2]; &INPUTS },
-            output: &::U32,
-            definition: Named("llvm.aarch64.neon.umaxv.i32.v2i32")
-        },
-        "maxv_f32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::F32x2]; &INPUTS },
-            output: &::F32,
-            definition: Named("llvm.aarch64.neon.fmaxv.f32.v2f32")
-        },
-        "maxvq_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I8x16]; &INPUTS },
-            output: &::I8,
-            definition: Named("llvm.aarch64.neon.smaxv.i8.v16i8")
-        },
-        "maxvq_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U8x16]; &INPUTS },
-            output: &::U8,
-            definition: Named("llvm.aarch64.neon.umaxv.i8.v16i8")
-        },
-        "maxvq_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I16x8]; &INPUTS },
-            output: &::I16,
-            definition: Named("llvm.aarch64.neon.smaxv.i16.v8i16")
-        },
-        "maxvq_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U16x8]; &INPUTS },
-            output: &::U16,
-            definition: Named("llvm.aarch64.neon.umaxv.i16.v8i16")
-        },
-        "maxvq_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I32x4]; &INPUTS },
-            output: &::I32,
-            definition: Named("llvm.aarch64.neon.smaxv.i32.v4i32")
-        },
-        "maxvq_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U32x4]; &INPUTS },
-            output: &::U32,
-            definition: Named("llvm.aarch64.neon.umaxv.i32.v4i32")
-        },
-        "maxvq_f32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::F32x4]; &INPUTS },
-            output: &::F32,
-            definition: Named("llvm.aarch64.neon.fmaxv.f32.v4f32")
-        },
-        "maxvq_f64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::F64x2]; &INPUTS },
-            output: &::F64,
-            definition: Named("llvm.aarch64.neon.fmaxv.f64.v2f64")
-        },
-        "minv_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I8x8]; &INPUTS },
-            output: &::I8,
-            definition: Named("llvm.aarch64.neon.sminv.i8.v8i8")
-        },
-        "minv_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U8x8]; &INPUTS },
-            output: &::U8,
-            definition: Named("llvm.aarch64.neon.uminv.i8.v8i8")
-        },
-        "minv_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I16x4]; &INPUTS },
-            output: &::I16,
-            definition: Named("llvm.aarch64.neon.sminv.i16.v4i16")
-        },
-        "minv_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U16x4]; &INPUTS },
-            output: &::U16,
-            definition: Named("llvm.aarch64.neon.uminv.i16.v4i16")
-        },
-        "minv_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I32x2]; &INPUTS },
-            output: &::I32,
-            definition: Named("llvm.aarch64.neon.sminv.i32.v2i32")
-        },
-        "minv_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U32x2]; &INPUTS },
-            output: &::U32,
-            definition: Named("llvm.aarch64.neon.uminv.i32.v2i32")
-        },
-        "minv_f32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::F32x2]; &INPUTS },
-            output: &::F32,
-            definition: Named("llvm.aarch64.neon.fminv.f32.v2f32")
-        },
-        "minvq_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I8x16]; &INPUTS },
-            output: &::I8,
-            definition: Named("llvm.aarch64.neon.sminv.i8.v16i8")
-        },
-        "minvq_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U8x16]; &INPUTS },
-            output: &::U8,
-            definition: Named("llvm.aarch64.neon.uminv.i8.v16i8")
-        },
-        "minvq_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I16x8]; &INPUTS },
-            output: &::I16,
-            definition: Named("llvm.aarch64.neon.sminv.i16.v8i16")
-        },
-        "minvq_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U16x8]; &INPUTS },
-            output: &::U16,
-            definition: Named("llvm.aarch64.neon.uminv.i16.v8i16")
-        },
-        "minvq_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I32x4]; &INPUTS },
-            output: &::I32,
-            definition: Named("llvm.aarch64.neon.sminv.i32.v4i32")
-        },
-        "minvq_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U32x4]; &INPUTS },
-            output: &::U32,
-            definition: Named("llvm.aarch64.neon.uminv.i32.v4i32")
-        },
-        "minvq_f32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::F32x4]; &INPUTS },
-            output: &::F32,
-            definition: Named("llvm.aarch64.neon.fminv.f32.v4f32")
-        },
-        "minvq_f64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::F64x2]; &INPUTS },
-            output: &::F64,
-            definition: Named("llvm.aarch64.neon.fminv.f64.v2f64")
-        },
-        "maxnmv_f32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::F32x2]; &INPUTS },
-            output: &::F32,
-            definition: Named("llvm.aarch64.neon.fmaxnmv.f32.v2f32")
-        },
-        "maxnmvq_f32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::F32x4]; &INPUTS },
-            output: &::F32,
-            definition: Named("llvm.aarch64.neon.fmaxnmv.f32.v4f32")
-        },
-        "maxnmvq_f64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::F64x2]; &INPUTS },
-            output: &::F64,
-            definition: Named("llvm.aarch64.neon.fmaxnmv.f64.v2f64")
-        },
-        "minnmv_f32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::F32x2]; &INPUTS },
-            output: &::F32,
-            definition: Named("llvm.aarch64.neon.fminnmv.f32.v2f32")
-        },
-        "minnmvq_f32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::F32x4]; &INPUTS },
-            output: &::F32,
-            definition: Named("llvm.aarch64.neon.fminnmv.f32.v4f32")
-        },
-        "minnmvq_f64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::F64x2]; &INPUTS },
-            output: &::F64,
-            definition: Named("llvm.aarch64.neon.fminnmv.f64.v2f64")
-        },
-        "qtbl1_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x16, &::U8x8]; &INPUTS },
-            output: &::I8x8,
-            definition: Named("llvm.aarch64.neon.tbl1.v8i8")
-        },
-        "qtbl1_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x16, &::U8x8]; &INPUTS },
-            output: &::U8x8,
-            definition: Named("llvm.aarch64.neon.tbl1.v8i8")
-        },
-        "qtbl1q_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x16, &::U8x16]; &INPUTS },
-            output: &::I8x16,
-            definition: Named("llvm.aarch64.neon.tbl1.v16i8")
-        },
-        "qtbl1q_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x16, &::U8x16]; &INPUTS },
-            output: &::U8x16,
-            definition: Named("llvm.aarch64.neon.tbl1.v16i8")
-        },
-        "qtbx1_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I8x8, &::I8x16, &::U8x8]; &INPUTS },
-            output: &::I8x8,
-            definition: Named("llvm.aarch64.neon.tbx1.v8i8")
-        },
-        "qtbx1_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U8x8, &::U8x16, &::U8x8]; &INPUTS },
-            output: &::U8x8,
-            definition: Named("llvm.aarch64.neon.tbx1.v8i8")
-        },
-        "qtbx1q_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I8x16, &::I8x16, &::U8x16]; &INPUTS },
-            output: &::I8x16,
-            definition: Named("llvm.aarch64.neon.tbx1.v16i8")
-        },
-        "qtbx1q_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U8x16, &::U8x16, &::U8x16]; &INPUTS },
-            output: &::U8x16,
-            definition: Named("llvm.aarch64.neon.tbx1.v16i8")
-        },
-        "qtbl2_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [{ static AGG: Type = Type::Aggregate(true, { static PARTS: [&'static Type; 2] = [&::I8x16, &::I8x16]; &PARTS }); &AGG }, &::U8x8]; &INPUTS },
-            output: &::I8x8,
-            definition: Named("llvm.aarch64.neon.tbl2.v8i8")
-        },
-        "qtbl2_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [{ static AGG: Type = Type::Aggregate(true, { static PARTS: [&'static Type; 2] = [&::U8x16, &::U8x16]; &PARTS }); &AGG }, &::U8x8]; &INPUTS },
-            output: &::U8x8,
-            definition: Named("llvm.aarch64.neon.tbl2.v8i8")
-        },
-        "qtbl2q_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [{ static AGG: Type = Type::Aggregate(true, { static PARTS: [&'static Type; 2] = [&::I8x16, &::I8x16]; &PARTS }); &AGG }, &::U8x16]; &INPUTS },
-            output: &::I8x16,
-            definition: Named("llvm.aarch64.neon.tbl2.v16i8")
-        },
-        "qtbl2q_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [{ static AGG: Type = Type::Aggregate(true, { static PARTS: [&'static Type; 2] = [&::U8x16, &::U8x16]; &PARTS }); &AGG }, &::U8x16]; &INPUTS },
-            output: &::U8x16,
-            definition: Named("llvm.aarch64.neon.tbl2.v16i8")
-        },
-        "qtbx2_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [{ static AGG: Type = Type::Aggregate(true, { static PARTS: [&'static Type; 2] = [&::I8x16, &::I8x16]; &PARTS }); &AGG }, &::U8x8]; &INPUTS },
-            output: &::I8x8,
-            definition: Named("llvm.aarch64.neon.tbx2.v8i8")
-        },
-        "qtbx2_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [{ static AGG: Type = Type::Aggregate(true, { static PARTS: [&'static Type; 2] = [&::U8x16, &::U8x16]; &PARTS }); &AGG }, &::U8x8]; &INPUTS },
-            output: &::U8x8,
-            definition: Named("llvm.aarch64.neon.tbx2.v8i8")
-        },
-        "qtbx2q_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [{ static AGG: Type = Type::Aggregate(true, { static PARTS: [&'static Type; 2] = [&::I8x16, &::I8x16]; &PARTS }); &AGG }, &::U8x16]; &INPUTS },
-            output: &::I8x16,
-            definition: Named("llvm.aarch64.neon.tbx2.v16i8")
-        },
-        "qtbx2q_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [{ static AGG: Type = Type::Aggregate(true, { static PARTS: [&'static Type; 2] = [&::U8x16, &::U8x16]; &PARTS }); &AGG }, &::U8x16]; &INPUTS },
-            output: &::U8x16,
-            definition: Named("llvm.aarch64.neon.tbx2.v16i8")
-        },
-        "qtbl3_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [{ static AGG: Type = Type::Aggregate(true, { static PARTS: [&'static Type; 3] = [&::I8x16, &::I8x16, &::I8x16]; &PARTS }); &AGG }, &::U8x8]; &INPUTS },
-            output: &::I8x8,
-            definition: Named("llvm.aarch64.neon.tbl3.v8i8")
-        },
-        "qtbl3_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [{ static AGG: Type = Type::Aggregate(true, { static PARTS: [&'static Type; 3] = [&::U8x16, &::U8x16, &::U8x16]; &PARTS }); &AGG }, &::U8x8]; &INPUTS },
-            output: &::U8x8,
-            definition: Named("llvm.aarch64.neon.tbl3.v8i8")
-        },
-        "qtbl3q_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [{ static AGG: Type = Type::Aggregate(true, { static PARTS: [&'static Type; 3] = [&::I8x16, &::I8x16, &::I8x16]; &PARTS }); &AGG }, &::U8x16]; &INPUTS },
-            output: &::I8x16,
-            definition: Named("llvm.aarch64.neon.tbl3.v16i8")
-        },
-        "qtbl3q_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [{ static AGG: Type = Type::Aggregate(true, { static PARTS: [&'static Type; 3] = [&::U8x16, &::U8x16, &::U8x16]; &PARTS }); &AGG }, &::U8x16]; &INPUTS },
-            output: &::U8x16,
-            definition: Named("llvm.aarch64.neon.tbl3.v16i8")
-        },
-        "qtbx3_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I8x8, { static AGG: Type = Type::Aggregate(true, { static PARTS: [&'static Type; 3] = [&::I8x16, &::I8x16, &::I8x16]; &PARTS }); &AGG }, &::U8x8]; &INPUTS },
-            output: &::I8x8,
-            definition: Named("llvm.aarch64.neon.tbx3.v8i8")
-        },
-        "qtbx3_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U8x8, { static AGG: Type = Type::Aggregate(true, { static PARTS: [&'static Type; 3] = [&::U8x16, &::U8x16, &::U8x16]; &PARTS }); &AGG }, &::U8x8]; &INPUTS },
-            output: &::U8x8,
-            definition: Named("llvm.aarch64.neon.tbx3.v8i8")
-        },
-        "qtbx3q_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I8x16, { static AGG: Type = Type::Aggregate(true, { static PARTS: [&'static Type; 3] = [&::I8x16, &::I8x16, &::I8x16]; &PARTS }); &AGG }, &::U8x16]; &INPUTS },
-            output: &::I8x16,
-            definition: Named("llvm.aarch64.neon.tbx3.v16i8")
-        },
-        "qtbx3q_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U8x16, { static AGG: Type = Type::Aggregate(true, { static PARTS: [&'static Type; 3] = [&::U8x16, &::U8x16, &::U8x16]; &PARTS }); &AGG }, &::U8x16]; &INPUTS },
-            output: &::U8x16,
-            definition: Named("llvm.aarch64.neon.tbx3.v16i8")
-        },
-        "qtbl4_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [{ static AGG: Type = Type::Aggregate(true, { static PARTS: [&'static Type; 4] = [&::I8x16, &::I8x16, &::I8x16, &::I8x16]; &PARTS }); &AGG }, &::U8x8]; &INPUTS },
-            output: &::I8x8,
-            definition: Named("llvm.aarch64.neon.tbl4.v8i8")
-        },
-        "qtbl4_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [{ static AGG: Type = Type::Aggregate(true, { static PARTS: [&'static Type; 4] = [&::U8x16, &::U8x16, &::U8x16, &::U8x16]; &PARTS }); &AGG }, &::U8x8]; &INPUTS },
-            output: &::U8x8,
-            definition: Named("llvm.aarch64.neon.tbl4.v8i8")
-        },
-        "qtbl4q_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [{ static AGG: Type = Type::Aggregate(true, { static PARTS: [&'static Type; 4] = [&::I8x16, &::I8x16, &::I8x16, &::I8x16]; &PARTS }); &AGG }, &::U8x16]; &INPUTS },
-            output: &::I8x16,
-            definition: Named("llvm.aarch64.neon.tbl4.v16i8")
-        },
-        "qtbl4q_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [{ static AGG: Type = Type::Aggregate(true, { static PARTS: [&'static Type; 4] = [&::U8x16, &::U8x16, &::U8x16, &::U8x16]; &PARTS }); &AGG }, &::U8x16]; &INPUTS },
-            output: &::U8x16,
-            definition: Named("llvm.aarch64.neon.tbl4.v16i8")
-        },
-        "qtbx4_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I8x8, { static AGG: Type = Type::Aggregate(true, { static PARTS: [&'static Type; 4] = [&::I8x16, &::I8x16, &::I8x16, &::I8x16]; &PARTS }); &AGG }, &::U8x8]; &INPUTS },
-            output: &::I8x8,
-            definition: Named("llvm.aarch64.neon.tbx4.v8i8")
-        },
-        "qtbx4_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U8x8, { static AGG: Type = Type::Aggregate(true, { static PARTS: [&'static Type; 4] = [&::U8x16, &::U8x16, &::U8x16, &::U8x16]; &PARTS }); &AGG }, &::U8x8]; &INPUTS },
-            output: &::U8x8,
-            definition: Named("llvm.aarch64.neon.tbx4.v8i8")
-        },
-        "qtbx4q_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I8x16, { static AGG: Type = Type::Aggregate(true, { static PARTS: [&'static Type; 4] = [&::I8x16, &::I8x16, &::I8x16, &::I8x16]; &PARTS }); &AGG }, &::U8x16]; &INPUTS },
-            output: &::I8x16,
-            definition: Named("llvm.aarch64.neon.tbx4.v16i8")
-        },
-        "qtbx4q_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U8x16, { static AGG: Type = Type::Aggregate(true, { static PARTS: [&'static Type; 4] = [&::U8x16, &::U8x16, &::U8x16, &::U8x16]; &PARTS }); &AGG }, &::U8x16]; &INPUTS },
-            output: &::U8x16,
-            definition: Named("llvm.aarch64.neon.tbx4.v16i8")
-        },
-        _ => return None,
-    })
-}
diff --git a/src/librustc_platform_intrinsics/arm.rs b/src/librustc_platform_intrinsics/arm.rs
deleted file mode 100644
index 2d19293..0000000
--- a/src/librustc_platform_intrinsics/arm.rs
+++ /dev/null
@@ -1,2074 +0,0 @@
-// DO NOT EDIT: autogenerated by etc/platform-intrinsics/generator.py
-// ignore-tidy-linelength
-
-#![allow(unused_imports)]
-
-use {Intrinsic, Type};
-use IntrinsicDef::Named;
-
-pub fn find(name: &str) -> Option<Intrinsic> {
-    if !name.starts_with("arm_v") { return None }
-    Some(match &name["arm_v".len()..] {
-        "hadd_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x8, &::I8x8]; &INPUTS },
-            output: &::I8x8,
-            definition: Named("llvm.arm.neon.vhadds.v8i8")
-        },
-        "hadd_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x8, &::U8x8]; &INPUTS },
-            output: &::U8x8,
-            definition: Named("llvm.arm.neon.vhaddu.v8i8")
-        },
-        "hadd_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x4, &::I16x4]; &INPUTS },
-            output: &::I16x4,
-            definition: Named("llvm.arm.neon.vhadds.v4i16")
-        },
-        "hadd_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x4, &::U16x4]; &INPUTS },
-            output: &::U16x4,
-            definition: Named("llvm.arm.neon.vhaddu.v4i16")
-        },
-        "hadd_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x2, &::I32x2]; &INPUTS },
-            output: &::I32x2,
-            definition: Named("llvm.arm.neon.vhadds.v2i32")
-        },
-        "hadd_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x2, &::U32x2]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.arm.neon.vhaddu.v2i32")
-        },
-        "haddq_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x16, &::I8x16]; &INPUTS },
-            output: &::I8x16,
-            definition: Named("llvm.arm.neon.vhadds.v16i8")
-        },
-        "haddq_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x16, &::U8x16]; &INPUTS },
-            output: &::U8x16,
-            definition: Named("llvm.arm.neon.vhaddu.v16i8")
-        },
-        "haddq_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x8, &::I16x8]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.arm.neon.vhadds.v8i16")
-        },
-        "haddq_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x8, &::U16x8]; &INPUTS },
-            output: &::U16x8,
-            definition: Named("llvm.arm.neon.vhaddu.v8i16")
-        },
-        "haddq_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x4, &::I32x4]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.arm.neon.vhadds.v4i32")
-        },
-        "haddq_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x4, &::U32x4]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.arm.neon.vhaddu.v4i32")
-        },
-        "rhadd_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x8, &::I8x8]; &INPUTS },
-            output: &::I8x8,
-            definition: Named("llvm.arm.neon.vrhadds.v8i8")
-        },
-        "rhadd_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x8, &::U8x8]; &INPUTS },
-            output: &::U8x8,
-            definition: Named("llvm.arm.neon.vrhaddu.v8i8")
-        },
-        "rhadd_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x4, &::I16x4]; &INPUTS },
-            output: &::I16x4,
-            definition: Named("llvm.arm.neon.vrhadds.v4i16")
-        },
-        "rhadd_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x4, &::U16x4]; &INPUTS },
-            output: &::U16x4,
-            definition: Named("llvm.arm.neon.vrhaddu.v4i16")
-        },
-        "rhadd_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x2, &::I32x2]; &INPUTS },
-            output: &::I32x2,
-            definition: Named("llvm.arm.neon.vrhadds.v2i32")
-        },
-        "rhadd_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x2, &::U32x2]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.arm.neon.vrhaddu.v2i32")
-        },
-        "rhaddq_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x16, &::I8x16]; &INPUTS },
-            output: &::I8x16,
-            definition: Named("llvm.arm.neon.vrhadds.v16i8")
-        },
-        "rhaddq_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x16, &::U8x16]; &INPUTS },
-            output: &::U8x16,
-            definition: Named("llvm.arm.neon.vrhaddu.v16i8")
-        },
-        "rhaddq_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x8, &::I16x8]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.arm.neon.vrhadds.v8i16")
-        },
-        "rhaddq_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x8, &::U16x8]; &INPUTS },
-            output: &::U16x8,
-            definition: Named("llvm.arm.neon.vrhaddu.v8i16")
-        },
-        "rhaddq_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x4, &::I32x4]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.arm.neon.vrhadds.v4i32")
-        },
-        "rhaddq_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x4, &::U32x4]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.arm.neon.vrhaddu.v4i32")
-        },
-        "qadd_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x8, &::I8x8]; &INPUTS },
-            output: &::I8x8,
-            definition: Named("llvm.arm.neon.vqadds.v8i8")
-        },
-        "qadd_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x8, &::U8x8]; &INPUTS },
-            output: &::U8x8,
-            definition: Named("llvm.arm.neon.vqaddu.v8i8")
-        },
-        "qadd_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x4, &::I16x4]; &INPUTS },
-            output: &::I16x4,
-            definition: Named("llvm.arm.neon.vqadds.v4i16")
-        },
-        "qadd_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x4, &::U16x4]; &INPUTS },
-            output: &::U16x4,
-            definition: Named("llvm.arm.neon.vqaddu.v4i16")
-        },
-        "qadd_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x2, &::I32x2]; &INPUTS },
-            output: &::I32x2,
-            definition: Named("llvm.arm.neon.vqadds.v2i32")
-        },
-        "qadd_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x2, &::U32x2]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.arm.neon.vqaddu.v2i32")
-        },
-        "qadd_s64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I64x1, &::I64x1]; &INPUTS },
-            output: &::I64x1,
-            definition: Named("llvm.arm.neon.vqadds.v1i64")
-        },
-        "qadd_u64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U64x1, &::U64x1]; &INPUTS },
-            output: &::U64x1,
-            definition: Named("llvm.arm.neon.vqaddu.v1i64")
-        },
-        "qaddq_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x16, &::I8x16]; &INPUTS },
-            output: &::I8x16,
-            definition: Named("llvm.arm.neon.vqadds.v16i8")
-        },
-        "qaddq_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x16, &::U8x16]; &INPUTS },
-            output: &::U8x16,
-            definition: Named("llvm.arm.neon.vqaddu.v16i8")
-        },
-        "qaddq_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x8, &::I16x8]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.arm.neon.vqadds.v8i16")
-        },
-        "qaddq_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x8, &::U16x8]; &INPUTS },
-            output: &::U16x8,
-            definition: Named("llvm.arm.neon.vqaddu.v8i16")
-        },
-        "qaddq_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x4, &::I32x4]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.arm.neon.vqadds.v4i32")
-        },
-        "qaddq_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x4, &::U32x4]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.arm.neon.vqaddu.v4i32")
-        },
-        "qaddq_s64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I64x2, &::I64x2]; &INPUTS },
-            output: &::I64x2,
-            definition: Named("llvm.arm.neon.vqadds.v2i64")
-        },
-        "qaddq_u64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U64x2, &::U64x2]; &INPUTS },
-            output: &::U64x2,
-            definition: Named("llvm.arm.neon.vqaddu.v2i64")
-        },
-        "raddhn_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x8, &::I16x8]; &INPUTS },
-            output: &::I8x8,
-            definition: Named("llvm.arm.neon.vraddhn.v8i8")
-        },
-        "raddhn_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x8, &::U16x8]; &INPUTS },
-            output: &::U8x8,
-            definition: Named("llvm.arm.neon.vraddhn.v8i8")
-        },
-        "raddhn_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x4, &::I32x4]; &INPUTS },
-            output: &::I16x4,
-            definition: Named("llvm.arm.neon.vraddhn.v4i16")
-        },
-        "raddhn_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x4, &::U32x4]; &INPUTS },
-            output: &::U16x4,
-            definition: Named("llvm.arm.neon.vraddhn.v4i16")
-        },
-        "raddhn_s64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I64x2, &::I64x2]; &INPUTS },
-            output: &::I32x2,
-            definition: Named("llvm.arm.neon.vraddhn.v2i32")
-        },
-        "raddhn_u64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U64x2, &::U64x2]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.arm.neon.vraddhn.v2i32")
-        },
-        "fma_f32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F32x2, &::F32x2]; &INPUTS },
-            output: &::F32x2,
-            definition: Named("llvm.fma.v2f32")
-        },
-        "fmaq_f32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F32x4, &::F32x4]; &INPUTS },
-            output: &::F32x4,
-            definition: Named("llvm.fma.v4f32")
-        },
-        "qdmulh_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x4, &::I16x4]; &INPUTS },
-            output: &::I16x4,
-            definition: Named("llvm.arm.neon.vsqdmulh.v4i16")
-        },
-        "qdmulh_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x2, &::I32x2]; &INPUTS },
-            output: &::I32x2,
-            definition: Named("llvm.arm.neon.vsqdmulh.v2i32")
-        },
-        "qdmulhq_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x8, &::I16x8]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.arm.neon.vsqdmulh.v8i16")
-        },
-        "qdmulhq_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x4, &::I32x4]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.arm.neon.vsqdmulh.v4i32")
-        },
-        "qrdmulh_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x4, &::I16x4]; &INPUTS },
-            output: &::I16x4,
-            definition: Named("llvm.arm.neon.vsqrdmulh.v4i16")
-        },
-        "qrdmulh_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x2, &::I32x2]; &INPUTS },
-            output: &::I32x2,
-            definition: Named("llvm.arm.neon.vsqrdmulh.v2i32")
-        },
-        "qrdmulhq_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x8, &::I16x8]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.arm.neon.vsqrdmulh.v8i16")
-        },
-        "qrdmulhq_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x4, &::I32x4]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.arm.neon.vsqrdmulh.v4i32")
-        },
-        "mull_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x8, &::I8x8]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.arm.neon.vmulls.v8i16")
-        },
-        "mull_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x8, &::U8x8]; &INPUTS },
-            output: &::U16x8,
-            definition: Named("llvm.arm.neon.vmullu.v8i16")
-        },
-        "mull_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x4, &::I16x4]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.arm.neon.vmulls.v4i32")
-        },
-        "mull_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x4, &::U16x4]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.arm.neon.vmullu.v4i32")
-        },
-        "mull_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x2, &::I32x2]; &INPUTS },
-            output: &::I64x2,
-            definition: Named("llvm.arm.neon.vmulls.v2i64")
-        },
-        "mull_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x2, &::U32x2]; &INPUTS },
-            output: &::U64x2,
-            definition: Named("llvm.arm.neon.vmullu.v2i64")
-        },
-        "qdmullq_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x8, &::I8x8]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.arm.neon.vsqdmull.v8i16")
-        },
-        "qdmullq_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x4, &::I16x4]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.arm.neon.vsqdmull.v4i32")
-        },
-        "hsub_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x8, &::I8x8]; &INPUTS },
-            output: &::I8x8,
-            definition: Named("llvm.arm.neon.vhsubs.v8i8")
-        },
-        "hsub_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x8, &::U8x8]; &INPUTS },
-            output: &::U8x8,
-            definition: Named("llvm.arm.neon.vhsubu.v8i8")
-        },
-        "hsub_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x4, &::I16x4]; &INPUTS },
-            output: &::I16x4,
-            definition: Named("llvm.arm.neon.vhsubs.v4i16")
-        },
-        "hsub_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x4, &::U16x4]; &INPUTS },
-            output: &::U16x4,
-            definition: Named("llvm.arm.neon.vhsubu.v4i16")
-        },
-        "hsub_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x2, &::I32x2]; &INPUTS },
-            output: &::I32x2,
-            definition: Named("llvm.arm.neon.vhsubs.v2i32")
-        },
-        "hsub_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x2, &::U32x2]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.arm.neon.vhsubu.v2i32")
-        },
-        "hsubq_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x16, &::I8x16]; &INPUTS },
-            output: &::I8x16,
-            definition: Named("llvm.arm.neon.vhsubs.v16i8")
-        },
-        "hsubq_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x16, &::U8x16]; &INPUTS },
-            output: &::U8x16,
-            definition: Named("llvm.arm.neon.vhsubu.v16i8")
-        },
-        "hsubq_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x8, &::I16x8]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.arm.neon.vhsubs.v8i16")
-        },
-        "hsubq_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x8, &::U16x8]; &INPUTS },
-            output: &::U16x8,
-            definition: Named("llvm.arm.neon.vhsubu.v8i16")
-        },
-        "hsubq_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x4, &::I32x4]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.arm.neon.vhsubs.v4i32")
-        },
-        "hsubq_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x4, &::U32x4]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.arm.neon.vhsubu.v4i32")
-        },
-        "qsub_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x8, &::I8x8]; &INPUTS },
-            output: &::I8x8,
-            definition: Named("llvm.arm.neon.vqsubs.v8i8")
-        },
-        "qsub_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x8, &::U8x8]; &INPUTS },
-            output: &::U8x8,
-            definition: Named("llvm.arm.neon.vqsubu.v8i8")
-        },
-        "qsub_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x4, &::I16x4]; &INPUTS },
-            output: &::I16x4,
-            definition: Named("llvm.arm.neon.vqsubs.v4i16")
-        },
-        "qsub_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x4, &::U16x4]; &INPUTS },
-            output: &::U16x4,
-            definition: Named("llvm.arm.neon.vqsubu.v4i16")
-        },
-        "qsub_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x2, &::I32x2]; &INPUTS },
-            output: &::I32x2,
-            definition: Named("llvm.arm.neon.vqsubs.v2i32")
-        },
-        "qsub_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x2, &::U32x2]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.arm.neon.vqsubu.v2i32")
-        },
-        "qsub_s64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I64x1, &::I64x1]; &INPUTS },
-            output: &::I64x1,
-            definition: Named("llvm.arm.neon.vqsubs.v1i64")
-        },
-        "qsub_u64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U64x1, &::U64x1]; &INPUTS },
-            output: &::U64x1,
-            definition: Named("llvm.arm.neon.vqsubu.v1i64")
-        },
-        "qsubq_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x16, &::I8x16]; &INPUTS },
-            output: &::I8x16,
-            definition: Named("llvm.arm.neon.vqsubs.v16i8")
-        },
-        "qsubq_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x16, &::U8x16]; &INPUTS },
-            output: &::U8x16,
-            definition: Named("llvm.arm.neon.vqsubu.v16i8")
-        },
-        "qsubq_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x8, &::I16x8]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.arm.neon.vqsubs.v8i16")
-        },
-        "qsubq_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x8, &::U16x8]; &INPUTS },
-            output: &::U16x8,
-            definition: Named("llvm.arm.neon.vqsubu.v8i16")
-        },
-        "qsubq_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x4, &::I32x4]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.arm.neon.vqsubs.v4i32")
-        },
-        "qsubq_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x4, &::U32x4]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.arm.neon.vqsubu.v4i32")
-        },
-        "qsubq_s64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I64x2, &::I64x2]; &INPUTS },
-            output: &::I64x2,
-            definition: Named("llvm.arm.neon.vqsubs.v2i64")
-        },
-        "qsubq_u64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U64x2, &::U64x2]; &INPUTS },
-            output: &::U64x2,
-            definition: Named("llvm.arm.neon.vqsubu.v2i64")
-        },
-        "rsubhn_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x8, &::I16x8]; &INPUTS },
-            output: &::I8x8,
-            definition: Named("llvm.arm.neon.vrsubhn.v8i8")
-        },
-        "rsubhn_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x8, &::U16x8]; &INPUTS },
-            output: &::U8x8,
-            definition: Named("llvm.arm.neon.vrsubhn.v8i8")
-        },
-        "rsubhn_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x4, &::I32x4]; &INPUTS },
-            output: &::I16x4,
-            definition: Named("llvm.arm.neon.vrsubhn.v4i16")
-        },
-        "rsubhn_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x4, &::U32x4]; &INPUTS },
-            output: &::U16x4,
-            definition: Named("llvm.arm.neon.vrsubhn.v4i16")
-        },
-        "rsubhn_s64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I64x2, &::I64x2]; &INPUTS },
-            output: &::I32x2,
-            definition: Named("llvm.arm.neon.vrsubhn.v2i32")
-        },
-        "rsubhn_u64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U64x2, &::U64x2]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.arm.neon.vrsubhn.v2i32")
-        },
-        "abd_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x8, &::I8x8]; &INPUTS },
-            output: &::I8x8,
-            definition: Named("llvm.arm.neon.vabds.v8i8")
-        },
-        "abd_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x8, &::U8x8]; &INPUTS },
-            output: &::U8x8,
-            definition: Named("llvm.arm.neon.vabdu.v8i8")
-        },
-        "abd_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x4, &::I16x4]; &INPUTS },
-            output: &::I16x4,
-            definition: Named("llvm.arm.neon.vabds.v4i16")
-        },
-        "abd_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x4, &::U16x4]; &INPUTS },
-            output: &::U16x4,
-            definition: Named("llvm.arm.neon.vabdu.v4i16")
-        },
-        "abd_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x2, &::I32x2]; &INPUTS },
-            output: &::I32x2,
-            definition: Named("llvm.arm.neon.vabds.v2i32")
-        },
-        "abd_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x2, &::U32x2]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.arm.neon.vabdu.v2i32")
-        },
-        "abd_f32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F32x2, &::F32x2]; &INPUTS },
-            output: &::F32x2,
-            definition: Named("llvm.arm.neon.vabdf.v2f32")
-        },
-        "abdq_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x16, &::I8x16]; &INPUTS },
-            output: &::I8x16,
-            definition: Named("llvm.arm.neon.vabds.v16i8")
-        },
-        "abdq_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x16, &::U8x16]; &INPUTS },
-            output: &::U8x16,
-            definition: Named("llvm.arm.neon.vabdu.v16i8")
-        },
-        "abdq_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x8, &::I16x8]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.arm.neon.vabds.v8i16")
-        },
-        "abdq_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x8, &::U16x8]; &INPUTS },
-            output: &::U16x8,
-            definition: Named("llvm.arm.neon.vabdu.v8i16")
-        },
-        "abdq_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x4, &::I32x4]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.arm.neon.vabds.v4i32")
-        },
-        "abdq_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x4, &::U32x4]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.arm.neon.vabdu.v4i32")
-        },
-        "abdq_f32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F32x4, &::F32x4]; &INPUTS },
-            output: &::F32x4,
-            definition: Named("llvm.arm.neon.vabdf.v4f32")
-        },
-        "max_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x8, &::I8x8]; &INPUTS },
-            output: &::I8x8,
-            definition: Named("llvm.arm.neon.vmaxs.v8i8")
-        },
-        "max_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x8, &::U8x8]; &INPUTS },
-            output: &::U8x8,
-            definition: Named("llvm.arm.neon.vmaxu.v8i8")
-        },
-        "max_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x4, &::I16x4]; &INPUTS },
-            output: &::I16x4,
-            definition: Named("llvm.arm.neon.vmaxs.v4i16")
-        },
-        "max_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x4, &::U16x4]; &INPUTS },
-            output: &::U16x4,
-            definition: Named("llvm.arm.neon.vmaxu.v4i16")
-        },
-        "max_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x2, &::I32x2]; &INPUTS },
-            output: &::I32x2,
-            definition: Named("llvm.arm.neon.vmaxs.v2i32")
-        },
-        "max_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x2, &::U32x2]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.arm.neon.vmaxu.v2i32")
-        },
-        "max_f32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F32x2, &::F32x2]; &INPUTS },
-            output: &::F32x2,
-            definition: Named("llvm.arm.neon.vmaxf.v2f32")
-        },
-        "maxq_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x16, &::I8x16]; &INPUTS },
-            output: &::I8x16,
-            definition: Named("llvm.arm.neon.vmaxs.v16i8")
-        },
-        "maxq_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x16, &::U8x16]; &INPUTS },
-            output: &::U8x16,
-            definition: Named("llvm.arm.neon.vmaxu.v16i8")
-        },
-        "maxq_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x8, &::I16x8]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.arm.neon.vmaxs.v8i16")
-        },
-        "maxq_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x8, &::U16x8]; &INPUTS },
-            output: &::U16x8,
-            definition: Named("llvm.arm.neon.vmaxu.v8i16")
-        },
-        "maxq_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x4, &::I32x4]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.arm.neon.vmaxs.v4i32")
-        },
-        "maxq_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x4, &::U32x4]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.arm.neon.vmaxu.v4i32")
-        },
-        "maxq_f32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F32x4, &::F32x4]; &INPUTS },
-            output: &::F32x4,
-            definition: Named("llvm.arm.neon.vmaxf.v4f32")
-        },
-        "min_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x8, &::I8x8]; &INPUTS },
-            output: &::I8x8,
-            definition: Named("llvm.arm.neon.vmins.v8i8")
-        },
-        "min_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x8, &::U8x8]; &INPUTS },
-            output: &::U8x8,
-            definition: Named("llvm.arm.neon.vminu.v8i8")
-        },
-        "min_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x4, &::I16x4]; &INPUTS },
-            output: &::I16x4,
-            definition: Named("llvm.arm.neon.vmins.v4i16")
-        },
-        "min_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x4, &::U16x4]; &INPUTS },
-            output: &::U16x4,
-            definition: Named("llvm.arm.neon.vminu.v4i16")
-        },
-        "min_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x2, &::I32x2]; &INPUTS },
-            output: &::I32x2,
-            definition: Named("llvm.arm.neon.vmins.v2i32")
-        },
-        "min_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x2, &::U32x2]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.arm.neon.vminu.v2i32")
-        },
-        "min_f32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F32x2, &::F32x2]; &INPUTS },
-            output: &::F32x2,
-            definition: Named("llvm.arm.neon.vminf.v2f32")
-        },
-        "minq_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x16, &::I8x16]; &INPUTS },
-            output: &::I8x16,
-            definition: Named("llvm.arm.neon.vmins.v16i8")
-        },
-        "minq_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x16, &::U8x16]; &INPUTS },
-            output: &::U8x16,
-            definition: Named("llvm.arm.neon.vminu.v16i8")
-        },
-        "minq_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x8, &::I16x8]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.arm.neon.vmins.v8i16")
-        },
-        "minq_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x8, &::U16x8]; &INPUTS },
-            output: &::U16x8,
-            definition: Named("llvm.arm.neon.vminu.v8i16")
-        },
-        "minq_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x4, &::I32x4]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.arm.neon.vmins.v4i32")
-        },
-        "minq_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x4, &::U32x4]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.arm.neon.vminu.v4i32")
-        },
-        "minq_f32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F32x4, &::F32x4]; &INPUTS },
-            output: &::F32x4,
-            definition: Named("llvm.arm.neon.vminf.v4f32")
-        },
-        "shl_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x8, &::I8x8]; &INPUTS },
-            output: &::I8x8,
-            definition: Named("llvm.arm.neon.vshls.v8i8")
-        },
-        "shl_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x8, &::I8x8]; &INPUTS },
-            output: &::U8x8,
-            definition: Named("llvm.arm.neon.vshlu.v8i8")
-        },
-        "shl_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x4, &::I16x4]; &INPUTS },
-            output: &::I16x4,
-            definition: Named("llvm.arm.neon.vshls.v4i16")
-        },
-        "shl_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x4, &::I16x4]; &INPUTS },
-            output: &::U16x4,
-            definition: Named("llvm.arm.neon.vshlu.v4i16")
-        },
-        "shl_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x2, &::I32x2]; &INPUTS },
-            output: &::I32x2,
-            definition: Named("llvm.arm.neon.vshls.v2i32")
-        },
-        "shl_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x2, &::I32x2]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.arm.neon.vshlu.v2i32")
-        },
-        "shl_s64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I64x1, &::I64x1]; &INPUTS },
-            output: &::I64x1,
-            definition: Named("llvm.arm.neon.vshls.v1i64")
-        },
-        "shl_u64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U64x1, &::I64x1]; &INPUTS },
-            output: &::U64x1,
-            definition: Named("llvm.arm.neon.vshlu.v1i64")
-        },
-        "shlq_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x16, &::I8x16]; &INPUTS },
-            output: &::I8x16,
-            definition: Named("llvm.arm.neon.vshls.v16i8")
-        },
-        "shlq_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x16, &::I8x16]; &INPUTS },
-            output: &::U8x16,
-            definition: Named("llvm.arm.neon.vshlu.v16i8")
-        },
-        "shlq_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x8, &::I16x8]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.arm.neon.vshls.v8i16")
-        },
-        "shlq_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x8, &::I16x8]; &INPUTS },
-            output: &::U16x8,
-            definition: Named("llvm.arm.neon.vshlu.v8i16")
-        },
-        "shlq_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x4, &::I32x4]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.arm.neon.vshls.v4i32")
-        },
-        "shlq_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x4, &::I32x4]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.arm.neon.vshlu.v4i32")
-        },
-        "shlq_s64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I64x2, &::I64x2]; &INPUTS },
-            output: &::I64x2,
-            definition: Named("llvm.arm.neon.vshls.v2i64")
-        },
-        "shlq_u64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U64x2, &::I64x2]; &INPUTS },
-            output: &::U64x2,
-            definition: Named("llvm.arm.neon.vshlu.v2i64")
-        },
-        "qshl_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x8, &::I8x8]; &INPUTS },
-            output: &::I8x8,
-            definition: Named("llvm.arm.neon.vqshls.v8i8")
-        },
-        "qshl_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x8, &::I8x8]; &INPUTS },
-            output: &::U8x8,
-            definition: Named("llvm.arm.neon.vqshlu.v8i8")
-        },
-        "qshl_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x4, &::I16x4]; &INPUTS },
-            output: &::I16x4,
-            definition: Named("llvm.arm.neon.vqshls.v4i16")
-        },
-        "qshl_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x4, &::I16x4]; &INPUTS },
-            output: &::U16x4,
-            definition: Named("llvm.arm.neon.vqshlu.v4i16")
-        },
-        "qshl_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x2, &::I32x2]; &INPUTS },
-            output: &::I32x2,
-            definition: Named("llvm.arm.neon.vqshls.v2i32")
-        },
-        "qshl_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x2, &::I32x2]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.arm.neon.vqshlu.v2i32")
-        },
-        "qshl_s64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I64x1, &::I64x1]; &INPUTS },
-            output: &::I64x1,
-            definition: Named("llvm.arm.neon.vqshls.v1i64")
-        },
-        "qshl_u64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U64x1, &::I64x1]; &INPUTS },
-            output: &::U64x1,
-            definition: Named("llvm.arm.neon.vqshlu.v1i64")
-        },
-        "qshlq_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x16, &::I8x16]; &INPUTS },
-            output: &::I8x16,
-            definition: Named("llvm.arm.neon.vqshls.v16i8")
-        },
-        "qshlq_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x16, &::I8x16]; &INPUTS },
-            output: &::U8x16,
-            definition: Named("llvm.arm.neon.vqshlu.v16i8")
-        },
-        "qshlq_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x8, &::I16x8]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.arm.neon.vqshls.v8i16")
-        },
-        "qshlq_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x8, &::I16x8]; &INPUTS },
-            output: &::U16x8,
-            definition: Named("llvm.arm.neon.vqshlu.v8i16")
-        },
-        "qshlq_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x4, &::I32x4]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.arm.neon.vqshls.v4i32")
-        },
-        "qshlq_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x4, &::I32x4]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.arm.neon.vqshlu.v4i32")
-        },
-        "qshlq_s64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I64x2, &::I64x2]; &INPUTS },
-            output: &::I64x2,
-            definition: Named("llvm.arm.neon.vqshls.v2i64")
-        },
-        "qshlq_u64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U64x2, &::I64x2]; &INPUTS },
-            output: &::U64x2,
-            definition: Named("llvm.arm.neon.vqshlu.v2i64")
-        },
-        "rshl_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x8, &::I8x8]; &INPUTS },
-            output: &::I8x8,
-            definition: Named("llvm.arm.neon.vrshls.v8i8")
-        },
-        "rshl_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x8, &::I8x8]; &INPUTS },
-            output: &::U8x8,
-            definition: Named("llvm.arm.neon.vrshlu.v8i8")
-        },
-        "rshl_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x4, &::I16x4]; &INPUTS },
-            output: &::I16x4,
-            definition: Named("llvm.arm.neon.vrshls.v4i16")
-        },
-        "rshl_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x4, &::I16x4]; &INPUTS },
-            output: &::U16x4,
-            definition: Named("llvm.arm.neon.vrshlu.v4i16")
-        },
-        "rshl_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x2, &::I32x2]; &INPUTS },
-            output: &::I32x2,
-            definition: Named("llvm.arm.neon.vrshls.v2i32")
-        },
-        "rshl_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x2, &::I32x2]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.arm.neon.vrshlu.v2i32")
-        },
-        "rshl_s64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I64x1, &::I64x1]; &INPUTS },
-            output: &::I64x1,
-            definition: Named("llvm.arm.neon.vrshls.v1i64")
-        },
-        "rshl_u64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U64x1, &::I64x1]; &INPUTS },
-            output: &::U64x1,
-            definition: Named("llvm.arm.neon.vrshlu.v1i64")
-        },
-        "rshlq_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x16, &::I8x16]; &INPUTS },
-            output: &::I8x16,
-            definition: Named("llvm.arm.neon.vrshls.v16i8")
-        },
-        "rshlq_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x16, &::I8x16]; &INPUTS },
-            output: &::U8x16,
-            definition: Named("llvm.arm.neon.vrshlu.v16i8")
-        },
-        "rshlq_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x8, &::I16x8]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.arm.neon.vrshls.v8i16")
-        },
-        "rshlq_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x8, &::I16x8]; &INPUTS },
-            output: &::U16x8,
-            definition: Named("llvm.arm.neon.vrshlu.v8i16")
-        },
-        "rshlq_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x4, &::I32x4]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.arm.neon.vrshls.v4i32")
-        },
-        "rshlq_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x4, &::I32x4]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.arm.neon.vrshlu.v4i32")
-        },
-        "rshlq_s64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I64x2, &::I64x2]; &INPUTS },
-            output: &::I64x2,
-            definition: Named("llvm.arm.neon.vrshls.v2i64")
-        },
-        "rshlq_u64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U64x2, &::I64x2]; &INPUTS },
-            output: &::U64x2,
-            definition: Named("llvm.arm.neon.vrshlu.v2i64")
-        },
-        "qrshl_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x8, &::I8x8]; &INPUTS },
-            output: &::I8x8,
-            definition: Named("llvm.arm.neon.vqrshls.v8i8")
-        },
-        "qrshl_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x8, &::I8x8]; &INPUTS },
-            output: &::U8x8,
-            definition: Named("llvm.arm.neon.vqrshlu.v8i8")
-        },
-        "qrshl_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x4, &::I16x4]; &INPUTS },
-            output: &::I16x4,
-            definition: Named("llvm.arm.neon.vqrshls.v4i16")
-        },
-        "qrshl_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x4, &::I16x4]; &INPUTS },
-            output: &::U16x4,
-            definition: Named("llvm.arm.neon.vqrshlu.v4i16")
-        },
-        "qrshl_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x2, &::I32x2]; &INPUTS },
-            output: &::I32x2,
-            definition: Named("llvm.arm.neon.vqrshls.v2i32")
-        },
-        "qrshl_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x2, &::I32x2]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.arm.neon.vqrshlu.v2i32")
-        },
-        "qrshl_s64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I64x1, &::I64x1]; &INPUTS },
-            output: &::I64x1,
-            definition: Named("llvm.arm.neon.vqrshls.v1i64")
-        },
-        "qrshl_u64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U64x1, &::I64x1]; &INPUTS },
-            output: &::U64x1,
-            definition: Named("llvm.arm.neon.vqrshlu.v1i64")
-        },
-        "qrshlq_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x16, &::I8x16]; &INPUTS },
-            output: &::I8x16,
-            definition: Named("llvm.arm.neon.vqrshls.v16i8")
-        },
-        "qrshlq_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x16, &::I8x16]; &INPUTS },
-            output: &::U8x16,
-            definition: Named("llvm.arm.neon.vqrshlu.v16i8")
-        },
-        "qrshlq_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x8, &::I16x8]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.arm.neon.vqrshls.v8i16")
-        },
-        "qrshlq_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x8, &::I16x8]; &INPUTS },
-            output: &::U16x8,
-            definition: Named("llvm.arm.neon.vqrshlu.v8i16")
-        },
-        "qrshlq_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x4, &::I32x4]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.arm.neon.vqrshls.v4i32")
-        },
-        "qrshlq_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x4, &::I32x4]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.arm.neon.vqrshlu.v4i32")
-        },
-        "qrshlq_s64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I64x2, &::I64x2]; &INPUTS },
-            output: &::I64x2,
-            definition: Named("llvm.arm.neon.vqrshls.v2i64")
-        },
-        "qrshlq_u64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U64x2, &::I64x2]; &INPUTS },
-            output: &::U64x2,
-            definition: Named("llvm.arm.neon.vqrshlu.v2i64")
-        },
-        "qshrun_n_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x8, &::U32]; &INPUTS },
-            output: &::I8x8,
-            definition: Named("llvm.arm.neon.vsqshrun.v8i8")
-        },
-        "qshrun_n_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x4, &::U32]; &INPUTS },
-            output: &::I16x4,
-            definition: Named("llvm.arm.neon.vsqshrun.v4i16")
-        },
-        "qshrun_n_s64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I64x2, &::U32]; &INPUTS },
-            output: &::I32x2,
-            definition: Named("llvm.arm.neon.vsqshrun.v2i32")
-        },
-        "qrshrun_n_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x8, &::U32]; &INPUTS },
-            output: &::I8x8,
-            definition: Named("llvm.arm.neon.vsqrshrun.v8i8")
-        },
-        "qrshrun_n_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x4, &::U32]; &INPUTS },
-            output: &::I16x4,
-            definition: Named("llvm.arm.neon.vsqrshrun.v4i16")
-        },
-        "qrshrun_n_s64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I64x2, &::U32]; &INPUTS },
-            output: &::I32x2,
-            definition: Named("llvm.arm.neon.vsqrshrun.v2i32")
-        },
-        "qshrn_n_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x8, &::U32]; &INPUTS },
-            output: &::I8x8,
-            definition: Named("llvm.arm.neon.vqshrns.v8i8")
-        },
-        "qshrn_n_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x8, &::U32]; &INPUTS },
-            output: &::U8x8,
-            definition: Named("llvm.arm.neon.vqshrnu.v8i8")
-        },
-        "qshrn_n_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x4, &::U32]; &INPUTS },
-            output: &::I16x4,
-            definition: Named("llvm.arm.neon.vqshrns.v4i16")
-        },
-        "qshrn_n_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x4, &::U32]; &INPUTS },
-            output: &::U16x4,
-            definition: Named("llvm.arm.neon.vqshrnu.v4i16")
-        },
-        "qshrn_n_s64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I64x2, &::U32]; &INPUTS },
-            output: &::I32x2,
-            definition: Named("llvm.arm.neon.vqshrns.v2i32")
-        },
-        "qshrn_n_u64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U64x2, &::U32]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.arm.neon.vqshrnu.v2i32")
-        },
-        "rshrn_n_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x8, &::U32]; &INPUTS },
-            output: &::I8x8,
-            definition: Named("llvm.arm.neon.vrshrn.v8i8")
-        },
-        "rshrn_n_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x8, &::U32]; &INPUTS },
-            output: &::U8x8,
-            definition: Named("llvm.arm.neon.vrshrn.v8i8")
-        },
-        "rshrn_n_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x4, &::U32]; &INPUTS },
-            output: &::I16x4,
-            definition: Named("llvm.arm.neon.vrshrn.v4i16")
-        },
-        "rshrn_n_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x4, &::U32]; &INPUTS },
-            output: &::U16x4,
-            definition: Named("llvm.arm.neon.vrshrn.v4i16")
-        },
-        "rshrn_n_s64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I64x2, &::U32]; &INPUTS },
-            output: &::I32x2,
-            definition: Named("llvm.arm.neon.vrshrn.v2i32")
-        },
-        "rshrn_n_u64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U64x2, &::U32]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.arm.neon.vrshrn.v2i32")
-        },
-        "qrshrn_n_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x8, &::U32]; &INPUTS },
-            output: &::I8x8,
-            definition: Named("llvm.arm.neon.vqrshrns.v8i8")
-        },
-        "qrshrn_n_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x8, &::U32]; &INPUTS },
-            output: &::U8x8,
-            definition: Named("llvm.arm.neon.vqrshrnu.v8i8")
-        },
-        "qrshrn_n_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x4, &::U32]; &INPUTS },
-            output: &::I16x4,
-            definition: Named("llvm.arm.neon.vqrshrns.v4i16")
-        },
-        "qrshrn_n_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x4, &::U32]; &INPUTS },
-            output: &::U16x4,
-            definition: Named("llvm.arm.neon.vqrshrnu.v4i16")
-        },
-        "qrshrn_n_s64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I64x2, &::U32]; &INPUTS },
-            output: &::I32x2,
-            definition: Named("llvm.arm.neon.vqrshrns.v2i32")
-        },
-        "qrshrn_n_u64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U64x2, &::U32]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.arm.neon.vqrshrnu.v2i32")
-        },
-        "sri_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x8, &::I8x8]; &INPUTS },
-            output: &::I8x8,
-            definition: Named("llvm.arm.neon.vvsri.v8i8")
-        },
-        "sri_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x8, &::U8x8]; &INPUTS },
-            output: &::U8x8,
-            definition: Named("llvm.arm.neon.vvsri.v8i8")
-        },
-        "sri_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x4, &::I16x4]; &INPUTS },
-            output: &::I16x4,
-            definition: Named("llvm.arm.neon.vvsri.v4i16")
-        },
-        "sri_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x4, &::U16x4]; &INPUTS },
-            output: &::U16x4,
-            definition: Named("llvm.arm.neon.vvsri.v4i16")
-        },
-        "sri_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x2, &::I32x2]; &INPUTS },
-            output: &::I32x2,
-            definition: Named("llvm.arm.neon.vvsri.v2i32")
-        },
-        "sri_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x2, &::U32x2]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.arm.neon.vvsri.v2i32")
-        },
-        "sri_s64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I64x1, &::I64x1]; &INPUTS },
-            output: &::I64x1,
-            definition: Named("llvm.arm.neon.vvsri.v1i64")
-        },
-        "sri_u64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U64x1, &::U64x1]; &INPUTS },
-            output: &::U64x1,
-            definition: Named("llvm.arm.neon.vvsri.v1i64")
-        },
-        "sriq_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x16, &::I8x16]; &INPUTS },
-            output: &::I8x16,
-            definition: Named("llvm.arm.neon.vvsri.v16i8")
-        },
-        "sriq_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x16, &::U8x16]; &INPUTS },
-            output: &::U8x16,
-            definition: Named("llvm.arm.neon.vvsri.v16i8")
-        },
-        "sriq_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x8, &::I16x8]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.arm.neon.vvsri.v8i16")
-        },
-        "sriq_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x8, &::U16x8]; &INPUTS },
-            output: &::U16x8,
-            definition: Named("llvm.arm.neon.vvsri.v8i16")
-        },
-        "sriq_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x4, &::I32x4]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.arm.neon.vvsri.v4i32")
-        },
-        "sriq_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x4, &::U32x4]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.arm.neon.vvsri.v4i32")
-        },
-        "sriq_s64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I64x2, &::I64x2]; &INPUTS },
-            output: &::I64x2,
-            definition: Named("llvm.arm.neon.vvsri.v2i64")
-        },
-        "sriq_u64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U64x2, &::U64x2]; &INPUTS },
-            output: &::U64x2,
-            definition: Named("llvm.arm.neon.vvsri.v2i64")
-        },
-        "sli_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x8, &::I8x8]; &INPUTS },
-            output: &::I8x8,
-            definition: Named("llvm.arm.neon.vvsli.v8i8")
-        },
-        "sli_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x8, &::U8x8]; &INPUTS },
-            output: &::U8x8,
-            definition: Named("llvm.arm.neon.vvsli.v8i8")
-        },
-        "sli_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x4, &::I16x4]; &INPUTS },
-            output: &::I16x4,
-            definition: Named("llvm.arm.neon.vvsli.v4i16")
-        },
-        "sli_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x4, &::U16x4]; &INPUTS },
-            output: &::U16x4,
-            definition: Named("llvm.arm.neon.vvsli.v4i16")
-        },
-        "sli_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x2, &::I32x2]; &INPUTS },
-            output: &::I32x2,
-            definition: Named("llvm.arm.neon.vvsli.v2i32")
-        },
-        "sli_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x2, &::U32x2]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.arm.neon.vvsli.v2i32")
-        },
-        "sli_s64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I64x1, &::I64x1]; &INPUTS },
-            output: &::I64x1,
-            definition: Named("llvm.arm.neon.vvsli.v1i64")
-        },
-        "sli_u64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U64x1, &::U64x1]; &INPUTS },
-            output: &::U64x1,
-            definition: Named("llvm.arm.neon.vvsli.v1i64")
-        },
-        "sliq_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x16, &::I8x16]; &INPUTS },
-            output: &::I8x16,
-            definition: Named("llvm.arm.neon.vvsli.v16i8")
-        },
-        "sliq_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x16, &::U8x16]; &INPUTS },
-            output: &::U8x16,
-            definition: Named("llvm.arm.neon.vvsli.v16i8")
-        },
-        "sliq_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x8, &::I16x8]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.arm.neon.vvsli.v8i16")
-        },
-        "sliq_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x8, &::U16x8]; &INPUTS },
-            output: &::U16x8,
-            definition: Named("llvm.arm.neon.vvsli.v8i16")
-        },
-        "sliq_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x4, &::I32x4]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.arm.neon.vvsli.v4i32")
-        },
-        "sliq_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x4, &::U32x4]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.arm.neon.vvsli.v4i32")
-        },
-        "sliq_s64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I64x2, &::I64x2]; &INPUTS },
-            output: &::I64x2,
-            definition: Named("llvm.arm.neon.vvsli.v2i64")
-        },
-        "sliq_u64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U64x2, &::U64x2]; &INPUTS },
-            output: &::U64x2,
-            definition: Named("llvm.arm.neon.vvsli.v2i64")
-        },
-        "vqmovn_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I16x8]; &INPUTS },
-            output: &::I8x8,
-            definition: Named("llvm.arm.neon.vqxtns.v8i8")
-        },
-        "vqmovn_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U16x8]; &INPUTS },
-            output: &::U8x8,
-            definition: Named("llvm.arm.neon.vqxtnu.v8i8")
-        },
-        "vqmovn_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I32x4]; &INPUTS },
-            output: &::I16x4,
-            definition: Named("llvm.arm.neon.vqxtns.v4i16")
-        },
-        "vqmovn_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U32x4]; &INPUTS },
-            output: &::U16x4,
-            definition: Named("llvm.arm.neon.vqxtnu.v4i16")
-        },
-        "vqmovn_s64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I64x2]; &INPUTS },
-            output: &::I32x2,
-            definition: Named("llvm.arm.neon.vqxtns.v2i32")
-        },
-        "vqmovn_u64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U64x2]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.arm.neon.vqxtnu.v2i32")
-        },
-        "abs_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I8x8]; &INPUTS },
-            output: &::I8x8,
-            definition: Named("llvm.arm.neon.vabs.v8i8")
-        },
-        "abs_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I16x4]; &INPUTS },
-            output: &::I16x4,
-            definition: Named("llvm.arm.neon.vabs.v4i16")
-        },
-        "abs_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I32x2]; &INPUTS },
-            output: &::I32x2,
-            definition: Named("llvm.arm.neon.vabs.v2i32")
-        },
-        "absq_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I8x16]; &INPUTS },
-            output: &::I8x16,
-            definition: Named("llvm.arm.neon.vabs.v16i8")
-        },
-        "absq_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I16x8]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.arm.neon.vabs.v8i16")
-        },
-        "absq_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I32x4]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.arm.neon.vabs.v4i32")
-        },
-        "abs_f32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::F32x2]; &INPUTS },
-            output: &::F32x2,
-            definition: Named("llvm.fabs.v2f32")
-        },
-        "absq_f32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::F32x4]; &INPUTS },
-            output: &::F32x4,
-            definition: Named("llvm.fabs.v4f32")
-        },
-        "qabs_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I8x8]; &INPUTS },
-            output: &::I8x8,
-            definition: Named("llvm.arm.neon.vsqabs.v8i8")
-        },
-        "qabs_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I16x4]; &INPUTS },
-            output: &::I16x4,
-            definition: Named("llvm.arm.neon.vsqabs.v4i16")
-        },
-        "qabs_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I32x2]; &INPUTS },
-            output: &::I32x2,
-            definition: Named("llvm.arm.neon.vsqabs.v2i32")
-        },
-        "qabsq_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I8x16]; &INPUTS },
-            output: &::I8x16,
-            definition: Named("llvm.arm.neon.vsqabs.v16i8")
-        },
-        "qabsq_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I16x8]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.arm.neon.vsqabs.v8i16")
-        },
-        "qabsq_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I32x4]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.arm.neon.vsqabs.v4i32")
-        },
-        "qneg_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I8x8]; &INPUTS },
-            output: &::I8x8,
-            definition: Named("llvm.arm.neon.vsqneg.v8i8")
-        },
-        "qneg_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I16x4]; &INPUTS },
-            output: &::I16x4,
-            definition: Named("llvm.arm.neon.vsqneg.v4i16")
-        },
-        "qneg_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I32x2]; &INPUTS },
-            output: &::I32x2,
-            definition: Named("llvm.arm.neon.vsqneg.v2i32")
-        },
-        "qnegq_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I8x16]; &INPUTS },
-            output: &::I8x16,
-            definition: Named("llvm.arm.neon.vsqneg.v16i8")
-        },
-        "qnegq_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I16x8]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.arm.neon.vsqneg.v8i16")
-        },
-        "qnegq_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I32x4]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.arm.neon.vsqneg.v4i32")
-        },
-        "clz_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I8x8]; &INPUTS },
-            output: &::I8x8,
-            definition: Named("llvm.ctlz.v8i8")
-        },
-        "clz_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U8x8]; &INPUTS },
-            output: &::U8x8,
-            definition: Named("llvm.ctlz.v8i8")
-        },
-        "clz_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I16x4]; &INPUTS },
-            output: &::I16x4,
-            definition: Named("llvm.ctlz.v4i16")
-        },
-        "clz_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U16x4]; &INPUTS },
-            output: &::U16x4,
-            definition: Named("llvm.ctlz.v4i16")
-        },
-        "clz_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I32x2]; &INPUTS },
-            output: &::I32x2,
-            definition: Named("llvm.ctlz.v2i32")
-        },
-        "clz_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U32x2]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.ctlz.v2i32")
-        },
-        "clzq_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I8x16]; &INPUTS },
-            output: &::I8x16,
-            definition: Named("llvm.ctlz.v16i8")
-        },
-        "clzq_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U8x16]; &INPUTS },
-            output: &::U8x16,
-            definition: Named("llvm.ctlz.v16i8")
-        },
-        "clzq_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I16x8]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.ctlz.v8i16")
-        },
-        "clzq_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U16x8]; &INPUTS },
-            output: &::U16x8,
-            definition: Named("llvm.ctlz.v8i16")
-        },
-        "clzq_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I32x4]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.ctlz.v4i32")
-        },
-        "clzq_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U32x4]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.ctlz.v4i32")
-        },
-        "cls_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I8x8]; &INPUTS },
-            output: &::I8x8,
-            definition: Named("llvm.arm.neon.vcls.v8i8")
-        },
-        "cls_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U8x8]; &INPUTS },
-            output: &::U8x8,
-            definition: Named("llvm.arm.neon.vcls.v8i8")
-        },
-        "cls_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I16x4]; &INPUTS },
-            output: &::I16x4,
-            definition: Named("llvm.arm.neon.vcls.v4i16")
-        },
-        "cls_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U16x4]; &INPUTS },
-            output: &::U16x4,
-            definition: Named("llvm.arm.neon.vcls.v4i16")
-        },
-        "cls_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I32x2]; &INPUTS },
-            output: &::I32x2,
-            definition: Named("llvm.arm.neon.vcls.v2i32")
-        },
-        "cls_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U32x2]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.arm.neon.vcls.v2i32")
-        },
-        "clsq_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I8x16]; &INPUTS },
-            output: &::I8x16,
-            definition: Named("llvm.arm.neon.vcls.v16i8")
-        },
-        "clsq_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U8x16]; &INPUTS },
-            output: &::U8x16,
-            definition: Named("llvm.arm.neon.vcls.v16i8")
-        },
-        "clsq_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I16x8]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.arm.neon.vcls.v8i16")
-        },
-        "clsq_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U16x8]; &INPUTS },
-            output: &::U16x8,
-            definition: Named("llvm.arm.neon.vcls.v8i16")
-        },
-        "clsq_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I32x4]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.arm.neon.vcls.v4i32")
-        },
-        "clsq_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U32x4]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.arm.neon.vcls.v4i32")
-        },
-        "cnt_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I8x8]; &INPUTS },
-            output: &::I8x8,
-            definition: Named("llvm.ctpop.v8i8")
-        },
-        "cnt_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U8x8]; &INPUTS },
-            output: &::U8x8,
-            definition: Named("llvm.ctpop.v8i8")
-        },
-        "cntq_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I8x16]; &INPUTS },
-            output: &::I8x16,
-            definition: Named("llvm.ctpop.v16i8")
-        },
-        "cntq_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U8x16]; &INPUTS },
-            output: &::U8x16,
-            definition: Named("llvm.ctpop.v16i8")
-        },
-        "recpe_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U32x2]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.arm.neon.vrecpe.v2i32")
-        },
-        "recpe_f32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::F32x2]; &INPUTS },
-            output: &::F32x2,
-            definition: Named("llvm.arm.neon.vrecpe.v2f32")
-        },
-        "recpeq_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U32x4]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.arm.neon.vrecpe.v4i32")
-        },
-        "recpeq_f32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::F32x4]; &INPUTS },
-            output: &::F32x4,
-            definition: Named("llvm.arm.neon.vrecpe.v4f32")
-        },
-        "recps_f32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F32x2, &::F32x2]; &INPUTS },
-            output: &::F32x2,
-            definition: Named("llvm.arm.neon.vfrecps.v2f32")
-        },
-        "recpsq_f32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F32x4, &::F32x4]; &INPUTS },
-            output: &::F32x4,
-            definition: Named("llvm.arm.neon.vfrecps.v4f32")
-        },
-        "sqrt_f32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::F32x2]; &INPUTS },
-            output: &::F32x2,
-            definition: Named("llvm.sqrt.v2f32")
-        },
-        "sqrtq_f32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::F32x4]; &INPUTS },
-            output: &::F32x4,
-            definition: Named("llvm.sqrt.v4f32")
-        },
-        "rsqrte_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U32x2]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.arm.neon.vrsqrte.v2i32")
-        },
-        "rsqrte_f32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::F32x2]; &INPUTS },
-            output: &::F32x2,
-            definition: Named("llvm.arm.neon.vrsqrte.v2f32")
-        },
-        "rsqrteq_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U32x4]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.arm.neon.vrsqrte.v4i32")
-        },
-        "rsqrteq_f32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::F32x4]; &INPUTS },
-            output: &::F32x4,
-            definition: Named("llvm.arm.neon.vrsqrte.v4f32")
-        },
-        "rsqrts_f32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F32x2, &::F32x2]; &INPUTS },
-            output: &::F32x2,
-            definition: Named("llvm.arm.neon.vrsqrts.v2f32")
-        },
-        "rsqrtsq_f32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F32x4, &::F32x4]; &INPUTS },
-            output: &::F32x4,
-            definition: Named("llvm.arm.neon.vrsqrts.v4f32")
-        },
-        "bsl_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x8, &::I8x8]; &INPUTS },
-            output: &::I8x8,
-            definition: Named("llvm.arm.neon.vbsl.v8i8")
-        },
-        "bsl_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x8, &::U8x8]; &INPUTS },
-            output: &::U8x8,
-            definition: Named("llvm.arm.neon.vbsl.v8i8")
-        },
-        "bsl_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x4, &::I16x4]; &INPUTS },
-            output: &::I16x4,
-            definition: Named("llvm.arm.neon.vbsl.v4i16")
-        },
-        "bsl_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x4, &::U16x4]; &INPUTS },
-            output: &::U16x4,
-            definition: Named("llvm.arm.neon.vbsl.v4i16")
-        },
-        "bsl_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x2, &::I32x2]; &INPUTS },
-            output: &::I32x2,
-            definition: Named("llvm.arm.neon.vbsl.v2i32")
-        },
-        "bsl_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x2, &::U32x2]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.arm.neon.vbsl.v2i32")
-        },
-        "bsl_s64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U64x1, &::I64x1]; &INPUTS },
-            output: &::I64x1,
-            definition: Named("llvm.arm.neon.vbsl.v1i64")
-        },
-        "bsl_u64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U64x1, &::U64x1]; &INPUTS },
-            output: &::U64x1,
-            definition: Named("llvm.arm.neon.vbsl.v1i64")
-        },
-        "bslq_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x16, &::I8x16]; &INPUTS },
-            output: &::I8x16,
-            definition: Named("llvm.arm.neon.vbsl.v16i8")
-        },
-        "bslq_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x16, &::U8x16]; &INPUTS },
-            output: &::U8x16,
-            definition: Named("llvm.arm.neon.vbsl.v16i8")
-        },
-        "bslq_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x8, &::I16x8]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.arm.neon.vbsl.v8i16")
-        },
-        "bslq_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x8, &::U16x8]; &INPUTS },
-            output: &::U16x8,
-            definition: Named("llvm.arm.neon.vbsl.v8i16")
-        },
-        "bslq_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x4, &::I32x4]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.arm.neon.vbsl.v4i32")
-        },
-        "bslq_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x4, &::U32x4]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.arm.neon.vbsl.v4i32")
-        },
-        "bslq_s64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U64x2, &::I64x2]; &INPUTS },
-            output: &::I64x2,
-            definition: Named("llvm.arm.neon.vbsl.v2i64")
-        },
-        "bslq_u64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U64x2, &::U64x2]; &INPUTS },
-            output: &::U64x2,
-            definition: Named("llvm.arm.neon.vbsl.v2i64")
-        },
-        "padd_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x8, &::I8x8]; &INPUTS },
-            output: &::I8x8,
-            definition: Named("llvm.arm.neon.vpadd.v8i8")
-        },
-        "padd_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x8, &::U8x8]; &INPUTS },
-            output: &::U8x8,
-            definition: Named("llvm.arm.neon.vpadd.v8i8")
-        },
-        "padd_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x4, &::I16x4]; &INPUTS },
-            output: &::I16x4,
-            definition: Named("llvm.arm.neon.vpadd.v4i16")
-        },
-        "padd_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x4, &::U16x4]; &INPUTS },
-            output: &::U16x4,
-            definition: Named("llvm.arm.neon.vpadd.v4i16")
-        },
-        "padd_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x2, &::I32x2]; &INPUTS },
-            output: &::I32x2,
-            definition: Named("llvm.arm.neon.vpadd.v2i32")
-        },
-        "padd_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x2, &::U32x2]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.arm.neon.vpadd.v2i32")
-        },
-        "padd_f32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F32x2, &::F32x2]; &INPUTS },
-            output: &::F32x2,
-            definition: Named("llvm.arm.neon.vpadd.v2f32")
-        },
-        "paddl_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I8x8]; &INPUTS },
-            output: &::I16x4,
-            definition: Named("llvm.arm.neon.vpaddls.v4i16.v8i8")
-        },
-        "paddl_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U8x8]; &INPUTS },
-            output: &::U16x4,
-            definition: Named("llvm.arm.neon.vpaddlu.v4i16.v8i8")
-        },
-        "paddl_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I16x4]; &INPUTS },
-            output: &::I32x2,
-            definition: Named("llvm.arm.neon.vpaddls.v2i32.v4i16")
-        },
-        "paddl_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U16x4]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.arm.neon.vpaddlu.v2i32.v4i16")
-        },
-        "paddl_s64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I32x2]; &INPUTS },
-            output: &::I64x1,
-            definition: Named("llvm.arm.neon.vpaddls.v1i64.v2i32")
-        },
-        "paddl_u64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U32x2]; &INPUTS },
-            output: &::U64x1,
-            definition: Named("llvm.arm.neon.vpaddlu.v1i64.v2i32")
-        },
-        "paddlq_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I8x16]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.arm.neon.vpaddls.v8i16.v16i8")
-        },
-        "paddlq_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U8x16]; &INPUTS },
-            output: &::U16x8,
-            definition: Named("llvm.arm.neon.vpaddlu.v8i16.v16i8")
-        },
-        "paddlq_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I16x8]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.arm.neon.vpaddls.v4i32.v8i16")
-        },
-        "paddlq_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U16x8]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.arm.neon.vpaddlu.v4i32.v8i16")
-        },
-        "paddlq_s64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I32x4]; &INPUTS },
-            output: &::I64x2,
-            definition: Named("llvm.arm.neon.vpaddls.v2i64.v4i32")
-        },
-        "paddlq_u64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U32x4]; &INPUTS },
-            output: &::U64x2,
-            definition: Named("llvm.arm.neon.vpaddlu.v2i64.v4i32")
-        },
-        "padal_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x4, &::I8x8]; &INPUTS },
-            output: &::I16x4,
-            definition: Named("llvm.arm.neon.vpadals.v4i16.v4i16")
-        },
-        "padal_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x4, &::U8x8]; &INPUTS },
-            output: &::U16x4,
-            definition: Named("llvm.arm.neon.vpadalu.v4i16.v4i16")
-        },
-        "padal_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x2, &::I16x4]; &INPUTS },
-            output: &::I32x2,
-            definition: Named("llvm.arm.neon.vpadals.v2i32.v2i32")
-        },
-        "padal_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x2, &::U16x4]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.arm.neon.vpadalu.v2i32.v2i32")
-        },
-        "padal_s64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I64x1, &::I32x2]; &INPUTS },
-            output: &::I64x1,
-            definition: Named("llvm.arm.neon.vpadals.v1i64.v1i64")
-        },
-        "padal_u64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U64x1, &::U32x2]; &INPUTS },
-            output: &::U64x1,
-            definition: Named("llvm.arm.neon.vpadalu.v1i64.v1i64")
-        },
-        "padalq_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x8, &::I8x16]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.arm.neon.vpadals.v8i16.v8i16")
-        },
-        "padalq_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x8, &::U8x16]; &INPUTS },
-            output: &::U16x8,
-            definition: Named("llvm.arm.neon.vpadalu.v8i16.v8i16")
-        },
-        "padalq_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x4, &::I16x8]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.arm.neon.vpadals.v4i32.v4i32")
-        },
-        "padalq_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x4, &::U16x8]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.arm.neon.vpadalu.v4i32.v4i32")
-        },
-        "padalq_s64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I64x2, &::I32x4]; &INPUTS },
-            output: &::I64x2,
-            definition: Named("llvm.arm.neon.vpadals.v2i64.v2i64")
-        },
-        "padalq_u64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U64x2, &::U32x4]; &INPUTS },
-            output: &::U64x2,
-            definition: Named("llvm.arm.neon.vpadalu.v2i64.v2i64")
-        },
-        "pmax_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x8, &::I8x8]; &INPUTS },
-            output: &::I8x8,
-            definition: Named("llvm.arm.neon.vpmaxs.v8i8")
-        },
-        "pmax_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x8, &::U8x8]; &INPUTS },
-            output: &::U8x8,
-            definition: Named("llvm.arm.neon.vpmaxu.v8i8")
-        },
-        "pmax_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x4, &::I16x4]; &INPUTS },
-            output: &::I16x4,
-            definition: Named("llvm.arm.neon.vpmaxs.v4i16")
-        },
-        "pmax_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x4, &::U16x4]; &INPUTS },
-            output: &::U16x4,
-            definition: Named("llvm.arm.neon.vpmaxu.v4i16")
-        },
-        "pmax_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x2, &::I32x2]; &INPUTS },
-            output: &::I32x2,
-            definition: Named("llvm.arm.neon.vpmaxs.v2i32")
-        },
-        "pmax_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x2, &::U32x2]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.arm.neon.vpmaxu.v2i32")
-        },
-        "pmax_f32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F32x2, &::F32x2]; &INPUTS },
-            output: &::F32x2,
-            definition: Named("llvm.arm.neon.vpmaxf.v2f32")
-        },
-        "pmin_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x8, &::I8x8]; &INPUTS },
-            output: &::I8x8,
-            definition: Named("llvm.arm.neon.vpmins.v8i8")
-        },
-        "pmin_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x8, &::U8x8]; &INPUTS },
-            output: &::U8x8,
-            definition: Named("llvm.arm.neon.vpminu.v8i8")
-        },
-        "pmin_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x4, &::I16x4]; &INPUTS },
-            output: &::I16x4,
-            definition: Named("llvm.arm.neon.vpmins.v4i16")
-        },
-        "pmin_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x4, &::U16x4]; &INPUTS },
-            output: &::U16x4,
-            definition: Named("llvm.arm.neon.vpminu.v4i16")
-        },
-        "pmin_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x2, &::I32x2]; &INPUTS },
-            output: &::I32x2,
-            definition: Named("llvm.arm.neon.vpmins.v2i32")
-        },
-        "pmin_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x2, &::U32x2]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.arm.neon.vpminu.v2i32")
-        },
-        "pmin_f32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F32x2, &::F32x2]; &INPUTS },
-            output: &::F32x2,
-            definition: Named("llvm.arm.neon.vpminf.v2f32")
-        },
-        "pminq_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x16, &::I8x16]; &INPUTS },
-            output: &::I8x16,
-            definition: Named("llvm.arm.neon.vpmins.v16i8")
-        },
-        "pminq_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x16, &::U8x16]; &INPUTS },
-            output: &::U8x16,
-            definition: Named("llvm.arm.neon.vpminu.v16i8")
-        },
-        "pminq_s16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x8, &::I16x8]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.arm.neon.vpmins.v8i16")
-        },
-        "pminq_u16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x8, &::U16x8]; &INPUTS },
-            output: &::U16x8,
-            definition: Named("llvm.arm.neon.vpminu.v8i16")
-        },
-        "pminq_s32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x4, &::I32x4]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.arm.neon.vpmins.v4i32")
-        },
-        "pminq_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x4, &::U32x4]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.arm.neon.vpminu.v4i32")
-        },
-        "pminq_f32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F32x4, &::F32x4]; &INPUTS },
-            output: &::F32x4,
-            definition: Named("llvm.arm.neon.vpminf.v4f32")
-        },
-        "tbl1_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x8, &::U8x8]; &INPUTS },
-            output: &::I8x8,
-            definition: Named("llvm.arm.neon.vtbl1")
-        },
-        "tbl1_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x8, &::U8x8]; &INPUTS },
-            output: &::U8x8,
-            definition: Named("llvm.arm.neon.vtbl1")
-        },
-        "tbx1_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I8x8, &::I8x8, &::U8x8]; &INPUTS },
-            output: &::I8x8,
-            definition: Named("llvm.arm.neon.vtbx1")
-        },
-        "tbx1_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U8x8, &::U8x8, &::U8x8]; &INPUTS },
-            output: &::U8x8,
-            definition: Named("llvm.arm.neon.vtbx1")
-        },
-        "tbl2_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [{ static AGG: Type = Type::Aggregate(true, { static PARTS: [&'static Type; 2] = [&::I8x8, &::I8x8]; &PARTS }); &AGG }, &::U8x8]; &INPUTS },
-            output: &::I8x8,
-            definition: Named("llvm.arm.neon.vtbl2")
-        },
-        "tbl2_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [{ static AGG: Type = Type::Aggregate(true, { static PARTS: [&'static Type; 2] = [&::U8x8, &::U8x8]; &PARTS }); &AGG }, &::U8x8]; &INPUTS },
-            output: &::U8x8,
-            definition: Named("llvm.arm.neon.vtbl2")
-        },
-        "tbx2_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [{ static AGG: Type = Type::Aggregate(true, { static PARTS: [&'static Type; 2] = [&::I8x8, &::I8x8]; &PARTS }); &AGG }, &::U8x8]; &INPUTS },
-            output: &::I8x8,
-            definition: Named("llvm.arm.neon.vtbx2")
-        },
-        "tbx2_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [{ static AGG: Type = Type::Aggregate(true, { static PARTS: [&'static Type; 2] = [&::U8x8, &::U8x8]; &PARTS }); &AGG }, &::U8x8]; &INPUTS },
-            output: &::U8x8,
-            definition: Named("llvm.arm.neon.vtbx2")
-        },
-        "tbl3_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [{ static AGG: Type = Type::Aggregate(true, { static PARTS: [&'static Type; 3] = [&::I8x8, &::I8x8, &::I8x8]; &PARTS }); &AGG }, &::U8x8]; &INPUTS },
-            output: &::I8x8,
-            definition: Named("llvm.arm.neon.vtbl3")
-        },
-        "tbl3_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [{ static AGG: Type = Type::Aggregate(true, { static PARTS: [&'static Type; 3] = [&::U8x8, &::U8x8, &::U8x8]; &PARTS }); &AGG }, &::U8x8]; &INPUTS },
-            output: &::U8x8,
-            definition: Named("llvm.arm.neon.vtbl3")
-        },
-        "tbx3_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I8x8, { static AGG: Type = Type::Aggregate(true, { static PARTS: [&'static Type; 3] = [&::I8x8, &::I8x8, &::I8x8]; &PARTS }); &AGG }, &::U8x8]; &INPUTS },
-            output: &::I8x8,
-            definition: Named("llvm.arm.neon.vtbx3")
-        },
-        "tbx3_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U8x8, { static AGG: Type = Type::Aggregate(true, { static PARTS: [&'static Type; 3] = [&::U8x8, &::U8x8, &::U8x8]; &PARTS }); &AGG }, &::U8x8]; &INPUTS },
-            output: &::U8x8,
-            definition: Named("llvm.arm.neon.vtbx3")
-        },
-        "tbl4_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [{ static AGG: Type = Type::Aggregate(true, { static PARTS: [&'static Type; 4] = [&::I8x8, &::I8x8, &::I8x8, &::I8x8]; &PARTS }); &AGG }, &::U8x8]; &INPUTS },
-            output: &::I8x8,
-            definition: Named("llvm.arm.neon.vtbl4")
-        },
-        "tbl4_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [{ static AGG: Type = Type::Aggregate(true, { static PARTS: [&'static Type; 4] = [&::U8x8, &::U8x8, &::U8x8, &::U8x8]; &PARTS }); &AGG }, &::U8x8]; &INPUTS },
-            output: &::U8x8,
-            definition: Named("llvm.arm.neon.vtbl4")
-        },
-        "tbx4_s8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I8x8, { static AGG: Type = Type::Aggregate(true, { static PARTS: [&'static Type; 4] = [&::I8x8, &::I8x8, &::I8x8, &::I8x8]; &PARTS }); &AGG }, &::U8x8]; &INPUTS },
-            output: &::I8x8,
-            definition: Named("llvm.arm.neon.vtbx4")
-        },
-        "tbx4_u8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U8x8, { static AGG: Type = Type::Aggregate(true, { static PARTS: [&'static Type; 4] = [&::U8x8, &::U8x8, &::U8x8, &::U8x8]; &PARTS }); &AGG }, &::U8x8]; &INPUTS },
-            output: &::U8x8,
-            definition: Named("llvm.arm.neon.vtbx4")
-        },
-        _ => return None,
-    })
-}
diff --git a/src/librustc_platform_intrinsics/hexagon.rs b/src/librustc_platform_intrinsics/hexagon.rs
deleted file mode 100644
index fd0f3a4..0000000
--- a/src/librustc_platform_intrinsics/hexagon.rs
+++ /dev/null
@@ -1,2924 +0,0 @@
-// DO NOT EDIT: autogenerated by etc/platform-intrinsics/generator.py
-// ignore-tidy-linelength
-
-#![allow(unused_imports)]
-
-use {Intrinsic, Type};
-use IntrinsicDef::Named;
-
-pub fn find(name: &str) -> Option<Intrinsic> {
-    if !name.starts_with("Q6_") { return None }
-    Some(match &name["Q6_".len()..] {
-        "R_vextract64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x16, &::U32]; &INPUTS },
-            output: &::U32,
-            definition: Named("llvm.hexagon.V6.extractw")
-        },
-        "R_vextract128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x32, &::U32]; &INPUTS },
-            output: &::U32,
-            definition: Named("llvm.hexagon.V6.extractw.128B")
-        },
-        "V_lo64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U32x32]; &INPUTS },
-            output: &::U32x16,
-            definition: Named("llvm.hexagon.V6.lo")
-        },
-        "V_lo128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U32x64]; &INPUTS },
-            output: &::U32x32,
-            definition: Named("llvm.hexagon.V6.lo.128B")
-        },
-        "V_hi64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U32x32]; &INPUTS },
-            output: &::U32x16,
-            definition: Named("llvm.hexagon.V6.hi")
-        },
-        "V_hi128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U32x64]; &INPUTS },
-            output: &::U32x32,
-            definition: Named("llvm.hexagon.V6.hi.128B")
-        },
-        "V_vsplat_R64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U32]; &INPUTS },
-            output: &::U32x16,
-            definition: Named("llvm.hexagon.V6.lvsplatuw")
-        },
-        "V_vsplat_R128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U32]; &INPUTS },
-            output: &::U32x32,
-            definition: Named("llvm.hexagon.V6.lvsplatuw.128B")
-        },
-        "Q_and_QQ64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x2, &::U32x2]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.hexagon.V6.pred.and")
-        },
-        "Q_and_QQ128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x4, &::U32x4]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.hexagon.V6.pred.and.128B")
-        },
-        "Q_not_Q64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U32x2]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.hexagon.V6.pred.not")
-        },
-        "Q_not_Q128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U32x4]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.hexagon.V6.pred.not.128B")
-        },
-        "Q_or_QQ64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x2, &::U32x2]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.hexagon.V6.pred.or")
-        },
-        "Q_or_QQ128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x4, &::U32x4]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.hexagon.V6.pred.or.128B")
-        },
-        "Q_xor_QQ64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x2, &::U32x2]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.hexagon.V6.pred.xor")
-        },
-        "Q_xor_QQ128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x4, &::U32x4]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.hexagon.V6.pred.xor.128B")
-        },
-        "Vub_vabsdiff_VubVub64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x64, &::U8x64]; &INPUTS },
-            output: &::U8x64,
-            definition: Named("llvm.hexagon.V6.vabsdiffub")
-        },
-        "Vuh_vabsdiff_VuhVuh64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x32, &::U16x32]; &INPUTS },
-            output: &::U16x32,
-            definition: Named("llvm.hexagon.V6.vabsdiffuh")
-        },
-        "Vub_vabsdiff_VubVub128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x128, &::U8x128]; &INPUTS },
-            output: &::U8x128,
-            definition: Named("llvm.hexagon.V6.vabsdiffub.128B")
-        },
-        "Vuh_vabsdiff_VuhVuh128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x64, &::U16x64]; &INPUTS },
-            output: &::U16x64,
-            definition: Named("llvm.hexagon.V6.vabsdiffuh.128B")
-        },
-        "Vuh_vabsdiff_VhVh64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x32, &::I16x32]; &INPUTS },
-            output: &::U16x32,
-            definition: Named("llvm.hexagon.V6.vabsdiffh")
-        },
-        "Vuw_vabsdiff_VwVw64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x16, &::I32x16]; &INPUTS },
-            output: &::U32x16,
-            definition: Named("llvm.hexagon.V6.vabsdiffw")
-        },
-        "Vuh_vabsdiff_VhVh128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x64, &::I16x64]; &INPUTS },
-            output: &::U16x64,
-            definition: Named("llvm.hexagon.V6.vabsdiffh.128B")
-        },
-        "Vuw_vabsdiff_VwVw128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x32, &::I32x32]; &INPUTS },
-            output: &::U32x32,
-            definition: Named("llvm.hexagon.V6.vabsdiffw.128B")
-        },
-        "Vh_vabs_Vh64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I16x32]; &INPUTS },
-            output: &::I16x32,
-            definition: Named("llvm.hexagon.V6.vabsh")
-        },
-        "Vw_vabs_Vw64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I32x16]; &INPUTS },
-            output: &::I32x16,
-            definition: Named("llvm.hexagon.V6.vabsw")
-        },
-        "Vh_vabs_Vh128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I16x64]; &INPUTS },
-            output: &::I16x64,
-            definition: Named("llvm.hexagon.V6.vabsh.128B")
-        },
-        "Vw_vabs_Vw128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I32x32]; &INPUTS },
-            output: &::I32x32,
-            definition: Named("llvm.hexagon.V6.vabsw.128B")
-        },
-        "Vh_vabs_Vh_sat64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I16x32]; &INPUTS },
-            output: &::I16x32,
-            definition: Named("llvm.hexagon.V6.vabsh.sat")
-        },
-        "Vw_vabs_Vw_sat64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I32x16]; &INPUTS },
-            output: &::I32x16,
-            definition: Named("llvm.hexagon.V6.vabsw.sat")
-        },
-        "Vh_vabs_Vh_sat128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I16x64]; &INPUTS },
-            output: &::I16x64,
-            definition: Named("llvm.hexagon.V6.vabsh.sat.128B")
-        },
-        "Vw_vabs_Vw_sat128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I32x32]; &INPUTS },
-            output: &::I32x32,
-            definition: Named("llvm.hexagon.V6.vabsw.sat.128B")
-        },
-        "Vb_vadd_VbVb64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x64, &::I8x64]; &INPUTS },
-            output: &::I8x64,
-            definition: Named("llvm.hexagon.V6.vaddb")
-        },
-        "Vh_vadd_VhVh64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x32, &::I16x32]; &INPUTS },
-            output: &::I16x32,
-            definition: Named("llvm.hexagon.V6.vaddh")
-        },
-        "Vw_vadd_VwVw64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x16, &::I32x16]; &INPUTS },
-            output: &::I32x16,
-            definition: Named("llvm.hexagon.V6.vaddw")
-        },
-        "Vb_vadd_VbVb128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x128, &::I8x128]; &INPUTS },
-            output: &::I8x128,
-            definition: Named("llvm.hexagon.V6.vaddb.128B")
-        },
-        "Vh_vadd_VhVh128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x64, &::I16x64]; &INPUTS },
-            output: &::I16x64,
-            definition: Named("llvm.hexagon.V6.vaddh.128B")
-        },
-        "Vw_vadd_VwVw128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x32, &::I32x32]; &INPUTS },
-            output: &::I32x32,
-            definition: Named("llvm.hexagon.V6.vaddw.128B")
-        },
-        "Vh_vadd_VhVh_sat64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x32, &::I16x32]; &INPUTS },
-            output: &::I16x32,
-            definition: Named("llvm.hexagon.V6.vaddhsat")
-        },
-        "Vw_vadd_VwVw_sat64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x16, &::I32x16]; &INPUTS },
-            output: &::I32x16,
-            definition: Named("llvm.hexagon.V6.vaddwsat")
-        },
-        "Vh_vadd_VhVh_sat128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x64, &::I16x64]; &INPUTS },
-            output: &::I16x64,
-            definition: Named("llvm.hexagon.V6.vaddhsat.128B")
-        },
-        "Vw_vadd_VwVw_sat128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x32, &::I32x32]; &INPUTS },
-            output: &::I32x32,
-            definition: Named("llvm.hexagon.V6.vaddwsat.128B")
-        },
-        "Vub_vadd_VubVub_sat64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x64, &::U8x64]; &INPUTS },
-            output: &::U8x64,
-            definition: Named("llvm.hexagon.V6.vaddubsat")
-        },
-        "Vuh_vadd_VuhVuh_sat64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x32, &::U16x32]; &INPUTS },
-            output: &::U16x32,
-            definition: Named("llvm.hexagon.V6.vadduhsat")
-        },
-        "Vub_vadd_VubVub_sat128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x128, &::U8x128]; &INPUTS },
-            output: &::U8x128,
-            definition: Named("llvm.hexagon.V6.vaddubsat.128B")
-        },
-        "Vuh_vadd_VuhVuh_sat128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x64, &::U16x64]; &INPUTS },
-            output: &::U16x64,
-            definition: Named("llvm.hexagon.V6.vadduhsat.128B")
-        },
-        "Wb_vadd_WbWb64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x128, &::I8x128]; &INPUTS },
-            output: &::I8x128,
-            definition: Named("llvm.hexagon.V6.vaddb.dv")
-        },
-        "Wh_vadd_WhWh64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x64, &::I16x64]; &INPUTS },
-            output: &::I16x64,
-            definition: Named("llvm.hexagon.V6.vaddh.dv")
-        },
-        "Ww_vadd_WwWw64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x32, &::I32x32]; &INPUTS },
-            output: &::I32x32,
-            definition: Named("llvm.hexagon.V6.vaddw.dv")
-        },
-        "Wb_vadd_WbWb128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x256, &::I8x256]; &INPUTS },
-            output: &::I8x256,
-            definition: Named("llvm.hexagon.V6.vaddb.dv.128B")
-        },
-        "Wh_vadd_WhWh128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x128, &::I16x128]; &INPUTS },
-            output: &::I16x128,
-            definition: Named("llvm.hexagon.V6.vaddh.dv.128B")
-        },
-        "Ww_vadd_WwWw128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x64, &::I32x64]; &INPUTS },
-            output: &::I32x64,
-            definition: Named("llvm.hexagon.V6.vaddw.dv.128B")
-        },
-        "Wh_vadd_WhWh_sat64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x64, &::I16x64]; &INPUTS },
-            output: &::I16x64,
-            definition: Named("llvm.hexagon.V6.vaddhsat.dv")
-        },
-        "Ww_vadd_WwWw_sat64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x32, &::I32x32]; &INPUTS },
-            output: &::I32x32,
-            definition: Named("llvm.hexagon.V6.vaddwsat.dv")
-        },
-        "Wh_vadd_WhWh_sat128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x128, &::I16x128]; &INPUTS },
-            output: &::I16x128,
-            definition: Named("llvm.hexagon.V6.vaddhsat.dv.128B")
-        },
-        "Ww_vadd_WwWw_sat128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x64, &::I32x64]; &INPUTS },
-            output: &::I32x64,
-            definition: Named("llvm.hexagon.V6.vaddwsat.dv.128B")
-        },
-        "Wub_vadd_WubWub_sat64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x128, &::U8x128]; &INPUTS },
-            output: &::U8x128,
-            definition: Named("llvm.hexagon.V6.vaddubsat.dv")
-        },
-        "Wuh_vadd_WuhWuh_sat64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x64, &::U16x64]; &INPUTS },
-            output: &::U16x64,
-            definition: Named("llvm.hexagon.V6.vadduhsat.dv")
-        },
-        "Wub_vadd_WubWub_sat128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x256, &::U8x256]; &INPUTS },
-            output: &::U8x256,
-            definition: Named("llvm.hexagon.V6.vaddubsat.dv.128B")
-        },
-        "Wuh_vadd_WuhWuh_sat128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x128, &::U16x128]; &INPUTS },
-            output: &::U16x128,
-            definition: Named("llvm.hexagon.V6.vadduhsat.dv.128B")
-        },
-        "V_valign_VVR64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U8x64, &::U8x64, &::U32]; &INPUTS },
-            output: &::U8x64,
-            definition: Named("llvm.hexagon.V6.valignb")
-        },
-        "V_valign_VVR128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U8x128, &::U8x128, &::U32]; &INPUTS },
-            output: &::U8x128,
-            definition: Named("llvm.hexagon.V6.valignb.128B")
-        },
-        "V_valign_VVI64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U8x64, &::U8x64, &::U32]; &INPUTS },
-            output: &::U8x64,
-            definition: Named("llvm.hexagon.V6.valignbi")
-        },
-        "V_valign_VVI128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U8x128, &::U8x128, &::U32]; &INPUTS },
-            output: &::U8x128,
-            definition: Named("llvm.hexagon.V6.valignbi.128B")
-        },
-        "V_vlalign_VVR64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U8x64, &::U8x64, &::U32]; &INPUTS },
-            output: &::U8x64,
-            definition: Named("llvm.hexagon.V6.vlalignb")
-        },
-        "V_vlalign_VVR128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U8x128, &::U8x128, &::U32]; &INPUTS },
-            output: &::U8x128,
-            definition: Named("llvm.hexagon.V6.vlalignb.128B")
-        },
-        "V_vlalign_VVI64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U8x64, &::U8x64, &::U32]; &INPUTS },
-            output: &::U8x64,
-            definition: Named("llvm.hexagon.V6.vlalignbi")
-        },
-        "V_vlalign_VVI128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U8x128, &::U8x128, &::U32]; &INPUTS },
-            output: &::U8x128,
-            definition: Named("llvm.hexagon.V6.vlalignbi.128B")
-        },
-        "V_vand_VV64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x32, &::U16x32]; &INPUTS },
-            output: &::U16x32,
-            definition: Named("llvm.hexagon.V6.vand")
-        },
-        "V_vand_VV128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x64, &::U16x64]; &INPUTS },
-            output: &::U16x64,
-            definition: Named("llvm.hexagon.V6.vand.128B")
-        },
-        "V_vand_QR64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x2, &::U32]; &INPUTS },
-            output: &::U8x64,
-            definition: Named("llvm.hexagon.V6.vandqrt")
-        },
-        "V_vand_QR128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x4, &::U32]; &INPUTS },
-            output: &::U8x128,
-            definition: Named("llvm.hexagon.V6.vandqrt.128B")
-        },
-        "V_vandor_VQR64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U8x64, &::U32x2, &::U32]; &INPUTS },
-            output: &::U8x64,
-            definition: Named("llvm.hexagon.V6.vandqrt.acc")
-        },
-        "V_vandor_VQR128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U8x128, &::U32x4, &::U32]; &INPUTS },
-            output: &::U8x128,
-            definition: Named("llvm.hexagon.V6.vandqrt.acc.128B")
-        },
-        "Q_vand_VR64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x64, &::U32]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.hexagon.V6.vandvrt")
-        },
-        "Q_vand_VR128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x128, &::U32]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.hexagon.V6.vandvrt.128B")
-        },
-        "Q_vandor_QVR64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x2, &::U8x64, &::U32]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.hexagon.V6.vandvrt")
-        },
-        "Q_vandor_QVR128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x4, &::U8x128, &::U32]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.hexagon.V6.vandvrt.128B")
-        },
-        "Vh_vasl_VhR64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x32, &::U32]; &INPUTS },
-            output: &::I16x32,
-            definition: Named("llvm.hexagon.V6.vaslh")
-        },
-        "Vw_vasl_VwR64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x16, &::U32]; &INPUTS },
-            output: &::I32x16,
-            definition: Named("llvm.hexagon.V6.vaslw")
-        },
-        "Vh_vasl_VhR128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x64, &::U32]; &INPUTS },
-            output: &::I16x64,
-            definition: Named("llvm.hexagon.V6.vaslh.128B")
-        },
-        "Vw_vasl_VwR128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x32, &::U32]; &INPUTS },
-            output: &::I32x32,
-            definition: Named("llvm.hexagon.V6.vaslw.128B")
-        },
-        "Vh_vasl_VhVh64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x32, &::I16x32]; &INPUTS },
-            output: &::I16x32,
-            definition: Named("llvm.hexagon.V6.vaslhv")
-        },
-        "Vw_vasl_VwVw64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x16, &::I32x16]; &INPUTS },
-            output: &::I32x16,
-            definition: Named("llvm.hexagon.V6.vaslwv")
-        },
-        "Vh_vasl_VhVh128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x64, &::I16x64]; &INPUTS },
-            output: &::I16x64,
-            definition: Named("llvm.hexagon.V6.vaslhv.128B")
-        },
-        "Vw_vasl_VwVw128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x32, &::I32x32]; &INPUTS },
-            output: &::I32x32,
-            definition: Named("llvm.hexagon.V6.vaslwv.128B")
-        },
-        "Vw_vaslacc_VwVwR64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I32x16, &::I32x16, &::U32]; &INPUTS },
-            output: &::I32x16,
-            definition: Named("llvm.hexagon.V6.vaslw.acc")
-        },
-        "Vw_vaslacc_VwVwR128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I32x32, &::I32x32, &::U32]; &INPUTS },
-            output: &::I32x32,
-            definition: Named("llvm.hexagon.V6.vaslw.acc.128B")
-        },
-        "Vh_vasr_VhR64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x32, &::U32]; &INPUTS },
-            output: &::I16x32,
-            definition: Named("llvm.hexagon.V6.vasrh")
-        },
-        "Vw_vasr_VwR64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x16, &::U32]; &INPUTS },
-            output: &::I32x16,
-            definition: Named("llvm.hexagon.V6.vasrw")
-        },
-        "Vh_vasr_VhR128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x64, &::U32]; &INPUTS },
-            output: &::I16x64,
-            definition: Named("llvm.hexagon.V6.vasrh.128B")
-        },
-        "Vw_vasr_VwR128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x32, &::U32]; &INPUTS },
-            output: &::I32x32,
-            definition: Named("llvm.hexagon.V6.vasrw.128B")
-        },
-        "Vh_vasr_VhVh64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x32, &::I16x32]; &INPUTS },
-            output: &::I16x32,
-            definition: Named("llvm.hexagon.V6.vasrhv")
-        },
-        "Vw_vasr_VwVw64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x16, &::I32x16]; &INPUTS },
-            output: &::I32x16,
-            definition: Named("llvm.hexagon.V6.vasrwv")
-        },
-        "Vh_vasr_VhVh128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x64, &::I16x64]; &INPUTS },
-            output: &::I16x64,
-            definition: Named("llvm.hexagon.V6.vasrhv.128B")
-        },
-        "Vw_vasr_VwVw128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x32, &::I32x32]; &INPUTS },
-            output: &::I32x32,
-            definition: Named("llvm.hexagon.V6.vasrwv.128B")
-        },
-        "Vw_vasracc_VwVwR64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I32x16, &::I32x16, &::U32]; &INPUTS },
-            output: &::I32x16,
-            definition: Named("llvm.hexagon.V6.vasrw.acc")
-        },
-        "Vw_vasracc_VwVwR128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I32x32, &::I32x32, &::U32]; &INPUTS },
-            output: &::I32x32,
-            definition: Named("llvm.hexagon.V6.vasrw.acc.128B")
-        },
-        "Vh_vasr_VwVwR64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I32x16, &::I32x16, &::U32]; &INPUTS },
-            output: &::I16x32,
-            definition: Named("llvm.hexagon.V6.vasrhw")
-        },
-        "Vh_vasr_VwVwR128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I32x32, &::I32x32, &::U32]; &INPUTS },
-            output: &::I16x64,
-            definition: Named("llvm.hexagon.V6.vasrhw.128B")
-        },
-        "Vb_vasr_VhVhR_sat64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I16x32, &::I16x32, &::U32]; &INPUTS },
-            output: &::I8x64,
-            definition: Named("llvm.hexagon.V6.vasrhbsat")
-        },
-        "Vub_vasr_VhVhR_sat64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I16x32, &::I16x32, &::U32]; &INPUTS },
-            output: &::U8x64,
-            definition: Named("llvm.hexagon.V6.vasrhbsat")
-        },
-        "Vh_vasr_VwVwR_sat64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I32x16, &::I32x16, &::U32]; &INPUTS },
-            output: &::I16x32,
-            definition: Named("llvm.hexagon.V6.vasrwhsat")
-        },
-        "Vuh_vasr_VwVwR_sat64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I32x16, &::I32x16, &::U32]; &INPUTS },
-            output: &::U16x32,
-            definition: Named("llvm.hexagon.V6.vasrwhsat")
-        },
-        "Vb_vasr_VhVhR_sat128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I16x64, &::I16x64, &::U32]; &INPUTS },
-            output: &::I8x128,
-            definition: Named("llvm.hexagon.V6.vasrhbsat.128B")
-        },
-        "Vub_vasr_VhVhR_sat128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I16x64, &::I16x64, &::U32]; &INPUTS },
-            output: &::U8x128,
-            definition: Named("llvm.hexagon.V6.vasrhbsat.128B")
-        },
-        "Vh_vasr_VwVwR_sat128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I32x32, &::I32x32, &::U32]; &INPUTS },
-            output: &::I16x64,
-            definition: Named("llvm.hexagon.V6.vasrwhsat.128B")
-        },
-        "Vuh_vasr_VwVwR_sat128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I32x32, &::I32x32, &::U32]; &INPUTS },
-            output: &::U16x64,
-            definition: Named("llvm.hexagon.V6.vasrwhsat.128B")
-        },
-        "Vb_vasr_VhVhR_rnd_sat64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I16x32, &::I16x32, &::U32]; &INPUTS },
-            output: &::I8x64,
-            definition: Named("llvm.hexagon.V6.vasrhbrndsat")
-        },
-        "Vub_vasr_VhVhR_rnd_sat64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I16x32, &::I16x32, &::U32]; &INPUTS },
-            output: &::U8x64,
-            definition: Named("llvm.hexagon.V6.vasrhbrndsat")
-        },
-        "Vh_vasr_VwVwR_rnd_sat64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I32x16, &::I32x16, &::U32]; &INPUTS },
-            output: &::I16x32,
-            definition: Named("llvm.hexagon.V6.vasrwhrndsat")
-        },
-        "Vuh_vasr_VwVwR_rnd_sat64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I32x16, &::I32x16, &::U32]; &INPUTS },
-            output: &::U16x32,
-            definition: Named("llvm.hexagon.V6.vasrwhrndsat")
-        },
-        "Vb_vasr_VhVhR_rnd_sat128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I16x64, &::I16x64, &::U32]; &INPUTS },
-            output: &::I8x128,
-            definition: Named("llvm.hexagon.V6.vasrhbrndsat.128B")
-        },
-        "Vub_vasr_VhVhR_rnd_sat128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I16x64, &::I16x64, &::U32]; &INPUTS },
-            output: &::U8x128,
-            definition: Named("llvm.hexagon.V6.vasrhbrndsat.128B")
-        },
-        "Vh_vasr_VwVwR_rnd_sat128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I32x32, &::I32x32, &::U32]; &INPUTS },
-            output: &::I16x64,
-            definition: Named("llvm.hexagon.V6.vasrwhrndsat.128B")
-        },
-        "Vuh_vasr_VwVwR_rnd_sat128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I32x32, &::I32x32, &::U32]; &INPUTS },
-            output: &::U16x64,
-            definition: Named("llvm.hexagon.V6.vasrwhrndsat.128B")
-        },
-        "V_equals_V64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U32x16]; &INPUTS },
-            output: &::U32x16,
-            definition: Named("llvm.hexagon.V6.vassign")
-        },
-        "V_equals_V128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U32x32]; &INPUTS },
-            output: &::U32x32,
-            definition: Named("llvm.hexagon.V6.vassign.128B")
-        },
-        "W_equals_W64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U32x32]; &INPUTS },
-            output: &::U32x32,
-            definition: Named("llvm.hexagon.V6.vassignp")
-        },
-        "W_equals_W128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U32x64]; &INPUTS },
-            output: &::U32x64,
-            definition: Named("llvm.hexagon.V6.vassignp.128B")
-        },
-        "Vh_vavg_VhVh64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x32, &::I16x32]; &INPUTS },
-            output: &::I16x32,
-            definition: Named("llvm.hexagon.V6.vavgh")
-        },
-        "Vw_vavg_VwVw64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x16, &::I32x16]; &INPUTS },
-            output: &::I32x16,
-            definition: Named("llvm.hexagon.V6.vavgw")
-        },
-        "Vh_vavg_VhVh128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x64, &::I16x64]; &INPUTS },
-            output: &::I16x64,
-            definition: Named("llvm.hexagon.V6.vavgh.128B")
-        },
-        "Vw_vavg_VwVw128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x32, &::I32x32]; &INPUTS },
-            output: &::I32x32,
-            definition: Named("llvm.hexagon.V6.vavgw.128B")
-        },
-        "Vub_vavg_VubVub64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x64, &::U8x64]; &INPUTS },
-            output: &::U8x64,
-            definition: Named("llvm.hexagon.V6.vavgub")
-        },
-        "Vuh_vavg_VuhVuh64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x32, &::U16x32]; &INPUTS },
-            output: &::U16x32,
-            definition: Named("llvm.hexagon.V6.vavguh")
-        },
-        "Vub_vavg_VubVub128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x128, &::U8x128]; &INPUTS },
-            output: &::U8x128,
-            definition: Named("llvm.hexagon.V6.vavgub.128B")
-        },
-        "Vuh_vavg_VuhVuh128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x64, &::U16x64]; &INPUTS },
-            output: &::U16x64,
-            definition: Named("llvm.hexagon.V6.vavguh.128B")
-        },
-        "Vh_vavg_VhVh_rnd64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x32, &::I16x32]; &INPUTS },
-            output: &::I16x32,
-            definition: Named("llvm.hexagon.V6.vavgrndh")
-        },
-        "Vw_vavg_VwVw_rnd64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x16, &::I32x16]; &INPUTS },
-            output: &::I32x16,
-            definition: Named("llvm.hexagon.V6.vavgrndw")
-        },
-        "Vh_vavg_VhVh_rnd128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x64, &::I16x64]; &INPUTS },
-            output: &::I16x64,
-            definition: Named("llvm.hexagon.V6.vavgrndh.128B")
-        },
-        "Vw_vavg_VwVw_rnd128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x32, &::I32x32]; &INPUTS },
-            output: &::I32x32,
-            definition: Named("llvm.hexagon.V6.vavgrndw.128B")
-        },
-        "Vub_vavg_VubVub_rnd64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x64, &::U8x64]; &INPUTS },
-            output: &::U8x64,
-            definition: Named("llvm.hexagon.V6.vavgrndub")
-        },
-        "Vuh_vavg_VuhVuh_rnd64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x32, &::U16x32]; &INPUTS },
-            output: &::U16x32,
-            definition: Named("llvm.hexagon.V6.vavgrnduh")
-        },
-        "Vub_vavg_VubVub_rnd128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x128, &::U8x128]; &INPUTS },
-            output: &::U8x128,
-            definition: Named("llvm.hexagon.V6.vavgrndub.128B")
-        },
-        "Vuh_vavg_VuhVuh_rnd128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x64, &::U16x64]; &INPUTS },
-            output: &::U16x64,
-            definition: Named("llvm.hexagon.V6.vavgrnduh.128B")
-        },
-        "Vuh_vcl0_Vuh64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U16x32]; &INPUTS },
-            output: &::U16x32,
-            definition: Named("llvm.hexagon.V6.vcl0h")
-        },
-        "Vuw_vcl0_Vuw64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U32x16]; &INPUTS },
-            output: &::U32x16,
-            definition: Named("llvm.hexagon.V6.vcl0w")
-        },
-        "Vuh_vcl0_Vuh128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U16x64]; &INPUTS },
-            output: &::U16x64,
-            definition: Named("llvm.hexagon.V6.vcl0h.128B")
-        },
-        "Vuw_vcl0_Vuw128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U32x32]; &INPUTS },
-            output: &::U32x32,
-            definition: Named("llvm.hexagon.V6.vcl0w.128B")
-        },
-        "W_vcombine_VV64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x64, &::U8x64]; &INPUTS },
-            output: &::U8x128,
-            definition: Named("llvm.hexagon.V6.vcombine")
-        },
-        "W_vcombine_VV128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x128, &::U8x128]; &INPUTS },
-            output: &::U8x256,
-            definition: Named("llvm.hexagon.V6.vcombine.128B")
-        },
-        "V_vzero64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 0] = []; &INPUTS },
-            output: &::U32x16,
-            definition: Named("llvm.hexagon.V6.vd0")
-        },
-        "V_vzero128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 0] = []; &INPUTS },
-            output: &::U32x32,
-            definition: Named("llvm.hexagon.V6.vd0.128B")
-        },
-        "Vb_vdeal_Vb64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I8x64]; &INPUTS },
-            output: &::I8x64,
-            definition: Named("llvm.hexagon.V6.vdealb")
-        },
-        "Vh_vdeal_Vh64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I16x32]; &INPUTS },
-            output: &::I16x32,
-            definition: Named("llvm.hexagon.V6.vdealh")
-        },
-        "Vb_vdeal_Vb128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I8x128]; &INPUTS },
-            output: &::I8x128,
-            definition: Named("llvm.hexagon.V6.vdealb.128B")
-        },
-        "Vh_vdeal_Vh128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I16x64]; &INPUTS },
-            output: &::I16x64,
-            definition: Named("llvm.hexagon.V6.vdealh.128B")
-        },
-        "Vb_vdeale_VbVb64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x64, &::I8x64]; &INPUTS },
-            output: &::I8x64,
-            definition: Named("llvm.hexagon.V6.vdealb4w")
-        },
-        "Vb_vdeale_VbVb128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x128, &::I8x128]; &INPUTS },
-            output: &::I8x128,
-            definition: Named("llvm.hexagon.V6.vdealb4w.128B")
-        },
-        "W_vdeal_VVR64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U8x64, &::U8x64, &::U32]; &INPUTS },
-            output: &::U8x128,
-            definition: Named("llvm.hexagon.V6.vdealvdd")
-        },
-        "W_vdeal_VVR128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U8x128, &::U8x128, &::U32]; &INPUTS },
-            output: &::U8x256,
-            definition: Named("llvm.hexagon.V6.vdealvdd.128B")
-        },
-        "V_vdelta_VV64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x64, &::U8x64]; &INPUTS },
-            output: &::U8x64,
-            definition: Named("llvm.hexagon.V6.vdelta")
-        },
-        "V_vdelta_VV128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x128, &::U8x128]; &INPUTS },
-            output: &::U8x128,
-            definition: Named("llvm.hexagon.V6.vdelta.128B")
-        },
-        "Vh_vdmpy_VubRb64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x64, &::U32]; &INPUTS },
-            output: &::I16x32,
-            definition: Named("llvm.hexagon.V6.vdmpybus")
-        },
-        "Vh_vdmpy_VubRb128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x128, &::U32]; &INPUTS },
-            output: &::I16x64,
-            definition: Named("llvm.hexagon.V6.vdmpybus.128B")
-        },
-        "Vh_vdmpyacc_VhVubRb64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I16x32, &::U8x64, &::U32]; &INPUTS },
-            output: &::I16x32,
-            definition: Named("llvm.hexagon.V6.vdmpybus.acc")
-        },
-        "Vh_vdmpyacc_VhVubRb128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I16x64, &::U8x128, &::U32]; &INPUTS },
-            output: &::I16x64,
-            definition: Named("llvm.hexagon.V6.vdmpybus.acc.128B")
-        },
-        "Wh_vdmpy_WubRb64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x128, &::U32]; &INPUTS },
-            output: &::I16x64,
-            definition: Named("llvm.hexagon.V6.vdmpybus.dv")
-        },
-        "Wh_vdmpy_WubRb128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x256, &::U32]; &INPUTS },
-            output: &::I16x128,
-            definition: Named("llvm.hexagon.V6.vdmpybus.dv.128B")
-        },
-        "Wh_vdmpyacc_WhWubRb64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I16x64, &::U8x128, &::U32]; &INPUTS },
-            output: &::I16x64,
-            definition: Named("llvm.hexagon.V6.vdmpybus.dv.acc")
-        },
-        "Wh_vdmpyacc_WhWubRb128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I16x128, &::U8x256, &::U32]; &INPUTS },
-            output: &::I16x128,
-            definition: Named("llvm.hexagon.V6.vdmpybus.dv.acc.128B")
-        },
-        "Vw_vdmpy_VhRb64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x32, &::U32]; &INPUTS },
-            output: &::I32x16,
-            definition: Named("llvm.hexagon.V6.vdmpyhb")
-        },
-        "Vw_vdmpy_VhRb128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x64, &::U32]; &INPUTS },
-            output: &::I32x32,
-            definition: Named("llvm.hexagon.V6.vdmpyhb.128B")
-        },
-        "Vw_vdmpyacc_VwVhRb64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I32x16, &::I16x32, &::U32]; &INPUTS },
-            output: &::I32x16,
-            definition: Named("llvm.hexagon.V6.vdmpyhb.acc")
-        },
-        "Vw_vdmpyacc_VwVhRb128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I32x32, &::I16x64, &::U32]; &INPUTS },
-            output: &::I32x32,
-            definition: Named("llvm.hexagon.V6.vdmpyhb.acc.128B")
-        },
-        "Ww_vdmpy_WhRb64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x64, &::U32]; &INPUTS },
-            output: &::I32x32,
-            definition: Named("llvm.hexagon.V6.vdmpyhb.dv")
-        },
-        "Ww_vdmpy_WhRb128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x128, &::U32]; &INPUTS },
-            output: &::I32x64,
-            definition: Named("llvm.hexagon.V6.vdmpyhb.dv.128B")
-        },
-        "Ww_vdmpyacc_WwWhRb64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I32x32, &::I16x64, &::U32]; &INPUTS },
-            output: &::I32x32,
-            definition: Named("llvm.hexagon.V6.vdmpyhb.dv.acc")
-        },
-        "Ww_vdmpyacc_WwWhRb128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I32x64, &::I16x128, &::U32]; &INPUTS },
-            output: &::I32x64,
-            definition: Named("llvm.hexagon.V6.vdmpyhb.dv.acc.128B")
-        },
-        "Vw_vdmpy_WwRh_sat64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x32, &::U32]; &INPUTS },
-            output: &::I32x16,
-            definition: Named("llvm.hexagon.V6.vdmpyhisat")
-        },
-        "Vw_vdmpy_WwRh_sat128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x64, &::U32]; &INPUTS },
-            output: &::I32x32,
-            definition: Named("llvm.hexagon.V6.vdmpyhisat.128B")
-        },
-        "Vw_vdmpy_VhRh_sat64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x32, &::U32]; &INPUTS },
-            output: &::I32x16,
-            definition: Named("llvm.hexagon.V6.vdmpyhsat")
-        },
-        "Vw_vdmpy_VhRh_sat128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x64, &::U32]; &INPUTS },
-            output: &::I32x32,
-            definition: Named("llvm.hexagon.V6.vdmpyhsat.128B")
-        },
-        "Vw_vdmpy_WhRuh_sat64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x64, &::U32]; &INPUTS },
-            output: &::I32x16,
-            definition: Named("llvm.hexagon.V6.vdmpyhsuisat")
-        },
-        "Vw_vdmpy_WhRuh_sat128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x128, &::U32]; &INPUTS },
-            output: &::I32x32,
-            definition: Named("llvm.hexagon.V6.vdmpyhsuisat.128B")
-        },
-        "Vw_vdmpy_VhRuh_sat64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x32, &::U32]; &INPUTS },
-            output: &::I32x16,
-            definition: Named("llvm.hexagon.V6.vdmpyhsusat")
-        },
-        "Vw_vdmpy_VhRuh_sat128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x64, &::U32]; &INPUTS },
-            output: &::I32x32,
-            definition: Named("llvm.hexagon.V6.vdmpyhsusat.128B")
-        },
-        "Vw_vdmpy_VhVh_sat64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x32, &::I16x32]; &INPUTS },
-            output: &::I32x16,
-            definition: Named("llvm.hexagon.V6.vdmpyhvsat")
-        },
-        "Vw_vdmpy_VhVh_sat128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x64, &::I16x64]; &INPUTS },
-            output: &::I32x32,
-            definition: Named("llvm.hexagon.V6.vdmpyhvsat.128B")
-        },
-        "Vw_vdmpyacc_VwWwRh_sat64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I32x16, &::I32x32, &::U32]; &INPUTS },
-            output: &::I32x16,
-            definition: Named("llvm.hexagon.V6.vdmpyhisat_acc")
-        },
-        "Vw_vdmpyacc_VwWwRh_sat128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I32x32, &::I32x64, &::U32]; &INPUTS },
-            output: &::I32x32,
-            definition: Named("llvm.hexagon.V6.vdmpyhisat_acc.128B")
-        },
-        "Wuw_vdsad_WuhRuh64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x64, &::U32]; &INPUTS },
-            output: &::U32x32,
-            definition: Named("llvm.hexagon.V6.vdsaduh")
-        },
-        "Wuw_vdsad_WuhRuh128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x128, &::U32]; &INPUTS },
-            output: &::U32x64,
-            definition: Named("llvm.hexagon.V6.vdsaduh.128B")
-        },
-        "Wuw_vdsadacc_WuwWuhRuh64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x32, &::U16x64, &::U32]; &INPUTS },
-            output: &::U32x32,
-            definition: Named("llvm.hexagon.V6.vdsaduh.acc")
-        },
-        "Wuw_vdsadacc_WuwWuhRuh128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x64, &::U16x128, &::U32]; &INPUTS },
-            output: &::U32x64,
-            definition: Named("llvm.hexagon.V6.vdsaduh.acc.128B")
-        },
-        "Vw_vdmpyacc_VwVhRh_sat64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I32x16, &::I16x32, &::U32]; &INPUTS },
-            output: &::I32x16,
-            definition: Named("llvm.hexagon.V6.vdmpyhsat_acc")
-        },
-        "Vw_vdmpyacc_VwVhRh_sat128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I32x32, &::I16x64, &::U32]; &INPUTS },
-            output: &::I32x32,
-            definition: Named("llvm.hexagon.V6.vdmpyhsat_acc.128B")
-        },
-        "Vw_vdmpyacc_VwWhRuh_sat64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I32x16, &::I16x64, &::U32]; &INPUTS },
-            output: &::I32x16,
-            definition: Named("llvm.hexagon.V6.vdmpyhsuisat_acc")
-        },
-        "Vw_vdmpyacc_VwWhRuh_sat128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I32x32, &::I16x128, &::U32]; &INPUTS },
-            output: &::I32x32,
-            definition: Named("llvm.hexagon.V6.vdmpyhsuisat_acc.128B")
-        },
-        "Vw_vdmpyacc_VwVhRuh_sat64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I32x16, &::I16x32, &::U32]; &INPUTS },
-            output: &::I32x16,
-            definition: Named("llvm.hexagon.V6.vdmpyhsusat_acc")
-        },
-        "Vw_vdmpyacc_VwVhRuh_sat128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I32x32, &::I16x64, &::U32]; &INPUTS },
-            output: &::I32x32,
-            definition: Named("llvm.hexagon.V6.vdmpyhsusat_acc.128B")
-        },
-        "Vw_vdmpyacc_VwVhVh_sat64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I32x16, &::I16x32, &::I16x32]; &INPUTS },
-            output: &::I32x16,
-            definition: Named("llvm.hexagon.V6.vdmpyhvsat_acc")
-        },
-        "Vw_vdmpyacc_VwVhVh_sat128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I32x32, &::I16x64, &::I16x64]; &INPUTS },
-            output: &::I32x32,
-            definition: Named("llvm.hexagon.V6.vdmpyhvsat_acc.128B")
-        },
-        "Q_vcmp_eq_VbVb64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x64, &::I8x64]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.hexagon.V6.veqb")
-        },
-        "Q_vcmp_eq_VhVh64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x32, &::I16x32]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.hexagon.V6.veqh")
-        },
-        "Q_vcmp_eq_VwVw64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x16, &::I32x16]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.hexagon.V6.veqw")
-        },
-        "Q_vcmp_eq_VbVb128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x128, &::I8x128]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.hexagon.V6.veqb.128B")
-        },
-        "Q_vcmp_eq_VhVh128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x64, &::I16x64]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.hexagon.V6.veqh.128B")
-        },
-        "Q_vcmp_eq_VwVw128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x32, &::I32x32]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.hexagon.V6.veqw.128B")
-        },
-        "Q_vcmp_eqand_QVbVb64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x2, &::I8x64, &::I8x64]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.hexagon.V6.veqb.and")
-        },
-        "Q_vcmp_eqand_QVhVh64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x2, &::I16x32, &::I16x32]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.hexagon.V6.veqh.and")
-        },
-        "Q_vcmp_eqand_QVwVw64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x2, &::I32x16, &::I32x16]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.hexagon.V6.veqw.and")
-        },
-        "Q_vcmp_eqand_QVbVb128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x4, &::I8x128, &::I8x128]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.hexagon.V6.veqb.and.128B")
-        },
-        "Q_vcmp_eqand_QVhVh128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x4, &::I16x64, &::I16x64]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.hexagon.V6.veqh.and.128B")
-        },
-        "Q_vcmp_eqand_QVwVw128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x4, &::I32x32, &::I32x32]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.hexagon.V6.veqw.and.128B")
-        },
-        "Q_vcmp_eqor_QVbVb64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x2, &::I8x64, &::I8x64]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.hexagon.V6.veqb.or")
-        },
-        "Q_vcmp_eqor_QVhVh64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x2, &::I16x32, &::I16x32]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.hexagon.V6.veqh.or")
-        },
-        "Q_vcmp_eqor_QVwVw64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x2, &::I32x16, &::I32x16]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.hexagon.V6.veqw.or")
-        },
-        "Q_vcmp_eqor_QVbVb128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x4, &::I8x128, &::I8x128]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.hexagon.V6.veqb.or.128B")
-        },
-        "Q_vcmp_eqor_QVhVh128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x4, &::I16x64, &::I16x64]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.hexagon.V6.veqh.or.128B")
-        },
-        "Q_vcmp_eqor_QVwVw128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x4, &::I32x32, &::I32x32]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.hexagon.V6.veqw.or.128B")
-        },
-        "Q_vcmp_eqxacc_QVbVb64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x2, &::I8x64, &::I8x64]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.hexagon.V6.veqb.xor")
-        },
-        "Q_vcmp_eqxacc_QVhVh64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x2, &::I16x32, &::I16x32]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.hexagon.V6.veqh.xor")
-        },
-        "Q_vcmp_eqxacc_QVwVw64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x2, &::I32x16, &::I32x16]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.hexagon.V6.veqw.xor")
-        },
-        "Q_vcmp_eqxacc_QVbVb128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x4, &::I8x128, &::I8x128]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.hexagon.V6.veqb.xor.128B")
-        },
-        "Q_vcmp_eqxacc_QVhVh128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x4, &::I16x64, &::I16x64]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.hexagon.V6.veqh.xor.128B")
-        },
-        "Q_vcmp_eqxacc_QVwVw128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x4, &::I32x32, &::I32x32]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.hexagon.V6.veqw.xor.128B")
-        },
-        "Q_vcmp_gt_VbVb64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x64, &::I8x64]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.hexagon.V6.vgtb")
-        },
-        "Q_vcmp_gt_VhVh64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x32, &::I16x32]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.hexagon.V6.vgth")
-        },
-        "Q_vcmp_gt_VwVw64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x16, &::I32x16]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.hexagon.V6.vgtw")
-        },
-        "Q_vcmp_gt_VbVb128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x128, &::I8x128]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.hexagon.V6.vgtb.128B")
-        },
-        "Q_vcmp_gt_VhVh128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x64, &::I16x64]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.hexagon.V6.vgth.128B")
-        },
-        "Q_vcmp_gt_VwVw128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x32, &::I32x32]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.hexagon.V6.vgtw.128B")
-        },
-        "Q_vcmp_gt_VubVub64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x64, &::U8x64]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.hexagon.V6.vgtub")
-        },
-        "Q_vcmp_gt_VuhVuh64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x32, &::U16x32]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.hexagon.V6.vgtuh")
-        },
-        "Q_vcmp_gt_VubVub128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x128, &::U8x128]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.hexagon.V6.vgtub.128B")
-        },
-        "Q_vcmp_gt_VuhVuh128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x64, &::U16x64]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.hexagon.V6.vgtuh.128B")
-        },
-        "Q_vcmp_gtand_QVbVb64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x2, &::I8x64, &::I8x64]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.hexagon.V6.vgtb.and")
-        },
-        "Q_vcmp_gtand_QVhVh64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x2, &::I16x32, &::I16x32]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.hexagon.V6.vgth.and")
-        },
-        "Q_vcmp_gtand_QVwVw64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x2, &::I32x16, &::I32x16]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.hexagon.V6.vgtw.and")
-        },
-        "Q_vcmp_gtand_QVbVb128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x4, &::I8x128, &::I8x128]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.hexagon.V6.vgtb.and.128B")
-        },
-        "Q_vcmp_gtand_QVhVh128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x4, &::I16x64, &::I16x64]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.hexagon.V6.vgth.and.128B")
-        },
-        "Q_vcmp_gtand_QVwVw128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x4, &::I32x32, &::I32x32]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.hexagon.V6.vgtw.and.128B")
-        },
-        "Q_vcmp_gtand_QVubVub64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x2, &::U8x64, &::U8x64]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.hexagon.V6.vgtub.and")
-        },
-        "Q_vcmp_gtand_QVuhVuh64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x2, &::U16x32, &::U16x32]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.hexagon.V6.vgtuh.and")
-        },
-        "Q_vcmp_gtand_QVubVub128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x4, &::U8x128, &::U8x128]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.hexagon.V6.vgtub.and.128B")
-        },
-        "Q_vcmp_gtand_QVuhVuh128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x4, &::U16x64, &::U16x64]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.hexagon.V6.vgtuh.and.128B")
-        },
-        "Q_vcmp_gtor_QVbVb64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x2, &::I8x64, &::I8x64]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.hexagon.V6.vgtb.or")
-        },
-        "Q_vcmp_gtor_QVhVh64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x2, &::I16x32, &::I16x32]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.hexagon.V6.vgth.or")
-        },
-        "Q_vcmp_gtor_QVwVw64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x2, &::I32x16, &::I32x16]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.hexagon.V6.vgtw.or")
-        },
-        "Q_vcmp_gtor_QVbVb128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x4, &::I8x128, &::I8x128]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.hexagon.V6.vgtb.or.128B")
-        },
-        "Q_vcmp_gtor_QVhVh128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x4, &::I16x64, &::I16x64]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.hexagon.V6.vgth.or.128B")
-        },
-        "Q_vcmp_gtor_QVwVw128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x4, &::I32x32, &::I32x32]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.hexagon.V6.vgtw.or.128B")
-        },
-        "Q_vcmp_gtor_QVubVub64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x2, &::U8x64, &::U8x64]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.hexagon.V6.vgtub.or")
-        },
-        "Q_vcmp_gtor_QVuhVuh64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x2, &::U16x32, &::U16x32]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.hexagon.V6.vgtuh.or")
-        },
-        "Q_vcmp_gtor_QVubVub128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x4, &::U8x128, &::U8x128]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.hexagon.V6.vgtub.or.128B")
-        },
-        "Q_vcmp_gtor_QVuhVuh128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x4, &::U16x64, &::U16x64]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.hexagon.V6.vgtuh.or.128B")
-        },
-        "Q_vcmp_gtxacc_QVbVb64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x2, &::I8x64, &::I8x64]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.hexagon.V6.vgtb.xor")
-        },
-        "Q_vcmp_gtxacc_QVhVh64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x2, &::I16x32, &::I16x32]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.hexagon.V6.vgth.xor")
-        },
-        "Q_vcmp_gtxacc_QVwVw64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x2, &::I32x16, &::I32x16]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.hexagon.V6.vgtw.xor")
-        },
-        "Q_vcmp_gtxacc_QVbVb128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x4, &::I8x128, &::I8x128]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.hexagon.V6.vgtb.xor.128B")
-        },
-        "Q_vcmp_gtxacc_QVhVh128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x4, &::I16x64, &::I16x64]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.hexagon.V6.vgth.xor.128B")
-        },
-        "Q_vcmp_gtxacc_QVwVw128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x4, &::I32x32, &::I32x32]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.hexagon.V6.vgtw.xor.128B")
-        },
-        "Q_vcmp_gtxacc_QVubVub64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x2, &::U8x64, &::U8x64]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.hexagon.V6.vgtub.xor")
-        },
-        "Q_vcmp_gtxacc_QVuhVuh64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x2, &::U16x32, &::U16x32]; &INPUTS },
-            output: &::U32x2,
-            definition: Named("llvm.hexagon.V6.vgtuh.xor")
-        },
-        "Q_vcmp_gtxacc_QVubVub128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x4, &::U8x128, &::U8x128]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.hexagon.V6.vgtub.xor.128B")
-        },
-        "Q_vcmp_gtxacc_QVuhVuh128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x4, &::U16x64, &::U16x64]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.hexagon.V6.vgtuh.xor.128B")
-        },
-        "Vw_vinsert_VwR64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I32]; &INPUTS },
-            output: &::I32x16,
-            definition: Named("llvm.hexagon.V6.vinsertwr")
-        },
-        "Vw_vinsert_VwR128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I32]; &INPUTS },
-            output: &::I32x32,
-            definition: Named("llvm.hexagon.V6.vinsertwr.128B")
-        },
-        "Vuh_vlsr_VuhR64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x32, &::U32]; &INPUTS },
-            output: &::U16x32,
-            definition: Named("llvm.hexagon.V6.vlsrh")
-        },
-        "Vuw_vlsr_VuwR64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x16, &::U32]; &INPUTS },
-            output: &::U32x16,
-            definition: Named("llvm.hexagon.V6.vlsrw")
-        },
-        "Vuh_vlsr_VuhR128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x64, &::U32]; &INPUTS },
-            output: &::U16x64,
-            definition: Named("llvm.hexagon.V6.vlsrh.128B")
-        },
-        "Vuw_vlsr_VuwR128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x32, &::U32]; &INPUTS },
-            output: &::U32x32,
-            definition: Named("llvm.hexagon.V6.vlsrw.128B")
-        },
-        "Vh_vlsr_VhVh64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x32, &::I16x32]; &INPUTS },
-            output: &::I16x32,
-            definition: Named("llvm.hexagon.V6.vlsrhv")
-        },
-        "Vw_vlsr_VwVw64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x16, &::I32x16]; &INPUTS },
-            output: &::I32x16,
-            definition: Named("llvm.hexagon.V6.vlsrwv")
-        },
-        "Vh_vlsr_VhVh128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x64, &::I16x64]; &INPUTS },
-            output: &::I16x64,
-            definition: Named("llvm.hexagon.V6.vlsrhv.128B")
-        },
-        "Vw_vlsr_VwVw128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x32, &::I32x32]; &INPUTS },
-            output: &::I32x32,
-            definition: Named("llvm.hexagon.V6.vlsrwv.128B")
-        },
-        "Vb_vlut32_VbVbR64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I8x64, &::I8x64, &::U32]; &INPUTS },
-            output: &::I8x64,
-            definition: Named("llvm.hexagon.V6.vlutvvb")
-        },
-        "Vb_vlut32_VbVbR128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I8x128, &::I8x128, &::U32]; &INPUTS },
-            output: &::I8x128,
-            definition: Named("llvm.hexagon.V6.vlutvvb.128B")
-        },
-        "Wh_vlut16_VbVhR64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I8x64, &::I16x32, &::U32]; &INPUTS },
-            output: &::I16x64,
-            definition: Named("llvm.hexagon.V6.vlutvwh")
-        },
-        "Wh_vlut16_VbVhR128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I8x128, &::I16x64, &::U32]; &INPUTS },
-            output: &::I16x128,
-            definition: Named("llvm.hexagon.V6.vlutvwh.128B")
-        },
-        "Vb_vlut32or_VbVbVbR64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 4] = [&::I8x64, &::I8x64, &::I8x64, &::U32]; &INPUTS },
-            output: &::I8x64,
-            definition: Named("llvm.hexagon.V6.vlutvvb.oracc")
-        },
-        "Vb_vlut32or_VbVbVbR128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 4] = [&::I8x128, &::I8x128, &::I8x128, &::U32]; &INPUTS },
-            output: &::I8x128,
-            definition: Named("llvm.hexagon.V6.vlutvvb.oracc.128B")
-        },
-        "Wh_vlut16or_WhVbVhR64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 4] = [&::I16x64, &::I8x64, &::I16x32, &::U32]; &INPUTS },
-            output: &::I16x64,
-            definition: Named("llvm.hexagon.V6.vlutvwh.oracc")
-        },
-        "Wh_vlut16or_WhVbVhR128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 4] = [&::I16x128, &::I8x128, &::I16x64, &::U32]; &INPUTS },
-            output: &::I16x128,
-            definition: Named("llvm.hexagon.V6.vlutvwh.oracc.128B")
-        },
-        "Vh_vmax_VhVh64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x32, &::I16x32]; &INPUTS },
-            output: &::I16x32,
-            definition: Named("llvm.hexagon.V6.vmaxh")
-        },
-        "Vw_vmax_VwVw64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x16, &::I32x16]; &INPUTS },
-            output: &::I32x16,
-            definition: Named("llvm.hexagon.V6.vmaxw")
-        },
-        "Vh_vmax_VhVh128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x64, &::I16x64]; &INPUTS },
-            output: &::I16x64,
-            definition: Named("llvm.hexagon.V6.vmaxh.128B")
-        },
-        "Vw_vmax_VwVw128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x32, &::I32x32]; &INPUTS },
-            output: &::I32x32,
-            definition: Named("llvm.hexagon.V6.vmaxw.128B")
-        },
-        "Vub_vmax_VubVub64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x64, &::U8x64]; &INPUTS },
-            output: &::U8x64,
-            definition: Named("llvm.hexagon.V6.vmaxub")
-        },
-        "Vuh_vmax_VuhVuh64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x32, &::U16x32]; &INPUTS },
-            output: &::U16x32,
-            definition: Named("llvm.hexagon.V6.vmaxuh")
-        },
-        "Vub_vmax_VubVub128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x128, &::U8x128]; &INPUTS },
-            output: &::U8x128,
-            definition: Named("llvm.hexagon.V6.vmaxub.128B")
-        },
-        "Vuh_vmax_VuhVuh128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x64, &::U16x64]; &INPUTS },
-            output: &::U16x64,
-            definition: Named("llvm.hexagon.V6.vmaxuh.128B")
-        },
-        "Vh_vmin_VhVh64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x32, &::I16x32]; &INPUTS },
-            output: &::I16x32,
-            definition: Named("llvm.hexagon.V6.vminh")
-        },
-        "Vw_vmin_VwVw64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x16, &::I32x16]; &INPUTS },
-            output: &::I32x16,
-            definition: Named("llvm.hexagon.V6.vminw")
-        },
-        "Vh_vmin_VhVh128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x64, &::I16x64]; &INPUTS },
-            output: &::I16x64,
-            definition: Named("llvm.hexagon.V6.vminh.128B")
-        },
-        "Vw_vmin_VwVw128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x32, &::I32x32]; &INPUTS },
-            output: &::I32x32,
-            definition: Named("llvm.hexagon.V6.vminw.128B")
-        },
-        "Vub_vmin_VubVub64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x64, &::U8x64]; &INPUTS },
-            output: &::U8x64,
-            definition: Named("llvm.hexagon.V6.vminub")
-        },
-        "Vuh_vmin_VuhVuh64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x32, &::U16x32]; &INPUTS },
-            output: &::U16x32,
-            definition: Named("llvm.hexagon.V6.vminuh")
-        },
-        "Vub_vmin_VubVub128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x128, &::U8x128]; &INPUTS },
-            output: &::U8x128,
-            definition: Named("llvm.hexagon.V6.vminub.128B")
-        },
-        "Vuh_vmin_VuhVuh128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x64, &::U16x64]; &INPUTS },
-            output: &::U16x64,
-            definition: Named("llvm.hexagon.V6.vminuh.128B")
-        },
-        "Wh_vmpa_WubRb64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x128, &::U32]; &INPUTS },
-            output: &::I16x64,
-            definition: Named("llvm.hexagon.V6.vmpabus")
-        },
-        "Wh_vmpa_WubRb128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x256, &::U32]; &INPUTS },
-            output: &::I16x128,
-            definition: Named("llvm.hexagon.V6.vmpabus.128B")
-        },
-        "Wh_vmpaacc_WhWubRb64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I16x64, &::U8x128, &::U32]; &INPUTS },
-            output: &::I16x64,
-            definition: Named("llvm.hexagon.V6.vmpabus.acc")
-        },
-        "Wh_vmpaacc_WhWubRb128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I16x128, &::U8x256, &::U32]; &INPUTS },
-            output: &::I16x128,
-            definition: Named("llvm.hexagon.V6.vmpabus.acc.128B")
-        },
-        "Wh_vmpa_WubWb64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x128, &::I8x128]; &INPUTS },
-            output: &::I16x64,
-            definition: Named("llvm.hexagon.V6.vmpabusv")
-        },
-        "Wh_vmpa_WubWub64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x128, &::U8x128]; &INPUTS },
-            output: &::I16x64,
-            definition: Named("llvm.hexagon.V6.vmpabuuv")
-        },
-        "Wh_vmpa_WubWb128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x256, &::I8x256]; &INPUTS },
-            output: &::I16x128,
-            definition: Named("llvm.hexagon.V6.vmpabusv.128B")
-        },
-        "Wh_vmpa_WubWub128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x256, &::U8x256]; &INPUTS },
-            output: &::I16x128,
-            definition: Named("llvm.hexagon.V6.vmpabuuv.128B")
-        },
-        "Ww_vmpa_WhRb64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x64, &::U32]; &INPUTS },
-            output: &::I32x32,
-            definition: Named("llvm.hexagon.V6.vmpahb")
-        },
-        "Ww_vmpa_WhRb128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x128, &::U32]; &INPUTS },
-            output: &::I32x64,
-            definition: Named("llvm.hexagon.V6.vmpahb.128B")
-        },
-        "Ww_vmpaacc_WwWhRb64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I32x32, &::I16x64, &::U32]; &INPUTS },
-            output: &::I32x32,
-            definition: Named("llvm.hexagon.V6.vmpahb.acc")
-        },
-        "Ww_vmpaacc_WwWhRb128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I32x64, &::I16x128, &::U32]; &INPUTS },
-            output: &::I32x64,
-            definition: Named("llvm.hexagon.V6.vmpahb.acc.128B")
-        },
-        "Wh_vmpy_VbVub64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x64, &::U8x64]; &INPUTS },
-            output: &::I16x64,
-            definition: Named("llvm.hexagon.V6.vmpybus")
-        },
-        "Ww_vmpy_VhVuh64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x32, &::U16x32]; &INPUTS },
-            output: &::I32x32,
-            definition: Named("llvm.hexagon.V6.vmpyhus")
-        },
-        "Wh_vmpy_VbVub128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x128, &::U8x128]; &INPUTS },
-            output: &::I16x128,
-            definition: Named("llvm.hexagon.V6.vmpybus.128B")
-        },
-        "Ww_vmpy_VhVuh128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x64, &::U16x64]; &INPUTS },
-            output: &::I32x64,
-            definition: Named("llvm.hexagon.V6.vmpyhus.128B")
-        },
-        "Wh_vmpyacc_WhVbVub64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I16x64, &::I8x64, &::U8x64]; &INPUTS },
-            output: &::I16x64,
-            definition: Named("llvm.hexagon.V6.vmpybus.acc")
-        },
-        "Ww_vmpyacc_WwVhVuh64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I32x32, &::I16x32, &::U16x32]; &INPUTS },
-            output: &::I32x32,
-            definition: Named("llvm.hexagon.V6.vmpyhus.acc")
-        },
-        "Wh_vmpyacc_WhVbVub128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I16x128, &::I8x128, &::U8x128]; &INPUTS },
-            output: &::I16x128,
-            definition: Named("llvm.hexagon.V6.vmpybus.acc.128B")
-        },
-        "Ww_vmpyacc_WwVhVuh128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I32x64, &::I16x64, &::U16x64]; &INPUTS },
-            output: &::I32x64,
-            definition: Named("llvm.hexagon.V6.vmpyhus.acc.128B")
-        },
-        "Wh_vmpy_VubVb64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x64, &::I8x64]; &INPUTS },
-            output: &::I16x64,
-            definition: Named("llvm.hexagon.V6.vmpybusv")
-        },
-        "Wh_vmpy_VubVb128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x128, &::I8x128]; &INPUTS },
-            output: &::I16x128,
-            definition: Named("llvm.hexagon.V6.vmpybusv.128B")
-        },
-        "Wh_vmpyacc_WhVubVb64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I16x64, &::U8x64, &::I8x64]; &INPUTS },
-            output: &::I16x64,
-            definition: Named("llvm.hexagon.V6.vmpybusv.acc")
-        },
-        "Wh_vmpyacc_WhVubVb128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I16x128, &::U8x128, &::I8x128]; &INPUTS },
-            output: &::I16x128,
-            definition: Named("llvm.hexagon.V6.vmpybusv.acc.128B")
-        },
-        "Wh_vmpy_VbVb64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x64, &::I8x64]; &INPUTS },
-            output: &::I16x64,
-            definition: Named("llvm.hexagon.V6.vmpybv")
-        },
-        "Wuh_vmpy_VubVub64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x64, &::U8x64]; &INPUTS },
-            output: &::U16x64,
-            definition: Named("llvm.hexagon.V6.vmpyubv")
-        },
-        "Ww_vmpy_VhVh64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x32, &::I16x32]; &INPUTS },
-            output: &::I32x32,
-            definition: Named("llvm.hexagon.V6.vmpyhv")
-        },
-        "Wuw_vmpy_VuhVuh64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x32, &::U16x32]; &INPUTS },
-            output: &::U32x32,
-            definition: Named("llvm.hexagon.V6.vmpyuhv")
-        },
-        "Wh_vmpy_VbVb128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x128, &::I8x128]; &INPUTS },
-            output: &::I16x128,
-            definition: Named("llvm.hexagon.V6.vmpybv.128B")
-        },
-        "Wuh_vmpy_VubVub128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x128, &::U8x128]; &INPUTS },
-            output: &::U16x128,
-            definition: Named("llvm.hexagon.V6.vmpyubv.128B")
-        },
-        "Ww_vmpy_VhVh128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x64, &::I16x64]; &INPUTS },
-            output: &::I32x64,
-            definition: Named("llvm.hexagon.V6.vmpyhv.128B")
-        },
-        "Wuw_vmpy_VuhVuh128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x64, &::U16x64]; &INPUTS },
-            output: &::U32x64,
-            definition: Named("llvm.hexagon.V6.vmpyuhv.128B")
-        },
-        "Wh_vmpyacc_WhVbVb64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I16x64, &::I8x64, &::I8x64]; &INPUTS },
-            output: &::I16x64,
-            definition: Named("llvm.hexagon.V6.vmpybv.acc")
-        },
-        "Wuh_vmpyacc_WuhVubVub64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U16x64, &::U8x64, &::U8x64]; &INPUTS },
-            output: &::U16x64,
-            definition: Named("llvm.hexagon.V6.vmpyubv.acc")
-        },
-        "Ww_vmpyacc_WwVhVh64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I32x32, &::I16x32, &::I16x32]; &INPUTS },
-            output: &::I32x32,
-            definition: Named("llvm.hexagon.V6.vmpyhv.acc")
-        },
-        "Wuw_vmpyacc_WuwVuhVuh64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x32, &::U16x32, &::U16x32]; &INPUTS },
-            output: &::U32x32,
-            definition: Named("llvm.hexagon.V6.vmpyuhv.acc")
-        },
-        "Wh_vmpyacc_WhVbVb128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I16x128, &::I8x128, &::I8x128]; &INPUTS },
-            output: &::I16x128,
-            definition: Named("llvm.hexagon.V6.vmpybv.acc.128B")
-        },
-        "Wuh_vmpyacc_WuhVubVub128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U16x128, &::U8x128, &::U8x128]; &INPUTS },
-            output: &::U16x128,
-            definition: Named("llvm.hexagon.V6.vmpyubv.acc.128B")
-        },
-        "Ww_vmpyacc_WwVhVh128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I32x64, &::I16x64, &::I16x64]; &INPUTS },
-            output: &::I32x64,
-            definition: Named("llvm.hexagon.V6.vmpyhv.acc.128B")
-        },
-        "Wuw_vmpyacc_WuwVuhVuh128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x64, &::U16x64, &::U16x64]; &INPUTS },
-            output: &::U32x64,
-            definition: Named("llvm.hexagon.V6.vmpyuhv.acc.128B")
-        },
-        "Vw_vmpye_VwVuh64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x16, &::U16x32]; &INPUTS },
-            output: &::I32x16,
-            definition: Named("llvm.hexagon.V6.vmpyewuh")
-        },
-        "Vw_vmpye_VwVuh128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x32, &::U16x64]; &INPUTS },
-            output: &::I32x32,
-            definition: Named("llvm.hexagon.V6.vmpyewuh.128B")
-        },
-        "Ww_vmpy_VhRh64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x32, &::U32]; &INPUTS },
-            output: &::I32x32,
-            definition: Named("llvm.hexagon.V6.vmpyh")
-        },
-        "Wuw_vmpy_VuhRuh64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x32, &::U32]; &INPUTS },
-            output: &::U32x32,
-            definition: Named("llvm.hexagon.V6.vmpyuh")
-        },
-        "Ww_vmpy_VhRh128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x64, &::U32]; &INPUTS },
-            output: &::I32x64,
-            definition: Named("llvm.hexagon.V6.vmpyh.128B")
-        },
-        "Wuw_vmpy_VuhRuh128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x64, &::U32]; &INPUTS },
-            output: &::U32x64,
-            definition: Named("llvm.hexagon.V6.vmpyuh.128B")
-        },
-        "Ww_vmpyacc_WwVhRh_sat64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I32x32, &::I16x32, &::U32]; &INPUTS },
-            output: &::I32x32,
-            definition: Named("llvm.hexagon.V6.vmpyhsat.acc")
-        },
-        "Ww_vmpyacc_WwVhRh_sat128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I32x64, &::I16x64, &::U32]; &INPUTS },
-            output: &::I32x64,
-            definition: Named("llvm.hexagon.V6.vmpyhsat.acc.128B")
-        },
-        "Vw_vmpy_VhRh_s1_rnd_sat64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x32, &::U32]; &INPUTS },
-            output: &::I32x16,
-            definition: Named("llvm.hexagon.V6.vmpyhsrs")
-        },
-        "Vw_vmpy_VhRh_s1_rnd_sat128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x64, &::U32]; &INPUTS },
-            output: &::I32x32,
-            definition: Named("llvm.hexagon.V6.vmpyhsrs.128B")
-        },
-        "Vw_vmpy_VhRh_s1_sat64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x32, &::U32]; &INPUTS },
-            output: &::I32x16,
-            definition: Named("llvm.hexagon.V6.vmpyhss")
-        },
-        "Vw_vmpy_VhRh_s1_sat128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x64, &::U32]; &INPUTS },
-            output: &::I32x32,
-            definition: Named("llvm.hexagon.V6.vmpyhss.128B")
-        },
-        "Vh_vmpy_VhVh_s1_rnd_sat64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x32, &::I16x32]; &INPUTS },
-            output: &::I16x32,
-            definition: Named("llvm.hexagon.V6.vmpyhvsrs")
-        },
-        "Vh_vmpy_VhVh_s1_rnd_sat128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x64, &::I16x64]; &INPUTS },
-            output: &::I16x64,
-            definition: Named("llvm.hexagon.V6.vmpyhvsrs.128B")
-        },
-        "Vw_vmpyieo_VhVh64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x32, &::I16x32]; &INPUTS },
-            output: &::I32x16,
-            definition: Named("llvm.hexagon.V6.vmpyieoh")
-        },
-        "Vw_vmpyieo_VhVh128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x64, &::I16x64]; &INPUTS },
-            output: &::I32x32,
-            definition: Named("llvm.hexagon.V6.vmpyieoh.128B")
-        },
-        "Vw_vmpyieacc_VwVwVh64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I32x16, &::I32x16, &::I16x32]; &INPUTS },
-            output: &::I32x16,
-            definition: Named("llvm.hexagon.V6.vmpyiewh.acc")
-        },
-        "Vw_vmpyieacc_VwVwVuh64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I32x16, &::I32x16, &::U16x32]; &INPUTS },
-            output: &::I32x16,
-            definition: Named("llvm.hexagon.V6.vmpyiewuh.acc")
-        },
-        "Vw_vmpyieacc_VwVwVh128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I32x32, &::I32x32, &::I16x64]; &INPUTS },
-            output: &::I32x32,
-            definition: Named("llvm.hexagon.V6.vmpyiewh.acc.128B")
-        },
-        "Vw_vmpyieacc_VwVwVuh128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I32x32, &::I32x32, &::U16x64]; &INPUTS },
-            output: &::I32x32,
-            definition: Named("llvm.hexagon.V6.vmpyiewuh.acc.128B")
-        },
-        "Vw_vmpyie_VwVuh64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x16, &::U16x32]; &INPUTS },
-            output: &::I32x16,
-            definition: Named("llvm.hexagon.V6.vmpyiewuh")
-        },
-        "Vw_vmpyie_VwVuh128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x32, &::U16x64]; &INPUTS },
-            output: &::I32x32,
-            definition: Named("llvm.hexagon.V6.vmpyiewuh.128B")
-        },
-        "Vh_vmpyi_VhVh64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x32, &::I16x32]; &INPUTS },
-            output: &::I16x32,
-            definition: Named("llvm.hexagon.V6.vmpyih")
-        },
-        "Vh_vmpyi_VhVh128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x64, &::I16x64]; &INPUTS },
-            output: &::I16x64,
-            definition: Named("llvm.hexagon.V6.vmpyih.128B")
-        },
-        "Vh_vmpyiacc_VhVhVh64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I16x32, &::I16x32, &::I16x32]; &INPUTS },
-            output: &::I16x32,
-            definition: Named("llvm.hexagon.V6.vmpyih.acc")
-        },
-        "Vh_vmpyiacc_VhVhVh128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I16x64, &::I16x64, &::I16x64]; &INPUTS },
-            output: &::I16x64,
-            definition: Named("llvm.hexagon.V6.vmpyih.acc.128B")
-        },
-        "Vh_vmpyi_VhRb64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x32, &::U32]; &INPUTS },
-            output: &::I16x32,
-            definition: Named("llvm.hexagon.V6.vmpyihb")
-        },
-        "Vw_vmpyi_VwRb64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x16, &::U32]; &INPUTS },
-            output: &::I32x16,
-            definition: Named("llvm.hexagon.V6.vmpyiwb")
-        },
-        "Vh_vmpyi_VhRb128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x64, &::U32]; &INPUTS },
-            output: &::I16x64,
-            definition: Named("llvm.hexagon.V6.vmpyihb.128B")
-        },
-        "Vw_vmpyi_VwRb128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x32, &::U32]; &INPUTS },
-            output: &::I32x32,
-            definition: Named("llvm.hexagon.V6.vmpyiwb.128B")
-        },
-        "Vh_vmpyiacc_VhVhRb64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I16x32, &::I16x32, &::U32]; &INPUTS },
-            output: &::I16x32,
-            definition: Named("llvm.hexagon.V6.vmpyihb.acc")
-        },
-        "Vw_vmpyiacc_VwVwRb64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I32x16, &::I32x16, &::U32]; &INPUTS },
-            output: &::I32x16,
-            definition: Named("llvm.hexagon.V6.vmpyiwb.acc")
-        },
-        "Vh_vmpyiacc_VhVhRb128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I16x64, &::I16x64, &::U32]; &INPUTS },
-            output: &::I16x64,
-            definition: Named("llvm.hexagon.V6.vmpyihb.acc.128B")
-        },
-        "Vw_vmpyiacc_VwVwRb128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I32x32, &::I32x32, &::U32]; &INPUTS },
-            output: &::I32x32,
-            definition: Named("llvm.hexagon.V6.vmpyiwb.acc.128B")
-        },
-        "Vw_vmpyi_VwRh64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x16, &::U32]; &INPUTS },
-            output: &::I32x16,
-            definition: Named("llvm.hexagon.V6.vmpyiwh")
-        },
-        "Vw_vmpyi_VwRh128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x32, &::U32]; &INPUTS },
-            output: &::I32x32,
-            definition: Named("llvm.hexagon.V6.vmpyiwh.128B")
-        },
-        "Vw_vmpyiacc_VwVwRh64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I32x16, &::I32x16, &::U32]; &INPUTS },
-            output: &::I32x16,
-            definition: Named("llvm.hexagon.V6.vmpyiwh.acc")
-        },
-        "Vw_vmpyiacc_VwVwRh128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I32x32, &::I32x32, &::U32]; &INPUTS },
-            output: &::I32x32,
-            definition: Named("llvm.hexagon.V6.vmpyiwh.acc.128B")
-        },
-        "Vw_vmpyi_VwRub64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x16, &::U32]; &INPUTS },
-            output: &::I32x16,
-            definition: Named("llvm.hexagon.V6.vmpyiwub")
-        },
-        "Vw_vmpyi_VwRub128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x32, &::U32]; &INPUTS },
-            output: &::I32x32,
-            definition: Named("llvm.hexagon.V6.vmpyiwub.128B")
-        },
-        "Vw_vmpyiacc_VwVwRub64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I32x16, &::I32x16, &::U32]; &INPUTS },
-            output: &::I32x16,
-            definition: Named("llvm.hexagon.V6.vmpyiwub.acc")
-        },
-        "Vw_vmpyiacc_VwVwRub128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I32x32, &::I32x32, &::U32]; &INPUTS },
-            output: &::I32x32,
-            definition: Named("llvm.hexagon.V6.vmpyiwub.acc.128B")
-        },
-        "Vw_vmpyo_VwVh_s1_sat64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x16, &::I16x32]; &INPUTS },
-            output: &::I32x16,
-            definition: Named("llvm.hexagon.V6.vmpyowh")
-        },
-        "Vw_vmpyo_VwVh_s1_sat128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x32, &::I16x64]; &INPUTS },
-            output: &::I32x32,
-            definition: Named("llvm.hexagon.V6.vmpyowh.128B")
-        },
-        "Vw_vmpyo_VwVh_s1_rnd_sat64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x16, &::I16x32]; &INPUTS },
-            output: &::I32x16,
-            definition: Named("llvm.hexagon.V6.vmpyowh.rnd")
-        },
-        "Vw_vmpyo_VwVh_s1_rnd_sat128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x32, &::I16x64]; &INPUTS },
-            output: &::I32x32,
-            definition: Named("llvm.hexagon.V6.vmpyowh.rnd.128B")
-        },
-        "Vw_vmpyo_VwVh_s1_rnd_sat_shift64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x16, &::I16x32]; &INPUTS },
-            output: &::I32x16,
-            definition: Named("llvm.hexagon.V6.vmpyowh.rnd.sacc")
-        },
-        "Vw_vmpyo_VwVh_s1_rnd_sat_shift128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x32, &::I16x64]; &INPUTS },
-            output: &::I32x32,
-            definition: Named("llvm.hexagon.V6.vmpyowh.rnd.sacc.128B")
-        },
-        "Vw_vmpyo_VwVh_s1_sat_shift64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x16, &::I16x32]; &INPUTS },
-            output: &::I32x16,
-            definition: Named("llvm.hexagon.V6.vmpyowh.sacc")
-        },
-        "Vw_vmpyo_VwVh_s1_sat_shift128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x32, &::I16x64]; &INPUTS },
-            output: &::I32x32,
-            definition: Named("llvm.hexagon.V6.vmpyowh.sacc.128B")
-        },
-        "Vw_vmpyio_VwVh64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x16, &::I16x32]; &INPUTS },
-            output: &::I32x16,
-            definition: Named("llvm.hexagon.V6.vmpyiowh")
-        },
-        "Vw_vmpyio_VwVh128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x32, &::I16x64]; &INPUTS },
-            output: &::I32x32,
-            definition: Named("llvm.hexagon.V6.vmpyiowh.128B")
-        },
-        "Wuh_vmpy_VubRub64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x64, &::U32]; &INPUTS },
-            output: &::U16x64,
-            definition: Named("llvm.hexagon.V6.vmpyub")
-        },
-        "Wuh_vmpy_VubRub128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x128, &::U32]; &INPUTS },
-            output: &::U16x128,
-            definition: Named("llvm.hexagon.V6.vmpyub.128B")
-        },
-        "Wuh_vmpyacc_WuhVubRub64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U16x64, &::U8x64, &::U32]; &INPUTS },
-            output: &::U16x64,
-            definition: Named("llvm.hexagon.V6.vmpyub.acc")
-        },
-        "Wuw_vmpyacc_WuwVuhRuh64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x32, &::U16x32, &::U32]; &INPUTS },
-            output: &::U32x32,
-            definition: Named("llvm.hexagon.V6.vmpyuh.acc")
-        },
-        "Wuh_vmpyacc_WuhVubRub128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U16x128, &::U8x128, &::U32]; &INPUTS },
-            output: &::U16x128,
-            definition: Named("llvm.hexagon.V6.vmpyub.acc.128B")
-        },
-        "Wuw_vmpyacc_WuwVuhRuh128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x64, &::U16x64, &::U32]; &INPUTS },
-            output: &::U32x64,
-            definition: Named("llvm.hexagon.V6.vmpyuh.acc.128B")
-        },
-        "Vuw_vmux_QVV64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x2, &::U32x16, &::U32x16]; &INPUTS },
-            output: &::U32x16,
-            definition: Named("llvm.hexagon.V6.vmux")
-        },
-        "Vuw_vmux_QVV128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x4, &::U32x32, &::U32x32]; &INPUTS },
-            output: &::U32x32,
-            definition: Named("llvm.hexagon.V6.vmux.128B")
-        },
-        "Vh_vnavg_VhVh64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x32, &::I16x32]; &INPUTS },
-            output: &::I16x32,
-            definition: Named("llvm.hexagon.V6.vnavgh")
-        },
-        "Vuh_vnavg_VuhVuh64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x32, &::U16x32]; &INPUTS },
-            output: &::U16x32,
-            definition: Named("llvm.hexagon.V6.vnavguh")
-        },
-        "Vw_vnavg_VwVw64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x16, &::I32x16]; &INPUTS },
-            output: &::I32x16,
-            definition: Named("llvm.hexagon.V6.vnavgw")
-        },
-        "Vuw_vnavg_VuwVuw64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x16, &::U32x16]; &INPUTS },
-            output: &::U32x16,
-            definition: Named("llvm.hexagon.V6.vnavguw")
-        },
-        "Vh_vnavg_VhVh128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x64, &::I16x64]; &INPUTS },
-            output: &::I16x64,
-            definition: Named("llvm.hexagon.V6.vnavgh.128B")
-        },
-        "Vuh_vnavg_VuhVuh128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x64, &::U16x64]; &INPUTS },
-            output: &::U16x64,
-            definition: Named("llvm.hexagon.V6.vnavguh.128B")
-        },
-        "Vw_vnavg_VwVw128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x32, &::I32x32]; &INPUTS },
-            output: &::I32x32,
-            definition: Named("llvm.hexagon.V6.vnavgw.128B")
-        },
-        "Vuw_vnavg_VuwVuw128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x32, &::U32x32]; &INPUTS },
-            output: &::U32x32,
-            definition: Named("llvm.hexagon.V6.vnavguw.128B")
-        },
-        "Vub_vnavg_VubVub64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x64, &::U8x64]; &INPUTS },
-            output: &::U8x64,
-            definition: Named("llvm.hexagon.V6.vnavgub")
-        },
-        "Vub_vnavg_VubVub128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x128, &::U8x128]; &INPUTS },
-            output: &::U8x128,
-            definition: Named("llvm.hexagon.V6.vnavgub.128B")
-        },
-        "Vh_vnormamt_Vh64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I16x32]; &INPUTS },
-            output: &::I16x32,
-            definition: Named("llvm.hexagon.V6.vnormamth")
-        },
-        "Vw_vnormamt_Vw64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I32x16]; &INPUTS },
-            output: &::I32x16,
-            definition: Named("llvm.hexagon.V6.vnormamtw")
-        },
-        "Vh_vnormamt_Vh128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I16x64]; &INPUTS },
-            output: &::I16x64,
-            definition: Named("llvm.hexagon.V6.vnormamth.128B")
-        },
-        "Vw_vnormamt_Vw128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I32x32]; &INPUTS },
-            output: &::I32x32,
-            definition: Named("llvm.hexagon.V6.vnormamtw.128B")
-        },
-        "V_vnot_VV64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U16x32]; &INPUTS },
-            output: &::U16x32,
-            definition: Named("llvm.hexagon.V6.vnot")
-        },
-        "V_vnot_VV128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U16x64]; &INPUTS },
-            output: &::U16x64,
-            definition: Named("llvm.hexagon.V6.vnot.128B")
-        },
-        "V_vor_VV64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x32, &::U16x32]; &INPUTS },
-            output: &::U16x32,
-            definition: Named("llvm.hexagon.V6.vor")
-        },
-        "V_vor_VV128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x64, &::U16x64]; &INPUTS },
-            output: &::U16x64,
-            definition: Named("llvm.hexagon.V6.vor.128B")
-        },
-        "Vb_vpacke_VhVh64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x32, &::I16x32]; &INPUTS },
-            output: &::I8x64,
-            definition: Named("llvm.hexagon.V6.vpackhe")
-        },
-        "Vh_vpacke_VwVw64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x16, &::I32x16]; &INPUTS },
-            output: &::I16x32,
-            definition: Named("llvm.hexagon.V6.vpackwe")
-        },
-        "Vb_vpacke_VhVh128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x64, &::I16x64]; &INPUTS },
-            output: &::I8x128,
-            definition: Named("llvm.hexagon.V6.vpackhe.128B")
-        },
-        "Vh_vpacke_VwVw128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x32, &::I32x32]; &INPUTS },
-            output: &::I16x64,
-            definition: Named("llvm.hexagon.V6.vpackwe.128B")
-        },
-        "Vb_vpacko_VhVh64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x32, &::I16x32]; &INPUTS },
-            output: &::I8x64,
-            definition: Named("llvm.hexagon.V6.vpackho")
-        },
-        "Vh_vpacko_VwVw64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x16, &::I32x16]; &INPUTS },
-            output: &::I16x32,
-            definition: Named("llvm.hexagon.V6.vpackwo")
-        },
-        "Vb_vpacko_VhVh128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x64, &::I16x64]; &INPUTS },
-            output: &::I8x128,
-            definition: Named("llvm.hexagon.V6.vpackho.128B")
-        },
-        "Vh_vpacko_VwVw128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x32, &::I32x32]; &INPUTS },
-            output: &::I16x64,
-            definition: Named("llvm.hexagon.V6.vpackwo.128B")
-        },
-        "Vb_vpack_VhVh_sat64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x32, &::I16x32]; &INPUTS },
-            output: &::I8x64,
-            definition: Named("llvm.hexagon.V6.vpackhb.sat")
-        },
-        "Vub_vpack_VhVh_sat64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x32, &::I16x32]; &INPUTS },
-            output: &::U8x64,
-            definition: Named("llvm.hexagon.V6.vpackhub.sat")
-        },
-        "Vh_vpack_VwVw_sat64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x16, &::I32x16]; &INPUTS },
-            output: &::I16x32,
-            definition: Named("llvm.hexagon.V6.vpackwh.sat")
-        },
-        "Vuh_vpack_VwVw_sat64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x16, &::I32x16]; &INPUTS },
-            output: &::U16x32,
-            definition: Named("llvm.hexagon.V6.vpackwuh.sat")
-        },
-        "Vb_vpack_VhVh_sat128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x64, &::I16x64]; &INPUTS },
-            output: &::I8x128,
-            definition: Named("llvm.hexagon.V6.vpackhb.sat.128B")
-        },
-        "Vub_vpack_VhVh_sat128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x64, &::I16x64]; &INPUTS },
-            output: &::U8x128,
-            definition: Named("llvm.hexagon.V6.vpackhub.sat.128B")
-        },
-        "Vh_vpack_VwVw_sat128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x32, &::I32x32]; &INPUTS },
-            output: &::I16x64,
-            definition: Named("llvm.hexagon.V6.vpackwh.sat.128B")
-        },
-        "Vuh_vpack_VwVw_sat128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x32, &::I32x32]; &INPUTS },
-            output: &::U16x64,
-            definition: Named("llvm.hexagon.V6.vpackwuh.sat.128B")
-        },
-        "Vh_vpopcount_Vh64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I16x32]; &INPUTS },
-            output: &::I16x32,
-            definition: Named("llvm.hexagon.V6.vpopcounth")
-        },
-        "Vh_vpopcount_Vh128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I16x64]; &INPUTS },
-            output: &::I16x64,
-            definition: Named("llvm.hexagon.V6.vpopcounth.128B")
-        },
-        "V_vrdelta_VV64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x64, &::U8x64]; &INPUTS },
-            output: &::U8x64,
-            definition: Named("llvm.hexagon.V6.vrdelta")
-        },
-        "V_vrdelta_VV128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x128, &::U8x128]; &INPUTS },
-            output: &::U8x128,
-            definition: Named("llvm.hexagon.V6.vrdelta.128B")
-        },
-        "Vw_vrmpy_VubRb64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x64, &::U32]; &INPUTS },
-            output: &::I32x16,
-            definition: Named("llvm.hexagon.V6.vrmpybus")
-        },
-        "Vw_vrmpy_VubRb128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x128, &::U32]; &INPUTS },
-            output: &::I32x32,
-            definition: Named("llvm.hexagon.V6.vrmpybus.128B")
-        },
-        "Vw_vrmpyacc_VwVubRb64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I32x16, &::U8x64, &::U32]; &INPUTS },
-            output: &::I32x16,
-            definition: Named("llvm.hexagon.V6.vrmpybus.acc")
-        },
-        "Vw_vrmpyacc_VwVubRb128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I32x32, &::U8x128, &::U32]; &INPUTS },
-            output: &::I32x32,
-            definition: Named("llvm.hexagon.V6.vrmpybus.acc.128B")
-        },
-        "Ww_vrmpy_WubRbI64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x128, &::U32]; &INPUTS },
-            output: &::I32x32,
-            definition: Named("llvm.hexagon.V6.vrmpybusi")
-        },
-        "Ww_vrmpy_WubRbI128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x256, &::U32]; &INPUTS },
-            output: &::I32x64,
-            definition: Named("llvm.hexagon.V6.vrmpybusi.128B")
-        },
-        "Ww_vrmpyacc_WwWubRbI64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I32x32, &::U8x128, &::U32]; &INPUTS },
-            output: &::I32x32,
-            definition: Named("llvm.hexagon.V6.vrmpybusi.acc")
-        },
-        "Ww_vrmpyacc_WwWubRbI128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I32x64, &::U8x256, &::U32]; &INPUTS },
-            output: &::I32x64,
-            definition: Named("llvm.hexagon.V6.vrmpybusi.acc.128B")
-        },
-        "Vw_vrmpy_VubVb64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x64, &::I8x64]; &INPUTS },
-            output: &::I32x16,
-            definition: Named("llvm.hexagon.V6.vrmpybusv")
-        },
-        "Vw_vrmpy_VubVb128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x128, &::I8x128]; &INPUTS },
-            output: &::I32x32,
-            definition: Named("llvm.hexagon.V6.vrmpybusv.128B")
-        },
-        "Vw_vrmpyacc_VwVubVb64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I32x16, &::U8x64, &::I8x64]; &INPUTS },
-            output: &::I32x16,
-            definition: Named("llvm.hexagon.V6.vrmpybusv.acc")
-        },
-        "Vw_vrmpyacc_VwVubVb128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I32x32, &::U8x128, &::I8x128]; &INPUTS },
-            output: &::I32x32,
-            definition: Named("llvm.hexagon.V6.vrmpybusv.acc.128B")
-        },
-        "Vw_vrmpy_VbVb64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x64, &::I8x64]; &INPUTS },
-            output: &::I32x16,
-            definition: Named("llvm.hexagon.V6.vrmpybv")
-        },
-        "Vuw_vrmpy_VubVub64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x64, &::U8x64]; &INPUTS },
-            output: &::U32x16,
-            definition: Named("llvm.hexagon.V6.vrmpyubv")
-        },
-        "Vw_vrmpy_VbVb128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x128, &::I8x128]; &INPUTS },
-            output: &::I32x32,
-            definition: Named("llvm.hexagon.V6.vrmpybv.128B")
-        },
-        "Vuw_vrmpy_VubVub128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x128, &::U8x128]; &INPUTS },
-            output: &::U32x32,
-            definition: Named("llvm.hexagon.V6.vrmpyubv.128B")
-        },
-        "Vw_vrmpyacc_VwVbVb64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I32x16, &::I8x64, &::I8x64]; &INPUTS },
-            output: &::I32x16,
-            definition: Named("llvm.hexagon.V6.vrmpywv.acc")
-        },
-        "Vuw_vrmpyacc_VuwVubVub64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x16, &::U8x64, &::U8x64]; &INPUTS },
-            output: &::U32x16,
-            definition: Named("llvm.hexagon.V6.vrmpyuwv.acc")
-        },
-        "Vw_vrmpyacc_VwVbVb128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I32x32, &::I8x128, &::I8x128]; &INPUTS },
-            output: &::I32x32,
-            definition: Named("llvm.hexagon.V6.vrmpywv.acc.128B")
-        },
-        "Vuw_vrmpyacc_VuwVubVub128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x32, &::U8x128, &::U8x128]; &INPUTS },
-            output: &::U32x32,
-            definition: Named("llvm.hexagon.V6.vrmpyuwv.acc.128B")
-        },
-        "Vuw_vrmpy_VubRub64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x64, &::U32]; &INPUTS },
-            output: &::U32x16,
-            definition: Named("llvm.hexagon.V6.vrmpyub")
-        },
-        "Vuw_vrmpy_VubRub128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x128, &::U32]; &INPUTS },
-            output: &::U32x32,
-            definition: Named("llvm.hexagon.V6.vrmpyub.128B")
-        },
-        "Vuw_vrmpyacc_VuwVubRub64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x16, &::U8x64, &::U32]; &INPUTS },
-            output: &::U32x16,
-            definition: Named("llvm.hexagon.V6.vrmpyub.acc")
-        },
-        "Vuw_vrmpyacc_VuwVubRub128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x32, &::U8x128, &::U32]; &INPUTS },
-            output: &::U32x32,
-            definition: Named("llvm.hexagon.V6.vrmpyub.acc.128B")
-        },
-        "Wuw_vrmpy_WubRubI64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x128, &::U32]; &INPUTS },
-            output: &::U32x32,
-            definition: Named("llvm.hexagon.V6.vrmpyubi")
-        },
-        "Wuw_vrmpy_WubRubI128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x256, &::U32]; &INPUTS },
-            output: &::U32x64,
-            definition: Named("llvm.hexagon.V6.vrmpyubi.128B")
-        },
-        "Wuw_vrmpyacc_WuwWubRubI64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x32, &::U8x128, &::U32]; &INPUTS },
-            output: &::U32x32,
-            definition: Named("llvm.hexagon.V6.vrmpyubi.acc")
-        },
-        "Wuw_vrmpyacc_WuwWubRubI128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x64, &::U8x256, &::U32]; &INPUTS },
-            output: &::U32x64,
-            definition: Named("llvm.hexagon.V6.vrmpyubi.acc.128B")
-        },
-        "V_vror_VR64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x64, &::U32]; &INPUTS },
-            output: &::U8x64,
-            definition: Named("llvm.hexagon.V6.vror")
-        },
-        "V_vror_VR128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x128, &::U32]; &INPUTS },
-            output: &::U8x128,
-            definition: Named("llvm.hexagon.V6.vror.128B")
-        },
-        "Vb_vround_VhVh_sat64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x32, &::I16x32]; &INPUTS },
-            output: &::I8x64,
-            definition: Named("llvm.hexagon.V6.vroundhb")
-        },
-        "Vub_vround_VhVh_sat64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x32, &::I16x32]; &INPUTS },
-            output: &::U8x64,
-            definition: Named("llvm.hexagon.V6.vroundhub")
-        },
-        "Vh_vround_VwVw_sat64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x16, &::I32x16]; &INPUTS },
-            output: &::I16x32,
-            definition: Named("llvm.hexagon.V6.vroundwh")
-        },
-        "Vuh_vround_VwVw_sat64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x16, &::I32x16]; &INPUTS },
-            output: &::U16x32,
-            definition: Named("llvm.hexagon.V6.vroundwuh")
-        },
-        "Vb_vround_VhVh_sat128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x64, &::I16x64]; &INPUTS },
-            output: &::I8x128,
-            definition: Named("llvm.hexagon.V6.vroundhb.128B")
-        },
-        "Vub_vround_VhVh_sat128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x64, &::I16x64]; &INPUTS },
-            output: &::U8x128,
-            definition: Named("llvm.hexagon.V6.vroundhub.128B")
-        },
-        "Vh_vround_VwVw_sat128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x32, &::I32x32]; &INPUTS },
-            output: &::I16x64,
-            definition: Named("llvm.hexagon.V6.vroundwh.128B")
-        },
-        "Vuh_vround_VwVw_sat128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x32, &::I32x32]; &INPUTS },
-            output: &::U16x64,
-            definition: Named("llvm.hexagon.V6.vroundwuh.128B")
-        },
-        "Wuw_vrsad_WubRubI64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x128, &::U32]; &INPUTS },
-            output: &::U32x32,
-            definition: Named("llvm.hexagon.V6.vrsadubi")
-        },
-        "Wuw_vrsad_WubRubI128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x256, &::U32]; &INPUTS },
-            output: &::U32x64,
-            definition: Named("llvm.hexagon.V6.vrsadubi.128B")
-        },
-        "Wuw_vrsadacc_WuwWubRubI64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x32, &::U8x128, &::U32]; &INPUTS },
-            output: &::U32x32,
-            definition: Named("llvm.hexagon.V6.vrsadubi.acc")
-        },
-        "Wuw_vrsadacc_WuwWubRubI128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x64, &::U8x256, &::U32]; &INPUTS },
-            output: &::U32x64,
-            definition: Named("llvm.hexagon.V6.vrsadubi.acc.128B")
-        },
-        "Vub_vsat_VhVh64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x32, &::I16x32]; &INPUTS },
-            output: &::U8x64,
-            definition: Named("llvm.hexagon.V6.vsathub")
-        },
-        "Vub_vsat_VhVh128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x64, &::I16x64]; &INPUTS },
-            output: &::U8x128,
-            definition: Named("llvm.hexagon.V6.vsathub.128B")
-        },
-        "Vh_vsat_VwVw64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x16, &::I32x16]; &INPUTS },
-            output: &::I16x32,
-            definition: Named("llvm.hexagon.V6.vsatwh")
-        },
-        "Vh_vsat_VwVw128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x32, &::I32x32]; &INPUTS },
-            output: &::I16x64,
-            definition: Named("llvm.hexagon.V6.vsatwh.128B")
-        },
-        "Wh_vsxt_Vb64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I8x64]; &INPUTS },
-            output: &::I16x64,
-            definition: Named("llvm.hexagon.V6.vsb")
-        },
-        "Ww_vsxt_Vh64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I16x32]; &INPUTS },
-            output: &::I32x32,
-            definition: Named("llvm.hexagon.V6.vsh")
-        },
-        "Wh_vsxt_Vb128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I8x128]; &INPUTS },
-            output: &::I16x128,
-            definition: Named("llvm.hexagon.V6.vsb.128B")
-        },
-        "Ww_vsxt_Vh128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I16x64]; &INPUTS },
-            output: &::I32x64,
-            definition: Named("llvm.hexagon.V6.vsh.128B")
-        },
-        "Wuh_vzxt_Vub64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U8x64]; &INPUTS },
-            output: &::U16x64,
-            definition: Named("llvm.hexagon.V6.vzb")
-        },
-        "Wuw_vzxt_Vuh64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U16x32]; &INPUTS },
-            output: &::U32x32,
-            definition: Named("llvm.hexagon.V6.vzh")
-        },
-        "Wuh_vzxt_Vub128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U8x128]; &INPUTS },
-            output: &::U16x128,
-            definition: Named("llvm.hexagon.V6.vzb.128B")
-        },
-        "Wuw_vzxt_Vuh128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U16x64]; &INPUTS },
-            output: &::U32x64,
-            definition: Named("llvm.hexagon.V6.vzh.128B")
-        },
-        "Vb_condacc_QVbVb64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x2, &::I8x64, &::I8x64]; &INPUTS },
-            output: &::I8x64,
-            definition: Named("llvm.hexagon.V6.vaddbq")
-        },
-        "Vh_condacc_QVhVh64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x2, &::I16x32, &::I16x32]; &INPUTS },
-            output: &::I16x32,
-            definition: Named("llvm.hexagon.V6.vaddhq")
-        },
-        "Vw_condacc_QVwVw64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x2, &::I32x16, &::I32x16]; &INPUTS },
-            output: &::I32x16,
-            definition: Named("llvm.hexagon.V6.vaddwq")
-        },
-        "Vb_condacc_QVbVb128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x4, &::I8x128, &::I8x128]; &INPUTS },
-            output: &::I8x128,
-            definition: Named("llvm.hexagon.V6.vaddbq.128B")
-        },
-        "Vh_condacc_QVhVh128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x4, &::I16x64, &::I16x64]; &INPUTS },
-            output: &::I16x64,
-            definition: Named("llvm.hexagon.V6.vaddhq.128B")
-        },
-        "Vw_condacc_QVwVw128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x4, &::I32x32, &::I32x32]; &INPUTS },
-            output: &::I32x32,
-            definition: Named("llvm.hexagon.V6.vaddwq.128B")
-        },
-        "Vb_condacc_QnVbVb64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x2, &::I8x64, &::I8x64]; &INPUTS },
-            output: &::I8x64,
-            definition: Named("llvm.hexagon.V6.vaddbnq")
-        },
-        "Vh_condacc_QnVhVh64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x2, &::I16x32, &::I16x32]; &INPUTS },
-            output: &::I16x32,
-            definition: Named("llvm.hexagon.V6.vaddhnq")
-        },
-        "Vw_condacc_QnVwVw64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x2, &::I32x16, &::I32x16]; &INPUTS },
-            output: &::I32x16,
-            definition: Named("llvm.hexagon.V6.vaddwnq")
-        },
-        "Vb_condacc_QnVbVb128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x4, &::I8x128, &::I8x128]; &INPUTS },
-            output: &::I8x128,
-            definition: Named("llvm.hexagon.V6.vaddbnq.128B")
-        },
-        "Vh_condacc_QnVhVh128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x4, &::I16x64, &::I16x64]; &INPUTS },
-            output: &::I16x64,
-            definition: Named("llvm.hexagon.V6.vaddhnq.128B")
-        },
-        "Vw_condacc_QnVwVw128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x4, &::I32x32, &::I32x32]; &INPUTS },
-            output: &::I32x32,
-            definition: Named("llvm.hexagon.V6.vaddwnq.128B")
-        },
-        "Vb_condnac_QVbVb64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x2, &::I8x64, &::I8x64]; &INPUTS },
-            output: &::I8x64,
-            definition: Named("llvm.hexagon.V6.vsubbq")
-        },
-        "Vh_condnac_QVhVh64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x2, &::I16x32, &::I16x32]; &INPUTS },
-            output: &::I16x32,
-            definition: Named("llvm.hexagon.V6.vsubhq")
-        },
-        "Vw_condnac_QVwVw64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x2, &::I32x16, &::I32x16]; &INPUTS },
-            output: &::I32x16,
-            definition: Named("llvm.hexagon.V6.vsubwq")
-        },
-        "Vb_condnac_QVbVb128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x4, &::I8x128, &::I8x128]; &INPUTS },
-            output: &::I8x128,
-            definition: Named("llvm.hexagon.V6.vsubbq.128B")
-        },
-        "Vh_condnac_QVhVh128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x4, &::I16x64, &::I16x64]; &INPUTS },
-            output: &::I16x64,
-            definition: Named("llvm.hexagon.V6.vsubhq.128B")
-        },
-        "Vw_condnac_QVwVw128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x4, &::I32x32, &::I32x32]; &INPUTS },
-            output: &::I32x32,
-            definition: Named("llvm.hexagon.V6.vsubwq.128B")
-        },
-        "Vb_condnac_QnVbVb64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x2, &::I8x64, &::I8x64]; &INPUTS },
-            output: &::I8x64,
-            definition: Named("llvm.hexagon.V6.vsubbnq")
-        },
-        "Vh_condnac_QnVhVh64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x2, &::I16x32, &::I16x32]; &INPUTS },
-            output: &::I16x32,
-            definition: Named("llvm.hexagon.V6.vsubhnq")
-        },
-        "Vw_condnac_QnVwVw64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x2, &::I32x16, &::I32x16]; &INPUTS },
-            output: &::I32x16,
-            definition: Named("llvm.hexagon.V6.vsubwnq")
-        },
-        "Vb_condnac_QnVbVb128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x4, &::I8x128, &::I8x128]; &INPUTS },
-            output: &::I8x128,
-            definition: Named("llvm.hexagon.V6.vsubbnq.128B")
-        },
-        "Vh_condnac_QnVhVh128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x4, &::I16x64, &::I16x64]; &INPUTS },
-            output: &::I16x64,
-            definition: Named("llvm.hexagon.V6.vsubhnq.128B")
-        },
-        "Vw_condnac_QnVwVw128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x4, &::I32x32, &::I32x32]; &INPUTS },
-            output: &::I32x32,
-            definition: Named("llvm.hexagon.V6.vsubwnq.128B")
-        },
-        "Vh_vshuffe_VhVh64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x32, &::I16x32]; &INPUTS },
-            output: &::I16x32,
-            definition: Named("llvm.hexagon.V6.vshufeh")
-        },
-        "Vh_vshuffe_VhVh128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x64, &::I16x64]; &INPUTS },
-            output: &::I16x64,
-            definition: Named("llvm.hexagon.V6.vshufeh.128B")
-        },
-        "Vh_vshuffo_VhVh64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x32, &::I16x32]; &INPUTS },
-            output: &::I16x32,
-            definition: Named("llvm.hexagon.V6.vshufoh")
-        },
-        "Vh_vshuffo_VhVh128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x64, &::I16x64]; &INPUTS },
-            output: &::I16x64,
-            definition: Named("llvm.hexagon.V6.vshufoh.128B")
-        },
-        "Vb_vshuff_Vb64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I8x64]; &INPUTS },
-            output: &::I8x64,
-            definition: Named("llvm.hexagon.V6.vshuffb")
-        },
-        "Vh_vshuff_Vh64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I16x32]; &INPUTS },
-            output: &::I16x32,
-            definition: Named("llvm.hexagon.V6.vshuffh")
-        },
-        "Vb_vshuff_Vb128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I8x128]; &INPUTS },
-            output: &::I8x128,
-            definition: Named("llvm.hexagon.V6.vshuffb.128B")
-        },
-        "Vh_vshuff_Vh128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I16x64]; &INPUTS },
-            output: &::I16x64,
-            definition: Named("llvm.hexagon.V6.vshuffh.128B")
-        },
-        "Vb_vshuffe_VbVb64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x64, &::I8x64]; &INPUTS },
-            output: &::I8x64,
-            definition: Named("llvm.hexagon.V6.vshuffeb")
-        },
-        "Vb_vshuffe_VbVb128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x128, &::I8x128]; &INPUTS },
-            output: &::I8x128,
-            definition: Named("llvm.hexagon.V6.vshuffeb.128B")
-        },
-        "Vb_vshuffo_VbVb64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x64, &::I8x64]; &INPUTS },
-            output: &::I8x64,
-            definition: Named("llvm.hexagon.V6.vshuffob")
-        },
-        "Vb_vshuffo_VbVb128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x128, &::I8x128]; &INPUTS },
-            output: &::I8x128,
-            definition: Named("llvm.hexagon.V6.vshuffob.128B")
-        },
-        "Vb_vshuffoe_VbVb64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x64, &::I8x64]; &INPUTS },
-            output: &::I8x64,
-            definition: Named("llvm.hexagon.V6.vshuffoeb")
-        },
-        "Vh_vshuffoe_VhVh64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x32, &::I16x32]; &INPUTS },
-            output: &::I16x32,
-            definition: Named("llvm.hexagon.V6.vshuffoeh")
-        },
-        "Vb_vshuffoe_VbVb128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x128, &::I8x128]; &INPUTS },
-            output: &::I8x128,
-            definition: Named("llvm.hexagon.V6.vshuffoeb.128B")
-        },
-        "Vh_vshuffoe_VhVh128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x64, &::I16x64]; &INPUTS },
-            output: &::I16x64,
-            definition: Named("llvm.hexagon.V6.vshuffoeh.128B")
-        },
-        "W_vshuff_VVR64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U8x64, &::U8x64, &::U32]; &INPUTS },
-            output: &::U8x128,
-            definition: Named("llvm.hexagon.V6.vshufvvd")
-        },
-        "W_vshuff_VVR128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U8x128, &::U8x128, &::U32]; &INPUTS },
-            output: &::U8x256,
-            definition: Named("llvm.hexagon.V6.vshufvvd.128B")
-        },
-        "Vb_vsub_VbVb64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x64, &::I8x64]; &INPUTS },
-            output: &::I8x64,
-            definition: Named("llvm.hexagon.V6.vsubb")
-        },
-        "Vh_vsub_VhVh64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x32, &::I16x32]; &INPUTS },
-            output: &::I16x32,
-            definition: Named("llvm.hexagon.V6.vsubh")
-        },
-        "Vw_vsub_VwVw64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x16, &::I32x16]; &INPUTS },
-            output: &::I32x16,
-            definition: Named("llvm.hexagon.V6.vsubw")
-        },
-        "Vb_vsub_VbVb128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x128, &::I8x128]; &INPUTS },
-            output: &::I8x128,
-            definition: Named("llvm.hexagon.V6.vsubb.128B")
-        },
-        "Vh_vsub_VhVh128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x64, &::I16x64]; &INPUTS },
-            output: &::I16x64,
-            definition: Named("llvm.hexagon.V6.vsubh.128B")
-        },
-        "Vw_vsub_VwVw128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x32, &::I32x32]; &INPUTS },
-            output: &::I32x32,
-            definition: Named("llvm.hexagon.V6.vsubw.128B")
-        },
-        "Vh_vsub_VhVh_sat64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x32, &::I16x32]; &INPUTS },
-            output: &::I16x32,
-            definition: Named("llvm.hexagon.V6.vsubhsat")
-        },
-        "Vw_vsub_VwVw_sat64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x16, &::I32x16]; &INPUTS },
-            output: &::I32x16,
-            definition: Named("llvm.hexagon.V6.vsubwsat")
-        },
-        "Vh_vsub_VhVh_sat128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x64, &::I16x64]; &INPUTS },
-            output: &::I16x64,
-            definition: Named("llvm.hexagon.V6.vsubhsat.128B")
-        },
-        "Vw_vsub_VwVw_sat128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x32, &::I32x32]; &INPUTS },
-            output: &::I32x32,
-            definition: Named("llvm.hexagon.V6.vsubwsat.128B")
-        },
-        "Vub_vsub_VubVub_sat64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x64, &::U8x64]; &INPUTS },
-            output: &::U8x64,
-            definition: Named("llvm.hexagon.V6.vsububsat")
-        },
-        "Vuh_vsub_VuhVuh_sat64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x32, &::U16x32]; &INPUTS },
-            output: &::U16x32,
-            definition: Named("llvm.hexagon.V6.vsubuhsat")
-        },
-        "Vub_vsub_VubVub_sat128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x128, &::U8x128]; &INPUTS },
-            output: &::U8x128,
-            definition: Named("llvm.hexagon.V6.vsububsat.128B")
-        },
-        "Vuh_vsub_VuhVuh_sat128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x64, &::U16x64]; &INPUTS },
-            output: &::U16x64,
-            definition: Named("llvm.hexagon.V6.vsubuhsat.128B")
-        },
-        "Wb_vsub_WbWb64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x128, &::I8x128]; &INPUTS },
-            output: &::I8x128,
-            definition: Named("llvm.hexagon.V6.vsubb.dv")
-        },
-        "Wh_vsub_WhWh64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x64, &::I16x64]; &INPUTS },
-            output: &::I16x64,
-            definition: Named("llvm.hexagon.V6.vsubh.dv")
-        },
-        "Ww_vsub_WwWw64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x32, &::I32x32]; &INPUTS },
-            output: &::I32x32,
-            definition: Named("llvm.hexagon.V6.vsubw.dv")
-        },
-        "Wb_vsub_WbWb128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x256, &::I8x256]; &INPUTS },
-            output: &::I8x256,
-            definition: Named("llvm.hexagon.V6.vsubb.dv.128B")
-        },
-        "Wh_vsub_WhWh128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x128, &::I16x128]; &INPUTS },
-            output: &::I16x128,
-            definition: Named("llvm.hexagon.V6.vsubh.dv.128B")
-        },
-        "Ww_vsub_WwWw128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x64, &::I32x64]; &INPUTS },
-            output: &::I32x64,
-            definition: Named("llvm.hexagon.V6.vsubw.dv.128B")
-        },
-        "Wh_vsub_WhWh_sat64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x64, &::I16x64]; &INPUTS },
-            output: &::I16x64,
-            definition: Named("llvm.hexagon.V6.vsubhsat.dv")
-        },
-        "Ww_vsub_WwWw_sat64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x32, &::I32x32]; &INPUTS },
-            output: &::I32x32,
-            definition: Named("llvm.hexagon.V6.vsubwsat.dv")
-        },
-        "Wh_vsub_WhWh_sat128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x128, &::I16x128]; &INPUTS },
-            output: &::I16x128,
-            definition: Named("llvm.hexagon.V6.vsubhsat.dv.128B")
-        },
-        "Ww_vsub_WwWw_sat128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x64, &::I32x64]; &INPUTS },
-            output: &::I32x64,
-            definition: Named("llvm.hexagon.V6.vsubwsat.dv.128B")
-        },
-        "Wub_vsub_WubWub_sat64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x128, &::U8x128]; &INPUTS },
-            output: &::U8x128,
-            definition: Named("llvm.hexagon.V6.vsububsat.dv")
-        },
-        "Wuh_vsub_WuhWuh_sat64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x64, &::U16x64]; &INPUTS },
-            output: &::U16x64,
-            definition: Named("llvm.hexagon.V6.vsubuhsat.dv")
-        },
-        "Wub_vsub_WubWub_sat128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x256, &::U8x256]; &INPUTS },
-            output: &::U8x256,
-            definition: Named("llvm.hexagon.V6.vsububsat.dv.128B")
-        },
-        "Wuh_vsub_WuhWuh_sat128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x128, &::U16x128]; &INPUTS },
-            output: &::U16x128,
-            definition: Named("llvm.hexagon.V6.vsubuhsat.dv.128B")
-        },
-        "W_vswap_QVV64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x2, &::U8x64, &::U8x64]; &INPUTS },
-            output: &::U8x128,
-            definition: Named("llvm.hexagon.V6.vswap")
-        },
-        "W_vswap_QVV128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U32x4, &::U8x128, &::U8x128]; &INPUTS },
-            output: &::U8x256,
-            definition: Named("llvm.hexagon.V6.vswap.128B")
-        },
-        "Wh_vtmpy_WbRb64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x128, &::U32]; &INPUTS },
-            output: &::I16x64,
-            definition: Named("llvm.hexagon.V6.vtmpyb")
-        },
-        "Wh_vtmpy_WbRb128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x256, &::U32]; &INPUTS },
-            output: &::I16x128,
-            definition: Named("llvm.hexagon.V6.vtmpyb.128B")
-        },
-        "Wh_vtmpyacc_WhWbRb64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I16x64, &::I8x128, &::U32]; &INPUTS },
-            output: &::I16x64,
-            definition: Named("llvm.hexagon.V6.vtmpyb.acc")
-        },
-        "Wh_vtmpyacc_WhWbRb128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I16x128, &::I8x256, &::U32]; &INPUTS },
-            output: &::I16x128,
-            definition: Named("llvm.hexagon.V6.vtmpyb.acc.128B")
-        },
-        "Wh_vtmpy_WubRb64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x128, &::U32]; &INPUTS },
-            output: &::I16x64,
-            definition: Named("llvm.hexagon.V6.vtmpybus")
-        },
-        "Wh_vtmpy_WubRb128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x256, &::U32]; &INPUTS },
-            output: &::I16x128,
-            definition: Named("llvm.hexagon.V6.vtmpybus.128B")
-        },
-        "Wh_vtmpyacc_WhWubRb64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I16x64, &::U8x128, &::U32]; &INPUTS },
-            output: &::I16x64,
-            definition: Named("llvm.hexagon.V6.vtmpybus.acc")
-        },
-        "Wh_vtmpyacc_WhWubRb128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I16x128, &::U8x256, &::U32]; &INPUTS },
-            output: &::I16x128,
-            definition: Named("llvm.hexagon.V6.vtmpybus.acc.128B")
-        },
-        "Ww_vtmpy_WhRb64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x64, &::U32]; &INPUTS },
-            output: &::I32x32,
-            definition: Named("llvm.hexagon.V6.vtmpyhb")
-        },
-        "Ww_vtmpy_WhRb128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x128, &::U32]; &INPUTS },
-            output: &::I32x64,
-            definition: Named("llvm.hexagon.V6.vtmpyhb.128B")
-        },
-        "Wh_vunpack_Vb64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I8x64]; &INPUTS },
-            output: &::I16x64,
-            definition: Named("llvm.hexagon.V6.vunpackb")
-        },
-        "Wuh_vunpack_Vub64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U8x64]; &INPUTS },
-            output: &::U16x64,
-            definition: Named("llvm.hexagon.V6.vunpackub")
-        },
-        "Ww_vunpack_Vh64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I16x32]; &INPUTS },
-            output: &::I32x32,
-            definition: Named("llvm.hexagon.V6.vunpackh")
-        },
-        "Wuw_vunpack_Vuh64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U16x32]; &INPUTS },
-            output: &::U32x32,
-            definition: Named("llvm.hexagon.V6.vunpackuh")
-        },
-        "Wh_vunpack_Vb128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I8x128]; &INPUTS },
-            output: &::I16x128,
-            definition: Named("llvm.hexagon.V6.vunpackb.128B")
-        },
-        "Wuh_vunpack_Vub128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U8x128]; &INPUTS },
-            output: &::U16x128,
-            definition: Named("llvm.hexagon.V6.vunpackub.128B")
-        },
-        "Ww_vunpack_Vh128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I16x64]; &INPUTS },
-            output: &::I32x64,
-            definition: Named("llvm.hexagon.V6.vunpackh.128B")
-        },
-        "Wuw_vunpack_Vuh128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U16x64]; &INPUTS },
-            output: &::U32x64,
-            definition: Named("llvm.hexagon.V6.vunpackuh.128B")
-        },
-        "Wh_vunpackoor_WhVb64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x64, &::I8x64]; &INPUTS },
-            output: &::I16x64,
-            definition: Named("llvm.hexagon.V6.vunpackob")
-        },
-        "Ww_vunpackoor_WwVh64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x32, &::I16x32]; &INPUTS },
-            output: &::I32x32,
-            definition: Named("llvm.hexagon.V6.vunpackoh")
-        },
-        "Wh_vunpackoor_WhVb128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x128, &::I8x128]; &INPUTS },
-            output: &::I16x128,
-            definition: Named("llvm.hexagon.V6.vunpackob.128B")
-        },
-        "Ww_vunpackoor_WwVh128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x64, &::I16x64]; &INPUTS },
-            output: &::I32x64,
-            definition: Named("llvm.hexagon.V6.vunpackoh.128B")
-        },
-        "Ww_vtmpyacc_WwWhRb64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I32x32, &::I16x64, &::U32]; &INPUTS },
-            output: &::I32x32,
-            definition: Named("llvm.hexagon.V6.vtmpyhb.acc")
-        },
-        "Ww_vtmpyacc_WwWhRb128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I32x64, &::I16x128, &::U32]; &INPUTS },
-            output: &::I32x64,
-            definition: Named("llvm.hexagon.V6.vtmpyhb.acc.128B")
-        },
-        "V_vxor_VV64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x32, &::U16x32]; &INPUTS },
-            output: &::U16x32,
-            definition: Named("llvm.hexagon.V6.vxor")
-        },
-        "V_vxor_VV128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x64, &::U16x64]; &INPUTS },
-            output: &::U16x64,
-            definition: Named("llvm.hexagon.V6.vxor.128B")
-        },
-        _ => return None,
-    })
-}
diff --git a/src/librustc_platform_intrinsics/lib.rs b/src/librustc_platform_intrinsics/lib.rs
deleted file mode 100644
index 9fbf168..0000000
--- a/src/librustc_platform_intrinsics/lib.rs
+++ /dev/null
@@ -1,124 +0,0 @@
-#![allow(nonstandard_style)]
-
-#![feature(nll)]
-
-pub struct Intrinsic {
-    pub inputs: &'static [&'static Type],
-    pub output: &'static Type,
-
-    pub definition: IntrinsicDef,
-}
-
-#[derive(Clone, Hash, Eq, PartialEq)]
-pub enum Type {
-    Void,
-    Integer(/* signed */ bool, u8, /* llvm width */ u8),
-    Float(u8),
-    Pointer(&'static Type, Option<&'static Type>, /* const */ bool),
-    Vector(&'static Type, Option<&'static Type>, u16),
-    Aggregate(bool, &'static [&'static Type]),
-}
-
-pub enum IntrinsicDef {
-    Named(&'static str),
-}
-
-static I8: Type = Type::Integer(true, 8, 8);
-static I16: Type = Type::Integer(true, 16, 16);
-static I32: Type = Type::Integer(true, 32, 32);
-static I64: Type = Type::Integer(true, 64, 64);
-static U8: Type = Type::Integer(false, 8, 8);
-static U16: Type = Type::Integer(false, 16, 16);
-static U32: Type = Type::Integer(false, 32, 32);
-static U64: Type = Type::Integer(false, 64, 64);
-static F32: Type = Type::Float(32);
-static F64: Type = Type::Float(64);
-
-static I32_8: Type = Type::Integer(true, 32, 8);
-
-static I8x8: Type = Type::Vector(&I8, None, 8);
-static U8x8: Type = Type::Vector(&U8, None, 8);
-static I8x16: Type = Type::Vector(&I8, None, 16);
-static U8x16: Type = Type::Vector(&U8, None, 16);
-static I8x32: Type = Type::Vector(&I8, None, 32);
-static U8x32: Type = Type::Vector(&U8, None, 32);
-static I8x64: Type = Type::Vector(&I8, None, 64);
-static U8x64: Type = Type::Vector(&U8, None, 64);
-static I8x128: Type = Type::Vector(&I8, None, 128);
-static U8x128: Type = Type::Vector(&U8, None, 128);
-static I8x256: Type = Type::Vector(&I8, None, 256);
-static U8x256: Type = Type::Vector(&U8, None, 256);
-
-static I16x4: Type = Type::Vector(&I16, None, 4);
-static U16x4: Type = Type::Vector(&U16, None, 4);
-static I16x8: Type = Type::Vector(&I16, None, 8);
-static U16x8: Type = Type::Vector(&U16, None, 8);
-static I16x16: Type = Type::Vector(&I16, None, 16);
-static U16x16: Type = Type::Vector(&U16, None, 16);
-static I16x32: Type = Type::Vector(&I16, None, 32);
-static U16x32: Type = Type::Vector(&U16, None, 32);
-static I16x64: Type = Type::Vector(&I16, None, 64);
-static U16x64: Type = Type::Vector(&U16, None, 64);
-static I16x128: Type = Type::Vector(&I16, None, 128);
-static U16x128: Type = Type::Vector(&U16, None, 128);
-
-static I32x2: Type = Type::Vector(&I32, None, 2);
-static U32x2: Type = Type::Vector(&U32, None, 2);
-static I32x4: Type = Type::Vector(&I32, None, 4);
-static U32x4: Type = Type::Vector(&U32, None, 4);
-static I32x8: Type = Type::Vector(&I32, None, 8);
-static U32x8: Type = Type::Vector(&U32, None, 8);
-static I32x16: Type = Type::Vector(&I32, None, 16);
-static U32x16: Type = Type::Vector(&U32, None, 16);
-static I32x32: Type = Type::Vector(&I32, None, 32);
-static U32x32: Type = Type::Vector(&U32, None, 32);
-static I32x64: Type = Type::Vector(&I32, None, 64);
-static U32x64: Type = Type::Vector(&U32, None, 64);
-
-static I64x1: Type = Type::Vector(&I64, None, 1);
-static U64x1: Type = Type::Vector(&U64, None, 1);
-static I64x2: Type = Type::Vector(&I64, None, 2);
-static U64x2: Type = Type::Vector(&U64, None, 2);
-static I64x4: Type = Type::Vector(&I64, None, 4);
-static U64x4: Type = Type::Vector(&U64, None, 4);
-
-static F32x2: Type = Type::Vector(&F32, None, 2);
-static F32x4: Type = Type::Vector(&F32, None, 4);
-static F32x8: Type = Type::Vector(&F32, None, 8);
-static F64x1: Type = Type::Vector(&F64, None, 1);
-static F64x2: Type = Type::Vector(&F64, None, 2);
-static F64x4: Type = Type::Vector(&F64, None, 4);
-
-static I32x4_F32: Type = Type::Vector(&I32, Some(&F32), 4);
-static I32x8_F32: Type = Type::Vector(&I32, Some(&F32), 8);
-static I64x2_F64: Type = Type::Vector(&I64, Some(&F64), 2);
-static I64x4_F64: Type = Type::Vector(&I64, Some(&F64), 4);
-
-static VOID: Type = Type::Void;
-
-mod x86;
-mod arm;
-mod aarch64;
-mod nvptx;
-mod hexagon;
-mod powerpc;
-
-impl Intrinsic {
-    pub fn find(name: &str) -> Option<Intrinsic> {
-        if name.starts_with("x86_") {
-            x86::find(name)
-        } else if name.starts_with("arm_") {
-            arm::find(name)
-        } else if name.starts_with("aarch64_") {
-            aarch64::find(name)
-        } else if name.starts_with("nvptx_") {
-            nvptx::find(name)
-        } else if name.starts_with("Q6_") {
-            hexagon::find(name)
-        } else if name.starts_with("powerpc_") {
-            powerpc::find(name)
-        } else {
-            None
-        }
-    }
-}
diff --git a/src/librustc_platform_intrinsics/nvptx.rs b/src/librustc_platform_intrinsics/nvptx.rs
deleted file mode 100644
index 4127846..0000000
--- a/src/librustc_platform_intrinsics/nvptx.rs
+++ /dev/null
@@ -1,79 +0,0 @@
-// DO NOT EDIT: autogenerated by etc/platform-intrinsics/generator.py
-// ignore-tidy-linelength
-
-#![allow(unused_imports)]
-
-use {Intrinsic, Type};
-use IntrinsicDef::Named;
-
-pub fn find(name: &str) -> Option<Intrinsic> {
-    if !name.starts_with("nvptx") { return None }
-    Some(match &name["nvptx".len()..] {
-        "_syncthreads" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 0] = []; &INPUTS },
-            output: &::VOID,
-            definition: Named("llvm.cuda.syncthreads")
-        },
-        "_block_dim_x" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 0] = []; &INPUTS },
-            output: &::I32,
-            definition: Named("llvm.nvvm.read.ptx.sreg.ntid.x")
-        },
-        "_block_dim_y" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 0] = []; &INPUTS },
-            output: &::I32,
-            definition: Named("llvm.nvvm.read.ptx.sreg.ntid.y")
-        },
-        "_block_dim_z" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 0] = []; &INPUTS },
-            output: &::I32,
-            definition: Named("llvm.nvvm.read.ptx.sreg.ntid.z")
-        },
-        "_block_idx_x" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 0] = []; &INPUTS },
-            output: &::I32,
-            definition: Named("llvm.nvvm.read.ptx.sreg.ctaid.x")
-        },
-        "_block_idx_y" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 0] = []; &INPUTS },
-            output: &::I32,
-            definition: Named("llvm.nvvm.read.ptx.sreg.ctaid.y")
-        },
-        "_block_idx_z" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 0] = []; &INPUTS },
-            output: &::I32,
-            definition: Named("llvm.nvvm.read.ptx.sreg.ctaid.z")
-        },
-        "_grid_dim_x" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 0] = []; &INPUTS },
-            output: &::I32,
-            definition: Named("llvm.nvvm.read.ptx.sreg.nctaid.x")
-        },
-        "_grid_dim_y" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 0] = []; &INPUTS },
-            output: &::I32,
-            definition: Named("llvm.nvvm.read.ptx.sreg.nctaid.y")
-        },
-        "_grid_dim_z" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 0] = []; &INPUTS },
-            output: &::I32,
-            definition: Named("llvm.nvvm.read.ptx.sreg.nctaid.z")
-        },
-        "_thread_idx_x" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 0] = []; &INPUTS },
-            output: &::I32,
-            definition: Named("llvm.nvvm.read.ptx.sreg.tid.x")
-        },
-        "_thread_idx_y" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 0] = []; &INPUTS },
-            output: &::I32,
-            definition: Named("llvm.nvvm.read.ptx.sreg.tid.y")
-        },
-        "_thread_idx_z" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 0] = []; &INPUTS },
-            output: &::I32,
-            definition: Named("llvm.nvvm.read.ptx.sreg.tid.z")
-        },
-        _ => return None,
-    })
-}
diff --git a/src/librustc_platform_intrinsics/powerpc.rs b/src/librustc_platform_intrinsics/powerpc.rs
deleted file mode 100644
index d745090..0000000
--- a/src/librustc_platform_intrinsics/powerpc.rs
+++ /dev/null
@@ -1,439 +0,0 @@
-// DO NOT EDIT: autogenerated by etc/platform-intrinsics/generator.py
-// ignore-tidy-linelength
-
-#![allow(unused_imports)]
-
-use {Intrinsic, Type};
-use IntrinsicDef::Named;
-
-pub fn find(name: &str) -> Option<Intrinsic> {
-    if !name.starts_with("powerpc") { return None }
-    Some(match &name["powerpc".len()..] {
-        "_vec_perm" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I32x4, &::I32x4, &::I8x16]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.ppc.altivec.vperm")
-        },
-        "_vec_mradds" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I16x8, &::I16x8, &::I16x8]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.ppc.altivec.vmhraddshs")
-        },
-        "_vec_cmpb" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F32x4, &::F32x4]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.ppc.altivec.vcmpbfp")
-        },
-        "_vec_cmpeqb" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x16, &::I8x16]; &INPUTS },
-            output: &::I8x16,
-            definition: Named("llvm.ppc.altivec.vcmpequb")
-        },
-        "_vec_cmpeqh" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x8, &::I16x8]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.ppc.altivec.vcmpequh")
-        },
-        "_vec_cmpeqw" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x4, &::I32x4]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.ppc.altivec.vcmpequw")
-        },
-        "_vec_cmpgtub" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x16, &::U8x16]; &INPUTS },
-            output: &::I8x16,
-            definition: Named("llvm.ppc.altivec.vcmpgtub")
-        },
-        "_vec_cmpgtuh" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x8, &::U16x8]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.ppc.altivec.vcmpgtuh")
-        },
-        "_vec_cmpgtuw" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x4, &::U32x4]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.ppc.altivec.vcmpgtuw")
-        },
-        "_vec_cmpgtsb" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x16, &::I8x16]; &INPUTS },
-            output: &::I8x16,
-            definition: Named("llvm.ppc.altivec.vcmpgtsb")
-        },
-        "_vec_cmpgtsh" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x8, &::I16x8]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.ppc.altivec.vcmpgtsh")
-        },
-        "_vec_cmpgtsw" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x4, &::I32x4]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.ppc.altivec.vcmpgtsw")
-        },
-        "_vec_maxsb" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x16, &::I8x16]; &INPUTS },
-            output: &::I8x16,
-            definition: Named("llvm.ppc.altivec.vmaxsb")
-        },
-        "_vec_maxub" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x16, &::U8x16]; &INPUTS },
-            output: &::U8x16,
-            definition: Named("llvm.ppc.altivec.vmaxub")
-        },
-        "_vec_maxsh" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x8, &::I16x8]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.ppc.altivec.vmaxsh")
-        },
-        "_vec_maxuh" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x8, &::U16x8]; &INPUTS },
-            output: &::U16x8,
-            definition: Named("llvm.ppc.altivec.vmaxuh")
-        },
-        "_vec_maxsw" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x4, &::I32x4]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.ppc.altivec.vmaxsw")
-        },
-        "_vec_maxuw" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x4, &::U32x4]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.ppc.altivec.vmaxuw")
-        },
-        "_vec_minsb" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x16, &::I8x16]; &INPUTS },
-            output: &::I8x16,
-            definition: Named("llvm.ppc.altivec.vminsb")
-        },
-        "_vec_minub" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x16, &::U8x16]; &INPUTS },
-            output: &::U8x16,
-            definition: Named("llvm.ppc.altivec.vminub")
-        },
-        "_vec_minsh" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x8, &::I16x8]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.ppc.altivec.vminsh")
-        },
-        "_vec_minuh" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x8, &::U16x8]; &INPUTS },
-            output: &::U16x8,
-            definition: Named("llvm.ppc.altivec.vminuh")
-        },
-        "_vec_minsw" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x4, &::I32x4]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.ppc.altivec.vminsw")
-        },
-        "_vec_minuw" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x4, &::U32x4]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.ppc.altivec.vminuw")
-        },
-        "_vec_subsbs" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x16, &::I8x16]; &INPUTS },
-            output: &::I8x16,
-            definition: Named("llvm.ppc.altivec.vsubsbs")
-        },
-        "_vec_sububs" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x16, &::U8x16]; &INPUTS },
-            output: &::U8x16,
-            definition: Named("llvm.ppc.altivec.vsububs")
-        },
-        "_vec_subshs" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x8, &::I16x8]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.ppc.altivec.vsubshs")
-        },
-        "_vec_subuhs" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x8, &::U16x8]; &INPUTS },
-            output: &::U16x8,
-            definition: Named("llvm.ppc.altivec.vsubuhs")
-        },
-        "_vec_subsws" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x4, &::I32x4]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.ppc.altivec.vsubsws")
-        },
-        "_vec_subuws" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x4, &::U32x4]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.ppc.altivec.vsubuws")
-        },
-        "_vec_subc" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x4, &::U32x4]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.ppc.altivec.vsubcuw")
-        },
-        "_vec_addsbs" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x16, &::I8x16]; &INPUTS },
-            output: &::I8x16,
-            definition: Named("llvm.ppc.altivec.vaddsbs")
-        },
-        "_vec_addubs" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x16, &::U8x16]; &INPUTS },
-            output: &::U8x16,
-            definition: Named("llvm.ppc.altivec.vaddubs")
-        },
-        "_vec_addshs" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x8, &::I16x8]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.ppc.altivec.vaddshs")
-        },
-        "_vec_adduhs" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x8, &::U16x8]; &INPUTS },
-            output: &::U16x8,
-            definition: Named("llvm.ppc.altivec.vadduhs")
-        },
-        "_vec_addsws" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x4, &::I32x4]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.ppc.altivec.vaddsws")
-        },
-        "_vec_adduws" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x4, &::U32x4]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.ppc.altivec.vadduws")
-        },
-        "_vec_addc" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x4, &::U32x4]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.ppc.altivec.vaddcuw")
-        },
-        "_vec_mulesb" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x16, &::I8x16]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.ppc.altivec.vmulesb")
-        },
-        "_vec_muleub" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x16, &::U8x16]; &INPUTS },
-            output: &::U16x8,
-            definition: Named("llvm.ppc.altivec.vmuleub")
-        },
-        "_vec_mulesh" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x8, &::I16x8]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.ppc.altivec.vmulesh")
-        },
-        "_vec_muleuh" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x8, &::U16x8]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.ppc.altivec.vmuleuh")
-        },
-        "_vec_mulosb" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x16, &::I8x16]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.ppc.altivec.vmulosb")
-        },
-        "_vec_muloub" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x16, &::U8x16]; &INPUTS },
-            output: &::U16x8,
-            definition: Named("llvm.ppc.altivec.vmuloub")
-        },
-        "_vec_mulosh" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x8, &::I16x8]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.ppc.altivec.vmulosh")
-        },
-        "_vec_mulouh" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x8, &::U16x8]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.ppc.altivec.vmulouh")
-        },
-        "_vec_avgsb" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x16, &::I8x16]; &INPUTS },
-            output: &::I8x16,
-            definition: Named("llvm.ppc.altivec.vavgsb")
-        },
-        "_vec_avgub" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x16, &::U8x16]; &INPUTS },
-            output: &::U8x16,
-            definition: Named("llvm.ppc.altivec.vavgub")
-        },
-        "_vec_avgsh" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x8, &::I16x8]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.ppc.altivec.vavgsh")
-        },
-        "_vec_avguh" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x8, &::U16x8]; &INPUTS },
-            output: &::U16x8,
-            definition: Named("llvm.ppc.altivec.vavguh")
-        },
-        "_vec_avgsw" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x4, &::I32x4]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.ppc.altivec.vavgsw")
-        },
-        "_vec_avguw" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x4, &::U32x4]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.ppc.altivec.vavguw")
-        },
-        "_vec_packssh" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x8, &::I16x8]; &INPUTS },
-            output: &::I8x16,
-            definition: Named("llvm.ppc.altivec.vpkshss")
-        },
-        "_vec_packsuh" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x8, &::U16x8]; &INPUTS },
-            output: &::U8x16,
-            definition: Named("llvm.ppc.altivec.vpkuhus")
-        },
-        "_vec_packssw" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x4, &::I32x4]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.ppc.altivec.vpkswss")
-        },
-        "_vec_packsuw" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x4, &::U32x4]; &INPUTS },
-            output: &::U16x8,
-            definition: Named("llvm.ppc.altivec.vpkuwus")
-        },
-        "_vec_packsush" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x8, &::I16x8]; &INPUTS },
-            output: &::U8x16,
-            definition: Named("llvm.ppc.altivec.vpkshus")
-        },
-        "_vec_packsusw" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x4, &::I32x4]; &INPUTS },
-            output: &::U16x8,
-            definition: Named("llvm.ppc.altivec.vpkswus")
-        },
-        "_vec_packpx" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x4, &::I32x4]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.ppc.altivec.vpkpx")
-        },
-        "_vec_unpacklsb" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I8x16]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.ppc.altivec.vupklsb")
-        },
-        "_vec_unpacklsh" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I16x8]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.ppc.altivec.vupklsh")
-        },
-        "_vec_unpackhsb" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I8x16]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.ppc.altivec.vupkhsb")
-        },
-        "_vec_unpackhsh" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I16x8]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.ppc.altivec.vupkhsh")
-        },
-        "_vec_madds" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I16x8, &::I16x8, &::I16x8]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.ppc.altivec.vmhaddshs")
-        },
-        "_vec_msumubm" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U8x16, &::U8x16, &::U32x4]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.ppc.altivec.vmsumubm")
-        },
-        "_vec_msumuhm" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U16x8, &::U16x8, &::U32x4]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.ppc.altivec.vmsumuhm")
-        },
-        "_vec_msummbm" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I8x16, &::U8x16, &::I32x4]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.ppc.altivec.vmsummbm")
-        },
-        "_vec_msumshm" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I16x8, &::I16x8, &::I32x4]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.ppc.altivec.vmsumshm")
-        },
-        "_vec_msumshs" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I16x8, &::I16x8, &::I32x4]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.ppc.altivec.vmsumshs")
-        },
-        "_vec_msumuhs" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U16x8, &::U16x8, &::U32x4]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.ppc.altivec.vmsumuhs")
-        },
-        "_vec_sum2s" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x4, &::I32x4]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.ppc.altivec.vsum2sws")
-        },
-        "_vec_sum4sbs" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x16, &::I32x4]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.ppc.altivec.vsum4sbs")
-        },
-        "_vec_sum4ubs" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x16, &::U32x4]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.ppc.altivec.vsum4ubs")
-        },
-        "_vec_sum4shs" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x8, &::I32x4]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.ppc.altivec.vsum4shs")
-        },
-        "_vec_sums" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x4, &::I32x4]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.ppc.altivec.vsumsws")
-        },
-        "_vec_madd" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::F32x4, &::F32x4, &::F32x4]; &INPUTS },
-            output: &::F32x4,
-            definition: Named("llvm.ppc.altivec.vmaddfp")
-        },
-        "_vec_nmsub" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::F32x4, &::F32x4, &::F32x4]; &INPUTS },
-            output: &::F32x4,
-            definition: Named("llvm.ppc.altivec.vnmsubfp")
-        },
-        "_vec_expte" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::F32x4]; &INPUTS },
-            output: &::F32x4,
-            definition: Named("llvm.ppc.altivec.vexptefp")
-        },
-        "_vec_floor" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::F32x4]; &INPUTS },
-            output: &::F32x4,
-            definition: Named("llvm.ppc.altivec.vrfim")
-        },
-        "_vec_ceil" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::F32x4]; &INPUTS },
-            output: &::F32x4,
-            definition: Named("llvm.ppc.altivec.vrfip")
-        },
-        "_vec_round" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::F32x4]; &INPUTS },
-            output: &::F32x4,
-            definition: Named("llvm.ppc.altivec.vrfin")
-        },
-        "_vec_trunc" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::F32x4]; &INPUTS },
-            output: &::F32x4,
-            definition: Named("llvm.ppc.altivec.vrfiz")
-        },
-        "_vec_loge" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::F32x4]; &INPUTS },
-            output: &::F32x4,
-            definition: Named("llvm.ppc.altivec.vlogefp")
-        },
-        "_vec_re" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::F32x4]; &INPUTS },
-            output: &::F32x4,
-            definition: Named("llvm.ppc.altivec.vrefp")
-        },
-        "_vec_rsqrte" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::F32x4]; &INPUTS },
-            output: &::F32x4,
-            definition: Named("llvm.ppc.altivec.vrsqrtefp")
-        },
-        _ => return None,
-    })
-}
diff --git a/src/librustc_platform_intrinsics/x86.rs b/src/librustc_platform_intrinsics/x86.rs
deleted file mode 100644
index 3f1ba91..0000000
--- a/src/librustc_platform_intrinsics/x86.rs
+++ /dev/null
@@ -1,1369 +0,0 @@
-// DO NOT EDIT: autogenerated by etc/platform-intrinsics/generator.py
-// ignore-tidy-linelength
-
-#![allow(unused_imports)]
-
-use {Intrinsic, Type};
-use IntrinsicDef::Named;
-
-pub fn find(name: &str) -> Option<Intrinsic> {
-    if !name.starts_with("x86") { return None }
-    Some(match &name["x86".len()..] {
-        "_mm256_abs_epi8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I8x32]; &INPUTS },
-            output: &::I8x32,
-            definition: Named("llvm.x86.avx2.pabs.b")
-        },
-        "_mm256_abs_epi16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I16x16]; &INPUTS },
-            output: &::I16x16,
-            definition: Named("llvm.x86.avx2.pabs.w")
-        },
-        "_mm256_abs_epi32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I32x8]; &INPUTS },
-            output: &::I32x8,
-            definition: Named("llvm.x86.avx2.pabs.d")
-        },
-        "_mm256_adds_epi8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x32, &::I8x32]; &INPUTS },
-            output: &::I8x32,
-            definition: Named("llvm.x86.avx2.padds.b")
-        },
-        "_mm256_adds_epu8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x32, &::U8x32]; &INPUTS },
-            output: &::U8x32,
-            definition: Named("llvm.x86.avx2.paddus.b")
-        },
-        "_mm256_adds_epi16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x16, &::I16x16]; &INPUTS },
-            output: &::I16x16,
-            definition: Named("llvm.x86.avx2.padds.w")
-        },
-        "_mm256_adds_epu16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x16, &::U16x16]; &INPUTS },
-            output: &::U16x16,
-            definition: Named("llvm.x86.avx2.paddus.w")
-        },
-        "_mm256_avg_epu8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x32, &::U8x32]; &INPUTS },
-            output: &::U8x32,
-            definition: Named("llvm.x86.avx2.pavg.b")
-        },
-        "_mm256_avg_epu16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x16, &::U16x16]; &INPUTS },
-            output: &::U16x16,
-            definition: Named("llvm.x86.avx2.pavg.w")
-        },
-        "_mm256_hadd_epi16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x16, &::I16x16]; &INPUTS },
-            output: &::I16x16,
-            definition: Named("llvm.x86.avx2.phadd.w")
-        },
-        "_mm256_hadd_epi32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x8, &::I32x8]; &INPUTS },
-            output: &::I32x8,
-            definition: Named("llvm.x86.avx2.phadd.d")
-        },
-        "_mm256_hadds_epi16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x16, &::I16x16]; &INPUTS },
-            output: &::I16x16,
-            definition: Named("llvm.x86.avx2.phadd.sw")
-        },
-        "_mm256_hsub_epi16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x16, &::I16x16]; &INPUTS },
-            output: &::I16x16,
-            definition: Named("llvm.x86.avx2.phsub.w")
-        },
-        "_mm256_hsub_epi32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x8, &::I32x8]; &INPUTS },
-            output: &::I32x8,
-            definition: Named("llvm.x86.avx2.phsub.d")
-        },
-        "_mm256_hsubs_epi16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x16, &::I16x16]; &INPUTS },
-            output: &::I16x16,
-            definition: Named("llvm.x86.avx2.phsub.sw")
-        },
-        "_mm256_madd_epi16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x16, &::I16x16]; &INPUTS },
-            output: &::I32x8,
-            definition: Named("llvm.x86.avx2.pmadd.wd")
-        },
-        "_mm256_maddubs_epi16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x32, &::I8x32]; &INPUTS },
-            output: &::I16x16,
-            definition: Named("llvm.x86.avx2.pmadd.ub.sw")
-        },
-        "_mm_mask_i32gather_epi32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 5] = [&::I32x4, { static PTR: Type = Type::Pointer(&::I32, Some(&::I8), true); &PTR }, &::I32x4, &::I32x4, &::I32_8]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.x86.avx2.gather.d.d")
-        },
-        "_mm_mask_i32gather_ps" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 5] = [&::F32x4, { static PTR: Type = Type::Pointer(&::F32, Some(&::I8), true); &PTR }, &::I32x4, &::I32x4_F32, &::I32_8]; &INPUTS },
-            output: &::F32x4,
-            definition: Named("llvm.x86.avx2.gather.d.ps")
-        },
-        "_mm256_mask_i32gather_epi32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 5] = [&::I32x8, { static PTR: Type = Type::Pointer(&::I32, Some(&::I8), true); &PTR }, &::I32x8, &::I32x8, &::I32_8]; &INPUTS },
-            output: &::I32x8,
-            definition: Named("llvm.x86.avx2.gather.d.d.256")
-        },
-        "_mm256_mask_i32gather_ps" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 5] = [&::F32x8, { static PTR: Type = Type::Pointer(&::F32, Some(&::I8), true); &PTR }, &::I32x8, &::I32x8_F32, &::I32_8]; &INPUTS },
-            output: &::F32x8,
-            definition: Named("llvm.x86.avx2.gather.d.ps.256")
-        },
-        "_mm_mask_i32gather_epi64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 5] = [&::I64x2, { static PTR: Type = Type::Pointer(&::I64, Some(&::I8), true); &PTR }, &::I32x4, &::I64x2, &::I32_8]; &INPUTS },
-            output: &::I64x2,
-            definition: Named("llvm.x86.avx2.gather.d.q")
-        },
-        "_mm_mask_i32gather_pd" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 5] = [&::F64x2, { static PTR: Type = Type::Pointer(&::F64, Some(&::I8), true); &PTR }, &::I32x4, &::I64x2_F64, &::I32_8]; &INPUTS },
-            output: &::F64x2,
-            definition: Named("llvm.x86.avx2.gather.d.pd")
-        },
-        "_mm256_mask_i32gather_epi64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 5] = [&::I64x4, { static PTR: Type = Type::Pointer(&::I64, Some(&::I8), true); &PTR }, &::I32x4, &::I64x4, &::I32_8]; &INPUTS },
-            output: &::I64x4,
-            definition: Named("llvm.x86.avx2.gather.d.q.256")
-        },
-        "_mm256_mask_i32gather_pd" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 5] = [&::F64x4, { static PTR: Type = Type::Pointer(&::F64, Some(&::I8), true); &PTR }, &::I32x4, &::I64x4_F64, &::I32_8]; &INPUTS },
-            output: &::F64x4,
-            definition: Named("llvm.x86.avx2.gather.d.pd.256")
-        },
-        "_mm_mask_i64gather_epi32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 5] = [&::I32x4, { static PTR: Type = Type::Pointer(&::I32, Some(&::I8), true); &PTR }, &::I64x2, &::I32x4, &::I32_8]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.x86.avx2.gather.q.d")
-        },
-        "_mm_mask_i64gather_ps" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 5] = [&::F32x4, { static PTR: Type = Type::Pointer(&::F32, Some(&::I8), true); &PTR }, &::I64x2, &::I32x4_F32, &::I32_8]; &INPUTS },
-            output: &::F32x4,
-            definition: Named("llvm.x86.avx2.gather.q.ps")
-        },
-        "_mm256_mask_i64gather_epi32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 5] = [&::I32x4, { static PTR: Type = Type::Pointer(&::I32, Some(&::I8), true); &PTR }, &::I64x4, &::I32x4, &::I32_8]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.x86.avx2.gather.q.d")
-        },
-        "_mm256_mask_i64gather_ps" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 5] = [&::F32x4, { static PTR: Type = Type::Pointer(&::F32, Some(&::I8), true); &PTR }, &::I64x4, &::I32x4_F32, &::I32_8]; &INPUTS },
-            output: &::F32x4,
-            definition: Named("llvm.x86.avx2.gather.q.ps")
-        },
-        "_mm_mask_i64gather_epi64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 5] = [&::I64x2, { static PTR: Type = Type::Pointer(&::I64, Some(&::I8), true); &PTR }, &::I64x2, &::I64x2, &::I32_8]; &INPUTS },
-            output: &::I64x2,
-            definition: Named("llvm.x86.avx2.gather.q.q")
-        },
-        "_mm_mask_i64gather_pd" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 5] = [&::F64x2, { static PTR: Type = Type::Pointer(&::F64, Some(&::I8), true); &PTR }, &::I64x2, &::I64x2_F64, &::I32_8]; &INPUTS },
-            output: &::F64x2,
-            definition: Named("llvm.x86.avx2.gather.q.pd")
-        },
-        "_mm256_mask_i64gather_epi64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 5] = [&::I64x4, { static PTR: Type = Type::Pointer(&::I64, Some(&::I8), true); &PTR }, &::I64x4, &::I64x4, &::I32_8]; &INPUTS },
-            output: &::I64x4,
-            definition: Named("llvm.x86.avx2.gather.q.q.256")
-        },
-        "_mm256_mask_i64gather_pd" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 5] = [&::F64x4, { static PTR: Type = Type::Pointer(&::F64, Some(&::I8), true); &PTR }, &::I64x4, &::I64x4_F64, &::I32_8]; &INPUTS },
-            output: &::F64x4,
-            definition: Named("llvm.x86.avx2.gather.q.pd.256")
-        },
-        "_mm_maskload_epi32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [{ static PTR: Type = Type::Pointer(&::I32x4, Some(&::I8), true); &PTR }, &::I32x4]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.x86.avx2.maskload.d")
-        },
-        "_mm_maskload_epi64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [{ static PTR: Type = Type::Pointer(&::I64x2, Some(&::I8), true); &PTR }, &::I64x2]; &INPUTS },
-            output: &::I64x2,
-            definition: Named("llvm.x86.avx2.maskload.q")
-        },
-        "_mm256_maskload_epi32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [{ static PTR: Type = Type::Pointer(&::I32x8, Some(&::I8), true); &PTR }, &::I32x8]; &INPUTS },
-            output: &::I32x8,
-            definition: Named("llvm.x86.avx2.maskload.d.256")
-        },
-        "_mm256_maskload_epi64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [{ static PTR: Type = Type::Pointer(&::I64x4, Some(&::I8), true); &PTR }, &::I64x4]; &INPUTS },
-            output: &::I64x4,
-            definition: Named("llvm.x86.avx2.maskload.q.256")
-        },
-        "_mm_maskstore_epi32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [{ static PTR: Type = Type::Pointer(&::I32, Some(&::I8), false); &PTR }, &::I32x4, &::I32x4]; &INPUTS },
-            output: &::VOID,
-            definition: Named("llvm.x86.avx2.maskstore.d")
-        },
-        "_mm_maskstore_epi64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [{ static PTR: Type = Type::Pointer(&::I64, Some(&::I8), false); &PTR }, &::I64x2, &::I64x2]; &INPUTS },
-            output: &::VOID,
-            definition: Named("llvm.x86.avx2.maskstore.q")
-        },
-        "_mm256_maskstore_epi32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [{ static PTR: Type = Type::Pointer(&::I32, Some(&::I8), false); &PTR }, &::I32x8, &::I32x8]; &INPUTS },
-            output: &::VOID,
-            definition: Named("llvm.x86.avx2.maskstore.d.256")
-        },
-        "_mm256_maskstore_epi64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [{ static PTR: Type = Type::Pointer(&::I64, Some(&::I8), false); &PTR }, &::I64x4, &::I64x4]; &INPUTS },
-            output: &::VOID,
-            definition: Named("llvm.x86.avx2.maskstore.q.256")
-        },
-        "_mm256_max_epi8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x32, &::I8x32]; &INPUTS },
-            output: &::I8x32,
-            definition: Named("llvm.x86.avx2.pmaxs.b")
-        },
-        "_mm256_max_epu8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x32, &::U8x32]; &INPUTS },
-            output: &::U8x32,
-            definition: Named("llvm.x86.avx2.pmaxu.b")
-        },
-        "_mm256_max_epi16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x16, &::I16x16]; &INPUTS },
-            output: &::I16x16,
-            definition: Named("llvm.x86.avx2.pmaxs.w")
-        },
-        "_mm256_max_epu16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x16, &::U16x16]; &INPUTS },
-            output: &::U16x16,
-            definition: Named("llvm.x86.avx2.pmaxu.w")
-        },
-        "_mm256_max_epi32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x8, &::I32x8]; &INPUTS },
-            output: &::I32x8,
-            definition: Named("llvm.x86.avx2.pmaxs.d")
-        },
-        "_mm256_max_epu32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x8, &::U32x8]; &INPUTS },
-            output: &::U32x8,
-            definition: Named("llvm.x86.avx2.pmaxu.d")
-        },
-        "_mm256_min_epi8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x32, &::I8x32]; &INPUTS },
-            output: &::I8x32,
-            definition: Named("llvm.x86.avx2.pmins.b")
-        },
-        "_mm256_min_epu8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x32, &::U8x32]; &INPUTS },
-            output: &::U8x32,
-            definition: Named("llvm.x86.avx2.pminu.b")
-        },
-        "_mm256_min_epi16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x16, &::I16x16]; &INPUTS },
-            output: &::I16x16,
-            definition: Named("llvm.x86.avx2.pmins.w")
-        },
-        "_mm256_min_epu16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x16, &::U16x16]; &INPUTS },
-            output: &::U16x16,
-            definition: Named("llvm.x86.avx2.pminu.w")
-        },
-        "_mm256_min_epi32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x8, &::I32x8]; &INPUTS },
-            output: &::I32x8,
-            definition: Named("llvm.x86.avx2.pmins.d")
-        },
-        "_mm256_min_epu32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x8, &::U32x8]; &INPUTS },
-            output: &::U32x8,
-            definition: Named("llvm.x86.avx2.pminu.d")
-        },
-        "_mm256_movemask_epi8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I8x32]; &INPUTS },
-            output: &::I32,
-            definition: Named("llvm.x86.avx2.pmovmskb")
-        },
-        "_mm256_mpsadbw_epu8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U8x32, &::U8x32, &::I32_8]; &INPUTS },
-            output: &::U16x16,
-            definition: Named("llvm.x86.avx2.mpsadbw")
-        },
-        "_mm256_mul_epi64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x8, &::I32x8]; &INPUTS },
-            output: &::I64x4,
-            definition: Named("llvm.x86.avx2.pmulq.dq")
-        },
-        "_mm256_mul_epu64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x8, &::U32x8]; &INPUTS },
-            output: &::U64x4,
-            definition: Named("llvm.x86.avx2.pmulq.dq")
-        },
-        "_mm256_mulhi_epi16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x16, &::I16x16]; &INPUTS },
-            output: &::I16x16,
-            definition: Named("llvm.x86.avx2.pmulhw.w")
-        },
-        "_mm256_mulhi_epu16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x16, &::U16x16]; &INPUTS },
-            output: &::U16x16,
-            definition: Named("llvm.x86.avx2.pmulhw.w")
-        },
-        "_mm256_mulhrs_epi16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x16, &::I16x16]; &INPUTS },
-            output: &::I16x16,
-            definition: Named("llvm.x86.avx2.pmul.hr.sw")
-        },
-        "_mm256_packs_epi16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x16, &::I16x16]; &INPUTS },
-            output: &::I8x32,
-            definition: Named("llvm.x86.avx2.packsswb")
-        },
-        "_mm256_packus_epi16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x16, &::I16x16]; &INPUTS },
-            output: &::U8x32,
-            definition: Named("llvm.x86.avx2.packuswb")
-        },
-        "_mm256_packs_epi32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x8, &::I32x8]; &INPUTS },
-            output: &::I16x16,
-            definition: Named("llvm.x86.avx2.packssdw")
-        },
-        "_mm256_packus_epi32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x8, &::I32x8]; &INPUTS },
-            output: &::U16x16,
-            definition: Named("llvm.x86.avx2.packusdw")
-        },
-        "_mm256_permutevar8x32_epi32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x8, &::I32x8]; &INPUTS },
-            output: &::I32x8,
-            definition: Named("llvm.x86.avx2.permd")
-        },
-        "_mm256_permutevar8x32_ps" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F32x8, &::I32x8]; &INPUTS },
-            output: &::F32x8,
-            definition: Named("llvm.x86.avx2.permps")
-        },
-        "_mm256_sad_epu8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x32, &::U8x32]; &INPUTS },
-            output: &::U64x4,
-            definition: Named("llvm.x86.avx2.psad.bw")
-        },
-        "_mm256_shuffle_epi8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x32, &::I8x32]; &INPUTS },
-            output: &::I8x32,
-            definition: Named("llvm.x86.avx2.pshuf.b")
-        },
-        "_mm256_sign_epi8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x32, &::I8x32]; &INPUTS },
-            output: &::I8x32,
-            definition: Named("llvm.x86.avx2.psign.b")
-        },
-        "_mm256_sign_epi16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x16, &::I16x16]; &INPUTS },
-            output: &::I16x16,
-            definition: Named("llvm.x86.avx2.psign.w")
-        },
-        "_mm256_sign_epi32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x8, &::I32x8]; &INPUTS },
-            output: &::I32x8,
-            definition: Named("llvm.x86.avx2.psign.d")
-        },
-        "_mm256_subs_epi8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x32, &::I8x32]; &INPUTS },
-            output: &::I8x32,
-            definition: Named("llvm.x86.avx2.psubs.b")
-        },
-        "_mm256_subs_epu8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x32, &::U8x32]; &INPUTS },
-            output: &::U8x32,
-            definition: Named("llvm.x86.avx2.psubus.b")
-        },
-        "_mm256_subs_epi16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x16, &::I16x16]; &INPUTS },
-            output: &::I16x16,
-            definition: Named("llvm.x86.avx2.psubs.w")
-        },
-        "_mm256_subs_epu16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x16, &::U16x16]; &INPUTS },
-            output: &::U16x16,
-            definition: Named("llvm.x86.avx2.psubus.w")
-        },
-        "_mm256_addsub_ps" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F32x8, &::F32x8]; &INPUTS },
-            output: &::F32x8,
-            definition: Named("llvm.x86.avx.addsub.ps.256")
-        },
-        "_mm256_addsub_pd" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F64x4, &::F64x4]; &INPUTS },
-            output: &::F64x4,
-            definition: Named("llvm.x86.avx.addsub.pd.256")
-        },
-        "_mm256_blendv_ps" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::F32x8, &::F32x8, &::F32x8]; &INPUTS },
-            output: &::F32x8,
-            definition: Named("llvm.x86.avx.blendv.ps.256")
-        },
-        "_mm256_blendv_pd" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::F64x4, &::F64x4, &::F64x4]; &INPUTS },
-            output: &::F64x4,
-            definition: Named("llvm.x86.avx.blendv.pd.256")
-        },
-        "_mm256_broadcast_ps" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::I8, None, true); &PTR }]; &INPUTS },
-            output: &::F32x8,
-            definition: Named("llvm.x86.avx.vbroadcastf128.ps.256")
-        },
-        "_mm256_broadcast_pd" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::I8, None, true); &PTR }]; &INPUTS },
-            output: &::F64x4,
-            definition: Named("llvm.x86.avx.vbroadcastf128.pd.256")
-        },
-        "_mm256_cmp_ps" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::F32x8, &::F32x8, &::I8]; &INPUTS },
-            output: &::F32x8,
-            definition: Named("llvm.x86.avx.cmp.ps.256")
-        },
-        "_mm256_cmp_pd" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::F64x4, &::F64x4, &::I8]; &INPUTS },
-            output: &::F64x4,
-            definition: Named("llvm.x86.avx.cmp.pd.256")
-        },
-        "_mm256_cvtepi32_pd" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I32x4]; &INPUTS },
-            output: &::F64x4,
-            definition: Named("llvm.x86.avx.cvtdq2.pd.256")
-        },
-        "_mm256_cvtepi32_ps" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I32x8]; &INPUTS },
-            output: &::F32x8,
-            definition: Named("llvm.x86.avx.cvtdq2.ps.256")
-        },
-        "_mm256_cvtpd_epi32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::F64x4]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.x86.avx.cvt.pd2dq.256")
-        },
-        "_mm256_cvtpd_ps" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::F64x4]; &INPUTS },
-            output: &::F32x4,
-            definition: Named("llvm.x86.avx.cvt.pd2.ps.256")
-        },
-        "_mm256_cvtps_epi32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::F32x8]; &INPUTS },
-            output: &::I32x8,
-            definition: Named("llvm.x86.avx.cvt.ps2dq.256")
-        },
-        "_mm256_cvtps_pd" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::F32x4]; &INPUTS },
-            output: &::F64x4,
-            definition: Named("llvm.x86.avx.cvt.ps2.pd.256")
-        },
-        "_mm256_cvttpd_epi32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::F64x4]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.x86.avx.cvtt.pd2dq.256")
-        },
-        "_mm256_cvttps_epi32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::F32x8]; &INPUTS },
-            output: &::I32x8,
-            definition: Named("llvm.x86.avx.cvtt.ps2dq.256")
-        },
-        "_mm256_dp_ps" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::F32x8, &::F32x8, &::I32_8]; &INPUTS },
-            output: &::F32x8,
-            definition: Named("llvm.x86.avx.dp.ps.256")
-        },
-        "_mm256_hadd_ps" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F32x8, &::F32x8]; &INPUTS },
-            output: &::F32x8,
-            definition: Named("llvm.x86.avx.hadd.ps.256")
-        },
-        "_mm256_hadd_pd" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F64x4, &::F64x4]; &INPUTS },
-            output: &::F64x4,
-            definition: Named("llvm.x86.avx.hadd.pd.256")
-        },
-        "_mm256_hsub_ps" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F32x8, &::F32x8]; &INPUTS },
-            output: &::F32x8,
-            definition: Named("llvm.x86.avx.hsub.ps.256")
-        },
-        "_mm256_hsub_pd" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F64x4, &::F64x4]; &INPUTS },
-            output: &::F64x4,
-            definition: Named("llvm.x86.avx.hsub.pd.256")
-        },
-        "_mm256_max_ps" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F32x8, &::F32x8]; &INPUTS },
-            output: &::F32x8,
-            definition: Named("llvm.x86.avx.max.ps.256")
-        },
-        "_mm256_max_pd" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F64x4, &::F64x4]; &INPUTS },
-            output: &::F64x4,
-            definition: Named("llvm.x86.avx.max.pd.256")
-        },
-        "_mm_maskload_ps" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [{ static PTR: Type = Type::Pointer(&::F32, Some(&::I8), true); &PTR }, &::I32x4_F32]; &INPUTS },
-            output: &::F32x4,
-            definition: Named("llvm.x86.avx.maskload.ps")
-        },
-        "_mm_maskload_pd" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [{ static PTR: Type = Type::Pointer(&::F64, Some(&::I8), true); &PTR }, &::I64x2_F64]; &INPUTS },
-            output: &::F64x2,
-            definition: Named("llvm.x86.avx.maskload.pd")
-        },
-        "_mm256_maskload_ps" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [{ static PTR: Type = Type::Pointer(&::F32, Some(&::I8), true); &PTR }, &::I32x8_F32]; &INPUTS },
-            output: &::F32x8,
-            definition: Named("llvm.x86.avx.maskload.ps.256")
-        },
-        "_mm256_maskload_pd" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [{ static PTR: Type = Type::Pointer(&::F64, Some(&::I8), true); &PTR }, &::I64x4_F64]; &INPUTS },
-            output: &::F64x4,
-            definition: Named("llvm.x86.avx.maskload.pd.256")
-        },
-        "_mm_maskstore_ps" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [{ static PTR: Type = Type::Pointer(&::F32, Some(&::I8), false); &PTR }, &::I32x4_F32, &::F32x4]; &INPUTS },
-            output: &::VOID,
-            definition: Named("llvm.x86.avx.maskstore.ps")
-        },
-        "_mm_maskstore_pd" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [{ static PTR: Type = Type::Pointer(&::F64, Some(&::I8), false); &PTR }, &::I64x2_F64, &::F64x2]; &INPUTS },
-            output: &::VOID,
-            definition: Named("llvm.x86.avx.maskstore.pd")
-        },
-        "_mm256_maskstore_ps" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [{ static PTR: Type = Type::Pointer(&::F32, Some(&::I8), false); &PTR }, &::I32x8_F32, &::F32x8]; &INPUTS },
-            output: &::VOID,
-            definition: Named("llvm.x86.avx.maskstore.ps.256")
-        },
-        "_mm256_maskstore_pd" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [{ static PTR: Type = Type::Pointer(&::F64, Some(&::I8), false); &PTR }, &::I64x4_F64, &::F64x4]; &INPUTS },
-            output: &::VOID,
-            definition: Named("llvm.x86.avx.maskstore.pd.256")
-        },
-        "_mm256_min_ps" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F32x8, &::F32x8]; &INPUTS },
-            output: &::F32x8,
-            definition: Named("llvm.x86.avx.min.ps.256")
-        },
-        "_mm256_min_pd" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F64x4, &::F64x4]; &INPUTS },
-            output: &::F64x4,
-            definition: Named("llvm.x86.avx.min.pd.256")
-        },
-        "_mm256_movemask_ps" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::F32x8]; &INPUTS },
-            output: &::I32,
-            definition: Named("llvm.x86.avx.movmsk.ps.256")
-        },
-        "_mm256_movemask_pd" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::F64x4]; &INPUTS },
-            output: &::I32,
-            definition: Named("llvm.x86.avx.movmsk.pd.256")
-        },
-        "_mm_permutevar_ps" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F32x4, &::I32x4]; &INPUTS },
-            output: &::F32x4,
-            definition: Named("llvm.x86.avx.vpermilvar.ps")
-        },
-        "_mm_permutevar_pd" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F64x2, &::I64x2]; &INPUTS },
-            output: &::F64x2,
-            definition: Named("llvm.x86.avx.vpermilvar.pd")
-        },
-        "_mm256_permutevar_ps" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F32x8, &::I32x8]; &INPUTS },
-            output: &::F32x8,
-            definition: Named("llvm.x86.avx.vpermilvar.ps.256")
-        },
-        "_mm256_permutevar_pd" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F64x4, &::I64x4]; &INPUTS },
-            output: &::F64x4,
-            definition: Named("llvm.x86.avx.vpermilvar.pd.256")
-        },
-        "_mm256_rcp_ps" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::F32x8]; &INPUTS },
-            output: &::F32x8,
-            definition: Named("llvm.x86.avx.rcp.ps.256")
-        },
-        "_mm256_rsqrt_ps" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::F32x8]; &INPUTS },
-            output: &::F32x8,
-            definition: Named("llvm.x86.avx.rsqrt.ps.256")
-        },
-        "_mm256_storeu_ps" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [{ static PTR: Type = Type::Pointer(&::F32x8, Some(&::U8), false); &PTR }, &::F32x8]; &INPUTS },
-            output: &::VOID,
-            definition: Named("llvm.x86.avx.storeu.ps.256")
-        },
-        "_mm256_storeu_pd" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [{ static PTR: Type = Type::Pointer(&::F64x4, Some(&::U8), false); &PTR }, &::F64x4]; &INPUTS },
-            output: &::VOID,
-            definition: Named("llvm.x86.avx.storeu.ps.256")
-        },
-        "_mm256_storeu_si256" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [{ static PTR: Type = Type::Pointer(&::U8x32, Some(&::U8), false); &PTR }, &::U8x32]; &INPUTS },
-            output: &::VOID,
-            definition: Named("llvm.x86.avx.storeu.dq.256")
-        },
-        "_mm256_sqrt_ps" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::F32x8]; &INPUTS },
-            output: &::F32x8,
-            definition: Named("llvm.sqrt.v8f32")
-        },
-        "_mm256_sqrt_pd" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::F64x4]; &INPUTS },
-            output: &::F64x4,
-            definition: Named("llvm.sqrt.v4f64")
-        },
-        "_mm_testc_ps" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F32x4, &::F32x4]; &INPUTS },
-            output: &::I32,
-            definition: Named("llvm.x86.avx.vtestc.ps")
-        },
-        "_mm256_testc_ps" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F32x8, &::F32x8]; &INPUTS },
-            output: &::I32,
-            definition: Named("llvm.x86.avx.vtestc.ps.256")
-        },
-        "_mm_testc_pd" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F64x2, &::F64x2]; &INPUTS },
-            output: &::I32,
-            definition: Named("llvm.x86.avx.vtestc.pd")
-        },
-        "_mm256_testc_pd" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F64x4, &::F64x4]; &INPUTS },
-            output: &::I32,
-            definition: Named("llvm.x86.avx.vtestc.pd.256")
-        },
-        "_mm256_testc_si256" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U64x4, &::U64x4]; &INPUTS },
-            output: &::I32,
-            definition: Named("llvm.x86.avx.ptestc.256")
-        },
-        "_mm_testnzc_ps" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F32x4, &::F32x4]; &INPUTS },
-            output: &::I32,
-            definition: Named("llvm.x86.avx.vtestnzc.ps")
-        },
-        "_mm256_testnzc_ps" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F32x8, &::F32x8]; &INPUTS },
-            output: &::I32,
-            definition: Named("llvm.x86.avx.vtestnzc.ps.256")
-        },
-        "_mm_testnzc_pd" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F64x2, &::F64x2]; &INPUTS },
-            output: &::I32,
-            definition: Named("llvm.x86.avx.vtestnzc.pd")
-        },
-        "_mm256_testnzc_pd" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F64x4, &::F64x4]; &INPUTS },
-            output: &::I32,
-            definition: Named("llvm.x86.avx.vtestnzc.pd.256")
-        },
-        "_mm256_testnzc_si256" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U64x4, &::U64x4]; &INPUTS },
-            output: &::I32,
-            definition: Named("llvm.x86.avx.ptestnzc.256")
-        },
-        "_mm_testz_ps" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F32x4, &::F32x4]; &INPUTS },
-            output: &::I32,
-            definition: Named("llvm.x86.avx.vtestz.ps")
-        },
-        "_mm256_testz_ps" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F32x8, &::F32x8]; &INPUTS },
-            output: &::I32,
-            definition: Named("llvm.x86.avx.vtestz.ps.256")
-        },
-        "_mm_testz_pd" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F64x2, &::F64x2]; &INPUTS },
-            output: &::I32,
-            definition: Named("llvm.x86.avx.vtestz.pd")
-        },
-        "_mm256_testz_pd" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F64x4, &::F64x4]; &INPUTS },
-            output: &::I32,
-            definition: Named("llvm.x86.avx.vtestz.pd.256")
-        },
-        "_mm256_testz_si256" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U64x4, &::U64x4]; &INPUTS },
-            output: &::I32,
-            definition: Named("llvm.x86.avx.ptestz.256")
-        },
-        "_mm256_zeroall" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 0] = []; &INPUTS },
-            output: &::VOID,
-            definition: Named("llvm.x86.avx.vzeroall")
-        },
-        "_mm256_zeroupper" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 0] = []; &INPUTS },
-            output: &::VOID,
-            definition: Named("llvm.x86.avx.vzeroupper")
-        },
-        "_bmi2_bzhi_32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32, &::U32]; &INPUTS },
-            output: &::U32,
-            definition: Named("llvm.x86.bmi.bzhi.32")
-        },
-        "_bmi2_bzhi_64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U64, &::U64]; &INPUTS },
-            output: &::U64,
-            definition: Named("llvm.x86.bmi.bzhi.64")
-        },
-        "_bmi2_pdep_32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32, &::U32]; &INPUTS },
-            output: &::U32,
-            definition: Named("llvm.x86.bmi.pdep.32")
-        },
-        "_bmi2_pdep_64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U64, &::U64]; &INPUTS },
-            output: &::U64,
-            definition: Named("llvm.x86.bmi.pdep.64")
-        },
-        "_bmi2_pext_32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32, &::U32]; &INPUTS },
-            output: &::U32,
-            definition: Named("llvm.x86.bmi.pext.32")
-        },
-        "_bmi2_pext_64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U64, &::U64]; &INPUTS },
-            output: &::U64,
-            definition: Named("llvm.x86.bmi.pext.64")
-        },
-        "_bmi_bextr_32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32, &::U32]; &INPUTS },
-            output: &::U32,
-            definition: Named("llvm.x86.bmi.bextr.32")
-        },
-        "_bmi_bextr_64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U64, &::U64]; &INPUTS },
-            output: &::U64,
-            definition: Named("llvm.x86.bmi.bextr.64")
-        },
-        "_mm_fmadd_ps" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::F32x4, &::F32x4, &::F32x4]; &INPUTS },
-            output: &::F32x4,
-            definition: Named("llvm.x86.fma.vfmadd.ps")
-        },
-        "_mm_fmadd_pd" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::F64x2, &::F64x2, &::F64x2]; &INPUTS },
-            output: &::F64x2,
-            definition: Named("llvm.x86.fma.vfmadd.pd")
-        },
-        "_mm256_fmadd_ps" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::F32x8, &::F32x8, &::F32x8]; &INPUTS },
-            output: &::F32x8,
-            definition: Named("llvm.x86.fma.vfmadd.ps.256")
-        },
-        "_mm256_fmadd_pd" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::F64x4, &::F64x4, &::F64x4]; &INPUTS },
-            output: &::F64x4,
-            definition: Named("llvm.x86.fma.vfmadd.pd.256")
-        },
-        "_mm_fmaddsub_ps" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::F32x4, &::F32x4, &::F32x4]; &INPUTS },
-            output: &::F32x4,
-            definition: Named("llvm.x86.fma.vfmaddsub.ps")
-        },
-        "_mm_fmaddsub_pd" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::F64x2, &::F64x2, &::F64x2]; &INPUTS },
-            output: &::F64x2,
-            definition: Named("llvm.x86.fma.vfmaddsub.pd")
-        },
-        "_mm256_fmaddsub_ps" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::F32x8, &::F32x8, &::F32x8]; &INPUTS },
-            output: &::F32x8,
-            definition: Named("llvm.x86.fma.vfmaddsub.ps.256")
-        },
-        "_mm256_fmaddsub_pd" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::F64x4, &::F64x4, &::F64x4]; &INPUTS },
-            output: &::F64x4,
-            definition: Named("llvm.x86.fma.vfmaddsub.pd.256")
-        },
-        "_mm_fmsub_ps" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::F32x4, &::F32x4, &::F32x4]; &INPUTS },
-            output: &::F32x4,
-            definition: Named("llvm.x86.fma.vfmsub.ps")
-        },
-        "_mm_fmsub_pd" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::F64x2, &::F64x2, &::F64x2]; &INPUTS },
-            output: &::F64x2,
-            definition: Named("llvm.x86.fma.vfmsub.pd")
-        },
-        "_mm256_fmsub_ps" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::F32x8, &::F32x8, &::F32x8]; &INPUTS },
-            output: &::F32x8,
-            definition: Named("llvm.x86.fma.vfmsub.ps.256")
-        },
-        "_mm256_fmsub_pd" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::F64x4, &::F64x4, &::F64x4]; &INPUTS },
-            output: &::F64x4,
-            definition: Named("llvm.x86.fma.vfmsub.pd.256")
-        },
-        "_mm_fmsubadd_ps" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::F32x4, &::F32x4, &::F32x4]; &INPUTS },
-            output: &::F32x4,
-            definition: Named("llvm.x86.fma.vfmsubadd.ps")
-        },
-        "_mm_fmsubadd_pd" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::F64x2, &::F64x2, &::F64x2]; &INPUTS },
-            output: &::F64x2,
-            definition: Named("llvm.x86.fma.vfmsubadd.pd")
-        },
-        "_mm256_fmsubadd_ps" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::F32x8, &::F32x8, &::F32x8]; &INPUTS },
-            output: &::F32x8,
-            definition: Named("llvm.x86.fma.vfmsubadd.ps.256")
-        },
-        "_mm256_fmsubadd_pd" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::F64x4, &::F64x4, &::F64x4]; &INPUTS },
-            output: &::F64x4,
-            definition: Named("llvm.x86.fma.vfmsubadd.pd.256")
-        },
-        "_mm_fnmadd_ps" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::F32x4, &::F32x4, &::F32x4]; &INPUTS },
-            output: &::F32x4,
-            definition: Named("llvm.x86.fma.vfnmadd.ps")
-        },
-        "_mm_fnmadd_pd" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::F64x2, &::F64x2, &::F64x2]; &INPUTS },
-            output: &::F64x2,
-            definition: Named("llvm.x86.fma.vfnmadd.pd")
-        },
-        "_mm256_fnmadd_ps" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::F32x8, &::F32x8, &::F32x8]; &INPUTS },
-            output: &::F32x8,
-            definition: Named("llvm.x86.fma.vfnmadd.ps.256")
-        },
-        "_mm256_fnmadd_pd" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::F64x4, &::F64x4, &::F64x4]; &INPUTS },
-            output: &::F64x4,
-            definition: Named("llvm.x86.fma.vfnmadd.pd.256")
-        },
-        "_mm_fnmsub_ps" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::F32x4, &::F32x4, &::F32x4]; &INPUTS },
-            output: &::F32x4,
-            definition: Named("llvm.x86.fma.vfnmsub.ps")
-        },
-        "_mm_fnmsub_pd" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::F64x2, &::F64x2, &::F64x2]; &INPUTS },
-            output: &::F64x2,
-            definition: Named("llvm.x86.fma.vfnmsub.pd")
-        },
-        "_mm256_fnmsub_ps" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::F32x8, &::F32x8, &::F32x8]; &INPUTS },
-            output: &::F32x8,
-            definition: Named("llvm.x86.fma.vfnmsub.ps.256")
-        },
-        "_mm256_fnmsub_pd" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::F64x4, &::F64x4, &::F64x4]; &INPUTS },
-            output: &::F64x4,
-            definition: Named("llvm.x86.fma.vfnmsub.pd.256")
-        },
-        "_rdrand16_step" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 0] = []; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 2] = [&::U16, &::I32]; &PARTS }); &AGG },
-            definition: Named("llvm.x86.rdrand.16")
-        },
-        "_rdrand32_step" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 0] = []; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 2] = [&::U32, &::I32]; &PARTS }); &AGG },
-            definition: Named("llvm.x86.rdrand.32")
-        },
-        "_rdrand64_step" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 0] = []; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 2] = [&::U64, &::I32]; &PARTS }); &AGG },
-            definition: Named("llvm.x86.rdrand.64")
-        },
-        "_rdseed16_step" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 0] = []; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 2] = [&::U16, &::I32]; &PARTS }); &AGG },
-            definition: Named("llvm.x86.rdseed.16")
-        },
-        "_rdseed32_step" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 0] = []; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 2] = [&::U32, &::I32]; &PARTS }); &AGG },
-            definition: Named("llvm.x86.rdseed.32")
-        },
-        "_rdseed64_step" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 0] = []; &INPUTS },
-            output: { static AGG: Type = Type::Aggregate(false, { static PARTS: [&'static Type; 2] = [&::U64, &::I32]; &PARTS }); &AGG },
-            definition: Named("llvm.x86.rdseed.64")
-        },
-        "_mm_adds_epi8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x16, &::I8x16]; &INPUTS },
-            output: &::I8x16,
-            definition: Named("llvm.x86.sse2.padds.b")
-        },
-        "_mm_adds_epu8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x16, &::U8x16]; &INPUTS },
-            output: &::U8x16,
-            definition: Named("llvm.x86.sse2.paddus.b")
-        },
-        "_mm_adds_epi16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x8, &::I16x8]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.x86.sse2.padds.w")
-        },
-        "_mm_adds_epu16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x8, &::U16x8]; &INPUTS },
-            output: &::U16x8,
-            definition: Named("llvm.x86.sse2.paddus.w")
-        },
-        "_mm_avg_epu8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x16, &::U8x16]; &INPUTS },
-            output: &::U8x16,
-            definition: Named("llvm.x86.sse2.pavg.b")
-        },
-        "_mm_avg_epu16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x8, &::U16x8]; &INPUTS },
-            output: &::U16x8,
-            definition: Named("llvm.x86.sse2.pavg.w")
-        },
-        "_mm_lfence" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 0] = []; &INPUTS },
-            output: &::VOID,
-            definition: Named("llvm.x86.sse2.lfence")
-        },
-        "_mm_madd_epi16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x8, &::I16x8]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.x86.sse2.pmadd.wd")
-        },
-        "_mm_maskmoveu_si128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U8x16, &::U8x16, { static PTR: Type = Type::Pointer(&::U8, None, false); &PTR }]; &INPUTS },
-            output: &::VOID,
-            definition: Named("llvm.x86.sse2.maskmov.dqu")
-        },
-        "_mm_max_epi16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x8, &::I16x8]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.x86.sse2.pmaxs.w")
-        },
-        "_mm_max_epu8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x16, &::U8x16]; &INPUTS },
-            output: &::U8x16,
-            definition: Named("llvm.x86.sse2.pmaxu.b")
-        },
-        "_mm_max_pd" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F64x2, &::F64x2]; &INPUTS },
-            output: &::F64x2,
-            definition: Named("llvm.x86.sse2.max.pd")
-        },
-        "_mm_mfence" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 0] = []; &INPUTS },
-            output: &::VOID,
-            definition: Named("llvm.x86.sse2.fence")
-        },
-        "_mm_min_epi16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x8, &::I16x8]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.x86.sse2.pmins.w")
-        },
-        "_mm_min_epu8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x16, &::U8x16]; &INPUTS },
-            output: &::U8x16,
-            definition: Named("llvm.x86.sse2.pminu.b")
-        },
-        "_mm_min_pd" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F64x2, &::F64x2]; &INPUTS },
-            output: &::F64x2,
-            definition: Named("llvm.x86.sse2.min.pd")
-        },
-        "_mm_movemask_pd" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::F64x2]; &INPUTS },
-            output: &::I32,
-            definition: Named("llvm.x86.sse2.movmsk.pd")
-        },
-        "_mm_movemask_epi8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I8x16]; &INPUTS },
-            output: &::I32,
-            definition: Named("llvm.x86.sse2.pmovmskb.128")
-        },
-        "_mm_mul_epu32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x4, &::U32x4]; &INPUTS },
-            output: &::U64x2,
-            definition: Named("llvm.x86.sse2.pmulu.dq")
-        },
-        "_mm_mulhi_epi16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x8, &::I16x8]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.x86.sse2.pmulh.w")
-        },
-        "_mm_mulhi_epu16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x8, &::U16x8]; &INPUTS },
-            output: &::U16x8,
-            definition: Named("llvm.x86.sse2.pmulhu.w")
-        },
-        "_mm_packs_epi16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x8, &::I16x8]; &INPUTS },
-            output: &::I8x16,
-            definition: Named("llvm.x86.sse2.packsswb.128")
-        },
-        "_mm_packs_epi32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x4, &::I32x4]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.x86.sse2.packssdw.128")
-        },
-        "_mm_packus_epi16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x8, &::I16x8]; &INPUTS },
-            output: &::U8x16,
-            definition: Named("llvm.x86.sse2.packuswb.128")
-        },
-        "_mm_sad_epu8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x16, &::U8x16]; &INPUTS },
-            output: &::U64x2,
-            definition: Named("llvm.x86.sse2.psad.bw")
-        },
-        "_mm_sfence" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 0] = []; &INPUTS },
-            output: &::VOID,
-            definition: Named("llvm.x86.sse2.sfence")
-        },
-        "_mm_sqrt_pd" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::F64x2]; &INPUTS },
-            output: &::F64x2,
-            definition: Named("llvm.sqrt.v2f64")
-        },
-        "_mm_storeu_pd" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [{ static PTR: Type = Type::Pointer(&::F64, Some(&::U8), false); &PTR }, &::F64x2]; &INPUTS },
-            output: &::VOID,
-            definition: Named("llvm.x86.sse2.storeu.pd")
-        },
-        "_mm_storeu_si128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [{ static PTR: Type = Type::Pointer(&::U8x16, Some(&::U8), false); &PTR }, &::U8x16]; &INPUTS },
-            output: &::VOID,
-            definition: Named("llvm.x86.sse2.storeu.dq")
-        },
-        "_mm_subs_epi8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x16, &::I8x16]; &INPUTS },
-            output: &::I8x16,
-            definition: Named("llvm.x86.sse2.psubs.b")
-        },
-        "_mm_subs_epu8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x16, &::U8x16]; &INPUTS },
-            output: &::U8x16,
-            definition: Named("llvm.x86.sse2.psubus.b")
-        },
-        "_mm_subs_epi16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x8, &::I16x8]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.x86.sse2.psubs.w")
-        },
-        "_mm_subs_epu16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x8, &::U16x8]; &INPUTS },
-            output: &::U16x8,
-            definition: Named("llvm.x86.sse2.psubus.w")
-        },
-        "_mm_addsub_ps" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F32x4, &::F32x4]; &INPUTS },
-            output: &::F32x4,
-            definition: Named("llvm.x86.sse3.addsub.ps")
-        },
-        "_mm_addsub_pd" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F64x2, &::F64x2]; &INPUTS },
-            output: &::F64x2,
-            definition: Named("llvm.x86.sse3.addsub.pd")
-        },
-        "_mm_hadd_ps" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F32x4, &::F32x4]; &INPUTS },
-            output: &::F32x4,
-            definition: Named("llvm.x86.sse3.hadd.ps")
-        },
-        "_mm_hadd_pd" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F64x2, &::F64x2]; &INPUTS },
-            output: &::F64x2,
-            definition: Named("llvm.x86.sse3.hadd.pd")
-        },
-        "_mm_hsub_ps" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F32x4, &::F32x4]; &INPUTS },
-            output: &::F32x4,
-            definition: Named("llvm.x86.sse3.hsub.ps")
-        },
-        "_mm_hsub_pd" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F64x2, &::F64x2]; &INPUTS },
-            output: &::F64x2,
-            definition: Named("llvm.x86.sse3.hsub.pd")
-        },
-        "_mm_lddqu_si128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [{ static PTR: Type = Type::Pointer(&::U8x16, Some(&::I8), true); &PTR }]; &INPUTS },
-            output: &::U8x16,
-            definition: Named("llvm.x86.sse3.ldu.dq")
-        },
-        "_mm_dp_ps" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::F32x4, &::F32x4, &::I32_8]; &INPUTS },
-            output: &::F32x4,
-            definition: Named("llvm.x86.sse41.dpps")
-        },
-        "_mm_dp_pd" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::F64x2, &::F64x2, &::I32_8]; &INPUTS },
-            output: &::F64x2,
-            definition: Named("llvm.x86.sse41.dppd")
-        },
-        "_mm_max_epi8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x16, &::I8x16]; &INPUTS },
-            output: &::I8x16,
-            definition: Named("llvm.x86.sse41.pmaxsb")
-        },
-        "_mm_max_epu16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x8, &::U16x8]; &INPUTS },
-            output: &::U16x8,
-            definition: Named("llvm.x86.sse41.pmaxuw")
-        },
-        "_mm_max_epi32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x4, &::I32x4]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.x86.sse41.pmaxsd")
-        },
-        "_mm_max_epu32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x4, &::U32x4]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.x86.sse41.pmaxud")
-        },
-        "_mm_min_epi8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x16, &::I8x16]; &INPUTS },
-            output: &::I8x16,
-            definition: Named("llvm.x86.sse41.pminsb")
-        },
-        "_mm_min_epu16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U16x8, &::U16x8]; &INPUTS },
-            output: &::U16x8,
-            definition: Named("llvm.x86.sse41.pminuw")
-        },
-        "_mm_min_epi32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x4, &::I32x4]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.x86.sse41.pminsd")
-        },
-        "_mm_min_epu32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32x4, &::U32x4]; &INPUTS },
-            output: &::U32x4,
-            definition: Named("llvm.x86.sse41.pminud")
-        },
-        "_mm_minpos_epu16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::U16x8]; &INPUTS },
-            output: &::U16x8,
-            definition: Named("llvm.x86.sse41.phminposuw")
-        },
-        "_mm_mpsadbw_epu8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::U8x16, &::U8x16, &::I32_8]; &INPUTS },
-            output: &::U16x8,
-            definition: Named("llvm.x86.sse41.mpsadbw")
-        },
-        "_mm_mul_epi32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x4, &::I32x4]; &INPUTS },
-            output: &::I64x2,
-            definition: Named("llvm.x86.sse41.pmuldq")
-        },
-        "_mm_packus_epi32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x4, &::I32x4]; &INPUTS },
-            output: &::U16x8,
-            definition: Named("llvm.x86.sse41.packusdw")
-        },
-        "_mm_testc_si128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U64x2, &::U64x2]; &INPUTS },
-            output: &::I32,
-            definition: Named("llvm.x86.sse41.ptestc")
-        },
-        "_mm_testnzc_si128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U64x2, &::U64x2]; &INPUTS },
-            output: &::I32,
-            definition: Named("llvm.x86.sse41.ptestnzc")
-        },
-        "_mm_testz_si128" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U64x2, &::U64x2]; &INPUTS },
-            output: &::I32,
-            definition: Named("llvm.x86.sse41.ptestz")
-        },
-        "_mm_cmpestra" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 5] = [&::I8x16, &::I32, &::I8x16, &::I32, &::I32_8]; &INPUTS },
-            output: &::I32,
-            definition: Named("llvm.x86.sse42.pcmpestria128")
-        },
-        "_mm_cmpestrc" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 5] = [&::I8x16, &::I32, &::I8x16, &::I32, &::I32_8]; &INPUTS },
-            output: &::I32,
-            definition: Named("llvm.x86.sse42.pcmpestric128")
-        },
-        "_mm_cmpestri" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 5] = [&::I8x16, &::I32, &::I8x16, &::I32, &::I32_8]; &INPUTS },
-            output: &::I32,
-            definition: Named("llvm.x86.sse42.pcmpestri128")
-        },
-        "_mm_cmpestrm" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 5] = [&::I8x16, &::I32, &::I8x16, &::I32, &::I32_8]; &INPUTS },
-            output: &::I8x16,
-            definition: Named("llvm.x86.sse42.pcmpestrm128")
-        },
-        "_mm_cmpestro" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 5] = [&::I8x16, &::I32, &::I8x16, &::I32, &::I32_8]; &INPUTS },
-            output: &::I32,
-            definition: Named("llvm.x86.sse42.pcmpestrio128")
-        },
-        "_mm_cmpestrs" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 5] = [&::I8x16, &::I32, &::I8x16, &::I32, &::I32_8]; &INPUTS },
-            output: &::I32,
-            definition: Named("llvm.x86.sse42.pcmpestris128")
-        },
-        "_mm_cmpestrz" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 5] = [&::I8x16, &::I32, &::I8x16, &::I32, &::I32_8]; &INPUTS },
-            output: &::I32,
-            definition: Named("llvm.x86.sse42.pcmpestriz128")
-        },
-        "_mm_cmpistra" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I8x16, &::I8x16, &::I32_8]; &INPUTS },
-            output: &::I32,
-            definition: Named("llvm.x86.sse42.pcmpistria128")
-        },
-        "_mm_cmpistrc" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I8x16, &::I8x16, &::I32_8]; &INPUTS },
-            output: &::I32,
-            definition: Named("llvm.x86.sse42.pcmpistric128")
-        },
-        "_mm_cmpistri" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I8x16, &::I8x16, &::I32_8]; &INPUTS },
-            output: &::I32,
-            definition: Named("llvm.x86.sse42.pcmpistri128")
-        },
-        "_mm_cmpistrm" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I8x16, &::I8x16, &::I32_8]; &INPUTS },
-            output: &::I8x16,
-            definition: Named("llvm.x86.sse42.pcmpistrm128")
-        },
-        "_mm_cmpistro" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I8x16, &::I8x16, &::I32_8]; &INPUTS },
-            output: &::I32,
-            definition: Named("llvm.x86.sse42.pcmpistrio128")
-        },
-        "_mm_cmpistrs" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I8x16, &::I8x16, &::I32_8]; &INPUTS },
-            output: &::I32,
-            definition: Named("llvm.x86.sse42.pcmpistris128")
-        },
-        "_mm_cmpistrz" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 3] = [&::I8x16, &::I8x16, &::I32_8]; &INPUTS },
-            output: &::I32,
-            definition: Named("llvm.x86.sse42.pcmpistriz128")
-        },
-        "_mm_movemask_ps" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::F32x4]; &INPUTS },
-            output: &::I32,
-            definition: Named("llvm.x86.sse.movmsk.ps")
-        },
-        "_mm_max_ps" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F32x4, &::F32x4]; &INPUTS },
-            output: &::F32x4,
-            definition: Named("llvm.x86.sse.max.ps")
-        },
-        "_mm_min_ps" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::F32x4, &::F32x4]; &INPUTS },
-            output: &::F32x4,
-            definition: Named("llvm.x86.sse.min.ps")
-        },
-        "_mm_rsqrt_ps" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::F32x4]; &INPUTS },
-            output: &::F32x4,
-            definition: Named("llvm.x86.sse.rsqrt.ps")
-        },
-        "_mm_rcp_ps" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::F32x4]; &INPUTS },
-            output: &::F32x4,
-            definition: Named("llvm.x86.sse.rcp.ps")
-        },
-        "_mm_sqrt_ps" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::F32x4]; &INPUTS },
-            output: &::F32x4,
-            definition: Named("llvm.sqrt.v4f32")
-        },
-        "_mm_storeu_ps" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [{ static PTR: Type = Type::Pointer(&::F32, Some(&::I8), false); &PTR }, &::F32x4]; &INPUTS },
-            output: &::VOID,
-            definition: Named("llvm.x86.sse.storeu.ps")
-        },
-        "_mm_abs_epi8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I8x16]; &INPUTS },
-            output: &::I8x16,
-            definition: Named("llvm.x86.ssse3.pabs.b.128")
-        },
-        "_mm_abs_epi16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I16x8]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.x86.ssse3.pabs.w.128")
-        },
-        "_mm_abs_epi32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 1] = [&::I32x4]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.x86.ssse3.pabs.d.128")
-        },
-        "_mm_hadd_epi16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x8, &::I16x8]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.x86.ssse3.phadd.w.128")
-        },
-        "_mm_hadd_epi32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x4, &::I32x4]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.x86.ssse3.phadd.d.128")
-        },
-        "_mm_hadds_epi16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x8, &::I16x8]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.x86.ssse3.phadd.sw.128")
-        },
-        "_mm_hsub_epi16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x8, &::I16x8]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.x86.ssse3.phsub.w.128")
-        },
-        "_mm_hsub_epi32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x4, &::I32x4]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.x86.ssse3.phsub.d.128")
-        },
-        "_mm_hsubs_epi16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x8, &::I16x8]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.x86.ssse3.phsub.sw.128")
-        },
-        "_mm_maddubs_epi16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U8x16, &::I8x16]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.x86.ssse3.pmadd.ub.sw.128")
-        },
-        "_mm_mulhrs_epi16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x8, &::I16x8]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.x86.ssse3.pmul.hr.sw.128")
-        },
-        "_mm_shuffle_epi8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x16, &::I8x16]; &INPUTS },
-            output: &::I8x16,
-            definition: Named("llvm.x86.ssse3.pshuf.b.128")
-        },
-        "_mm_sign_epi8" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I8x16, &::I8x16]; &INPUTS },
-            output: &::I8x16,
-            definition: Named("llvm.x86.ssse3.psign.b.128")
-        },
-        "_mm_sign_epi16" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I16x8, &::I16x8]; &INPUTS },
-            output: &::I16x8,
-            definition: Named("llvm.x86.ssse3.psign.w.128")
-        },
-        "_mm_sign_epi32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::I32x4, &::I32x4]; &INPUTS },
-            output: &::I32x4,
-            definition: Named("llvm.x86.ssse3.psign.d.128")
-        },
-        "_tbm_bextri_u32" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U32, &::U32]; &INPUTS },
-            output: &::U32,
-            definition: Named("llvm.x86.tbm.bextri.u32")
-        },
-        "_tbm_bextri_u64" => Intrinsic {
-            inputs: { static INPUTS: [&'static Type; 2] = [&::U64, &::U64]; &INPUTS },
-            output: &::U64,
-            definition: Named("llvm.x86.tbm.bextri.u64")
-        },
-        _ => return None,
-    })
-}
diff --git a/src/librustc_plugin/build.rs b/src/librustc_plugin/build.rs
index eca2736..46c4526 100644
--- a/src/librustc_plugin/build.rs
+++ b/src/librustc_plugin/build.rs
@@ -2,11 +2,12 @@
 
 use syntax::ast;
 use syntax::attr;
-use errors;
 use syntax_pos::Span;
-use rustc::hir::map::Map;
 use rustc::hir::itemlikevisit::ItemLikeVisitor;
 use rustc::hir;
+use rustc::hir::def_id::{CrateNum, DefId, LOCAL_CRATE};
+use rustc::ty::TyCtxt;
+use rustc::ty::query::Providers;
 
 struct RegistrarFinder {
     registrars: Vec<(ast::NodeId, Span)> ,
@@ -30,21 +31,27 @@
 }
 
 /// Find the function marked with `#[plugin_registrar]`, if any.
-pub fn find_plugin_registrar(diagnostic: &errors::Handler,
-                             hir_map: &Map)
-                             -> Option<ast::NodeId> {
-    let krate = hir_map.krate();
+pub fn find_plugin_registrar<'tcx>(tcx: TyCtxt<'_, 'tcx, 'tcx>) -> Option<DefId> {
+    tcx.plugin_registrar_fn(LOCAL_CRATE)
+}
+
+fn plugin_registrar_fn<'tcx>(
+    tcx: TyCtxt<'_, 'tcx, 'tcx>,
+    cnum: CrateNum,
+) -> Option<DefId> {
+    assert_eq!(cnum, LOCAL_CRATE);
 
     let mut finder = RegistrarFinder { registrars: Vec::new() };
-    krate.visit_all_item_likes(&mut finder);
+    tcx.hir().krate().visit_all_item_likes(&mut finder);
 
     match finder.registrars.len() {
         0 => None,
         1 => {
             let (node_id, _) = finder.registrars.pop().unwrap();
-            Some(node_id)
+            Some(tcx.hir().local_def_id(node_id))
         },
         _ => {
+            let diagnostic = tcx.sess.diagnostic();
             let mut e = diagnostic.struct_err("multiple plugin registration functions found");
             for &(_, span) in &finder.registrars {
                 e.span_note(span, "one is here");
@@ -55,3 +62,11 @@
         }
     }
 }
+
+
+pub fn provide(providers: &mut Providers<'_>) {
+    *providers = Providers {
+        plugin_registrar_fn,
+        ..*providers
+    };
+}
diff --git a/src/librustc_plugin/load.rs b/src/librustc_plugin/load.rs
index 9e7839e..39f5804 100644
--- a/src/librustc_plugin/load.rs
+++ b/src/librustc_plugin/load.rs
@@ -50,10 +50,7 @@
 
             let plugins = match attr.meta_item_list() {
                 Some(xs) => xs,
-                None => {
-                    call_malformed_plugin_attribute(sess, attr.span);
-                    continue;
-                }
+                None => continue,
             };
 
             for plugin in plugins {
diff --git a/src/librustc_privacy/lib.rs b/src/librustc_privacy/lib.rs
index 4890369..dcbb9ff 100644
--- a/src/librustc_privacy/lib.rs
+++ b/src/librustc_privacy/lib.rs
@@ -13,7 +13,7 @@
 extern crate syntax_pos;
 extern crate rustc_data_structures;
 
-use rustc::hir::{self, Node, PatKind};
+use rustc::hir::{self, Node, PatKind, AssociatedItemKind};
 use rustc::hir::def::Def;
 use rustc::hir::def_id::{CRATE_DEF_INDEX, LOCAL_CRATE, CrateNum, DefId};
 use rustc::hir::intravisit::{self, Visitor, NestedVisitorMap};
@@ -22,12 +22,12 @@
 use rustc::middle::privacy::{AccessLevel, AccessLevels};
 use rustc::ty::{self, TyCtxt, Ty, TraitRef, TypeFoldable, GenericParamDefKind};
 use rustc::ty::fold::TypeVisitor;
-use rustc::ty::query::Providers;
+use rustc::ty::query::{Providers, queries};
 use rustc::ty::subst::Substs;
 use rustc::util::nodemap::NodeSet;
 use rustc_data_structures::fx::FxHashSet;
 use rustc_data_structures::sync::Lrc;
-use syntax::ast::{self, CRATE_NODE_ID, Ident};
+use syntax::ast::{self, DUMMY_NODE_ID, Ident};
 use syntax::attr;
 use syntax::symbol::keywords;
 use syntax_pos::Span;
@@ -548,7 +548,7 @@
                         let mut reach = self.reach(trait_item_ref.id.node_id, item_level);
                         reach.generics().predicates();
 
-                        if trait_item_ref.kind == hir::AssociatedItemKind::Type &&
+                        if trait_item_ref.kind == AssociatedItemKind::Type &&
                            !trait_item_ref.defaultness.has_value() {
                             // No type to visit.
                         } else {
@@ -782,6 +782,11 @@
         NestedVisitorMap::All(&self.tcx.hir())
     }
 
+    fn visit_mod(&mut self, _m: &'tcx hir::Mod, _s: Span, _n: ast::NodeId) {
+        // Don't visit nested modules, since we run a separate visitor walk
+        // for each module in `privacy_access_levels`
+    }
+
     fn visit_nested_body(&mut self, body: hir::BodyId) {
         let orig_tables = mem::replace(&mut self.tables, self.tcx.body_tables(body));
         let body = self.tcx.hir().body(body);
@@ -917,6 +922,11 @@
         NestedVisitorMap::All(&self.tcx.hir())
     }
 
+    fn visit_mod(&mut self, _m: &'tcx hir::Mod, _s: Span, _n: ast::NodeId) {
+        // Don't visit nested modules, since we run a separate visitor walk
+        // for each module in `privacy_access_levels`
+    }
+
     fn visit_nested_body(&mut self, body: hir::BodyId) {
         let orig_tables = mem::replace(&mut self.tables, self.tcx.body_tables(body));
         let orig_in_body = mem::replace(&mut self.in_body, true);
@@ -1333,11 +1343,11 @@
                         if self.item_is_public(&impl_item_ref.id.node_id, &impl_item_ref.vis) {
                             let impl_item = self.tcx.hir().impl_item(impl_item_ref.id);
                             match impl_item_ref.kind {
-                                hir::AssociatedItemKind::Const => {
+                                AssociatedItemKind::Const => {
                                     found_pub_static = true;
                                     intravisit::walk_impl_item(self, impl_item);
                                 }
-                                hir::AssociatedItemKind::Method { has_self: false } => {
+                                AssociatedItemKind::Method { has_self: false } => {
                                     found_pub_static = true;
                                     intravisit::walk_impl_item(self, impl_item);
                                 }
@@ -1558,6 +1568,24 @@
             in_assoc_ty: false,
         }
     }
+
+    fn check_trait_or_impl_item(&self, node_id: ast::NodeId, assoc_item_kind: AssociatedItemKind,
+                                defaultness: hir::Defaultness, vis: ty::Visibility) {
+        let mut check = self.check(node_id, vis);
+
+        let (check_ty, is_assoc_ty) = match assoc_item_kind {
+            AssociatedItemKind::Const | AssociatedItemKind::Method { .. } => (true, false),
+            AssociatedItemKind::Type => (defaultness.has_value(), true),
+            // `ty()` for existential types is the underlying type,
+            // it's not a part of interface, so we skip it.
+            AssociatedItemKind::Existential => (false, true),
+        };
+        check.in_assoc_ty = is_assoc_ty;
+        check.generics().predicates();
+        if check_ty {
+            check.ty();
+        }
+    }
 }
 
 impl<'a, 'tcx> Visitor<'tcx> for PrivateItemsInPublicInterfacesVisitor<'a, 'tcx> {
@@ -1592,16 +1620,8 @@
                 self.check(item.id, item_visibility).generics().predicates();
 
                 for trait_item_ref in trait_item_refs {
-                    let mut check = self.check(trait_item_ref.id.node_id, item_visibility);
-                    check.in_assoc_ty = trait_item_ref.kind == hir::AssociatedItemKind::Type;
-                    check.generics().predicates();
-
-                    if trait_item_ref.kind == hir::AssociatedItemKind::Type &&
-                       !trait_item_ref.defaultness.has_value() {
-                        // No type to visit.
-                    } else {
-                        check.ty();
-                    }
+                    self.check_trait_or_impl_item(trait_item_ref.id.node_id, trait_item_ref.kind,
+                                                  trait_item_ref.defaultness, item_visibility);
                 }
             }
             hir::ItemKind::TraitAlias(..) => {
@@ -1647,9 +1667,8 @@
                     } else {
                         impl_vis
                     };
-                    let mut check = self.check(impl_item.id, impl_item_vis);
-                    check.in_assoc_ty = impl_item_ref.kind == hir::AssociatedItemKind::Type;
-                    check.generics().predicates().ty();
+                    self.check_trait_or_impl_item(impl_item_ref.id.node_id, impl_item_ref.kind,
+                                                  impl_item_ref.defaultness, impl_item_vis);
                 }
             }
         }
@@ -1659,6 +1678,7 @@
 pub fn provide(providers: &mut Providers) {
     *providers = Providers {
         privacy_access_levels,
+        check_mod_privacy,
         ..*providers
     };
 }
@@ -1667,34 +1687,43 @@
     tcx.privacy_access_levels(LOCAL_CRATE)
 }
 
-fn privacy_access_levels<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
-                                   krate: CrateNum)
-                                   -> Lrc<AccessLevels> {
-    assert_eq!(krate, LOCAL_CRATE);
-
-    let krate = tcx.hir().krate();
+fn check_mod_privacy<'tcx>(tcx: TyCtxt<'_, 'tcx, 'tcx>, module_def_id: DefId) {
     let empty_tables = ty::TypeckTables::empty(None);
 
     // Check privacy of names not checked in previous compilation stages.
     let mut visitor = NamePrivacyVisitor {
         tcx,
         tables: &empty_tables,
-        current_item: CRATE_NODE_ID,
+        current_item: DUMMY_NODE_ID,
         empty_tables: &empty_tables,
     };
-    intravisit::walk_crate(&mut visitor, krate);
+    let (module, span, node_id) = tcx.hir().get_module(module_def_id);
+    intravisit::walk_mod(&mut visitor, module, node_id);
 
     // Check privacy of explicitly written types and traits as well as
     // inferred types of expressions and patterns.
     let mut visitor = TypePrivacyVisitor {
         tcx,
         tables: &empty_tables,
-        current_item: DefId::local(CRATE_DEF_INDEX),
+        current_item: module_def_id,
         in_body: false,
-        span: krate.span,
+        span,
         empty_tables: &empty_tables,
     };
-    intravisit::walk_crate(&mut visitor, krate);
+    intravisit::walk_mod(&mut visitor, module, node_id);
+}
+
+fn privacy_access_levels<'tcx>(
+    tcx: TyCtxt<'_, 'tcx, 'tcx>,
+    krate: CrateNum,
+) -> Lrc<AccessLevels> {
+    assert_eq!(krate, LOCAL_CRATE);
+
+    let krate = tcx.hir().krate();
+
+    for &module in krate.modules.keys() {
+        queries::check_mod_privacy::ensure(tcx, tcx.hir().local_def_id(module));
+    }
 
     // Build up a set of all exported items in the AST. This is a set of all
     // items which are reachable from external crates based on visibility.
diff --git a/src/librustc_resolve/build_reduced_graph.rs b/src/librustc_resolve/build_reduced_graph.rs
index a452bbf..35616cc 100644
--- a/src/librustc_resolve/build_reduced_graph.rs
+++ b/src/librustc_resolve/build_reduced_graph.rs
@@ -21,6 +21,8 @@
 use std::ptr;
 use rustc_data_structures::sync::Lrc;
 
+use errors::Applicability;
+
 use syntax::ast::{Name, Ident};
 use syntax::attr;
 
@@ -345,7 +347,12 @@
                 let module = if orig_name.is_none() && ident.name == keywords::SelfLower.name() {
                     self.session
                         .struct_span_err(item.span, "`extern crate self;` requires renaming")
-                        .span_suggestion(item.span, "try", "extern crate self as name;".into())
+                        .span_suggestion_with_applicability(
+                            item.span,
+                            "try",
+                            "extern crate self as name;".into(),
+                            Applicability::HasPlaceholders,
+                        )
                         .emit();
                     return;
                 } else if orig_name == Some(keywords::SelfLower.name()) {
@@ -673,6 +680,9 @@
                 }
                 module.populated.set(true);
             }
+            Def::TraitAlias(..) => {
+                self.define(parent, ident, TypeNS, (def, vis, DUMMY_SP, expansion));
+            }
             Def::Struct(..) | Def::Union(..) => {
                 self.define(parent, ident, TypeNS, (def, vis, DUMMY_SP, expansion));
 
diff --git a/src/librustc_resolve/lib.rs b/src/librustc_resolve/lib.rs
index c29b639..1cd4404 100644
--- a/src/librustc_resolve/lib.rs
+++ b/src/librustc_resolve/lib.rs
@@ -1015,7 +1015,7 @@
     CrateRootAndExternPrelude,
 
     /// Virtual module that denotes resolution in extern prelude.
-    /// Used for paths starting with `::` on 2018 edition or `extern::`.
+    /// Used for paths starting with `::` on 2018 edition.
     ExternPrelude,
 
     /// Virtual module that denotes resolution in current scope.
@@ -1546,9 +1546,7 @@
     extern_module_map: FxHashMap<(DefId, bool /* MacrosOnly? */), Module<'a>>,
     binding_parent_modules: FxHashMap<PtrKey<'a, NameBinding<'a>>, Module<'a>>,
 
-    pub make_glob_map: bool,
-    /// Maps imports to the names of items actually imported (this actually maps
-    /// all imports, but only glob imports are actually interesting).
+    /// Maps glob imports to the names of items actually imported.
     pub glob_map: GlobMap,
 
     used_imports: FxHashSet<(NodeId, Namespace)>,
@@ -1795,7 +1793,6 @@
                cstore: &'a CStore,
                krate: &Crate,
                crate_name: &str,
-               make_glob_map: MakeGlobMap,
                crate_loader: &'a mut CrateLoader<'a>,
                arenas: &'a ResolverArenas<'a>)
                -> Resolver<'a> {
@@ -1879,7 +1876,6 @@
             extern_module_map: FxHashMap::default(),
             binding_parent_modules: FxHashMap::default(),
 
-            make_glob_map: make_glob_map == MakeGlobMap::Yes,
             glob_map: Default::default(),
 
             used_imports: FxHashSet::default(),
@@ -1989,14 +1985,15 @@
             used.set(true);
             directive.used.set(true);
             self.used_imports.insert((directive.id, ns));
-            self.add_to_glob_map(directive.id, ident);
+            self.add_to_glob_map(&directive, ident);
             self.record_use(ident, ns, binding, false);
         }
     }
 
-    fn add_to_glob_map(&mut self, id: NodeId, ident: Ident) {
-        if self.make_glob_map {
-            self.glob_map.entry(id).or_default().insert(ident.name);
+    #[inline]
+    fn add_to_glob_map(&mut self, directive: &ImportDirective<'_>, ident: Ident) {
+        if directive.is_glob() {
+            self.glob_map.entry(directive.id).or_default().insert(ident.name);
         }
     }
 
@@ -3321,7 +3318,12 @@
             if let Some(def) = def {
                 match (def, source) {
                     (Def::Macro(..), _) => {
-                        err.span_label(span, format!("did you mean `{}!(...)`?", path_str));
+                        err.span_suggestion_with_applicability(
+                            span,
+                            "use `!` to invoke the macro",
+                            format!("{}!", path_str),
+                            Applicability::MaybeIncorrect,
+                        );
                         return (err, candidates);
                     }
                     (Def::TyAlias(..), PathSource::Trait(_)) => {
@@ -3333,13 +3335,22 @@
                     }
                     (Def::Mod(..), PathSource::Expr(Some(parent))) => match parent.node {
                         ExprKind::Field(_, ident) => {
-                            err.span_label(parent.span, format!("did you mean `{}::{}`?",
-                                                                 path_str, ident));
+                            err.span_suggestion_with_applicability(
+                                parent.span,
+                                "use the path separator to refer to an item",
+                                format!("{}::{}", path_str, ident),
+                                Applicability::MaybeIncorrect,
+                            );
                             return (err, candidates);
                         }
                         ExprKind::MethodCall(ref segment, ..) => {
-                            err.span_label(parent.span, format!("did you mean `{}::{}(...)`?",
-                                                                 path_str, segment.ident));
+                            let span = parent.span.with_hi(segment.ident.span.hi());
+                            err.span_suggestion_with_applicability(
+                                span,
+                                "use the path separator to refer to an item",
+                                format!("{}::{}", path_str, segment.ident),
+                                Applicability::MaybeIncorrect,
+                            );
                             return (err, candidates);
                         }
                         _ => {}
@@ -3390,6 +3401,29 @@
                                 Ok(ref snippet) if snippet == "{" => true,
                                 _ => false,
                             };
+                            // In case this could be a struct literal that needs to be surrounded
+                            // by parenthesis, find the appropriate span.
+                            let mut i = 0;
+                            let mut closing_brace = None;
+                            loop {
+                                sp = sm.next_point(sp);
+                                match sm.span_to_snippet(sp) {
+                                    Ok(ref snippet) => {
+                                        if snippet == "}" {
+                                            let sp = span.to(sp);
+                                            if let Ok(snippet) = sm.span_to_snippet(sp) {
+                                                closing_brace = Some((sp, snippet));
+                                            }
+                                            break;
+                                        }
+                                    }
+                                    _ => break,
+                                }
+                                i += 1;
+                                if i > 100 { // The bigger the span the more likely we're
+                                    break;   // incorrect. Bound it to 100 chars long.
+                                }
+                            }
                             match source {
                                 PathSource::Expr(Some(parent)) => {
                                     match parent.node {
@@ -3416,11 +3450,20 @@
                                     }
                                 },
                                 PathSource::Expr(None) if followed_by_brace == true => {
-                                    err.span_label(
-                                        span,
-                                        format!("did you mean `({} {{ /* fields */ }})`?",
-                                                path_str),
-                                    );
+                                    if let Some((sp, snippet)) = closing_brace {
+                                        err.span_suggestion_with_applicability(
+                                            sp,
+                                            "surround the struct literal with parenthesis",
+                                            format!("({})", snippet),
+                                            Applicability::MaybeIncorrect,
+                                        );
+                                    } else {
+                                        err.span_label(
+                                            span,
+                                            format!("did you mean `({} {{ /* fields */ }})`?",
+                                                    path_str),
+                                        );
+                                    }
                                     return (err, candidates);
                                 },
                                 _ => {
@@ -3836,8 +3879,7 @@
                             self.resolve_self(&mut ctxt, self.current_module)));
                         continue;
                     }
-                    if name == keywords::Extern.name() ||
-                       name == keywords::PathRoot.name() && ident.span.rust_2018() {
+                    if name == keywords::PathRoot.name() && ident.span.rust_2018() {
                         module = Some(ModuleOrUniformRoot::ExternPrelude);
                         continue;
                     }
@@ -4004,8 +4046,8 @@
         };
 
         // We're only interested in `use` paths which should start with
-        // `{{root}}` or `extern` currently.
-        if first_name != keywords::Extern.name() && first_name != keywords::PathRoot.name() {
+        // `{{root}}` currently.
+        if first_name != keywords::PathRoot.name() {
             return
         }
 
@@ -4599,7 +4641,7 @@
                 let import_id = match binding.kind {
                     NameBindingKind::Import { directive, .. } => {
                         self.maybe_unused_trait_imports.insert(directive.id);
-                        self.add_to_glob_map(directive.id, trait_name);
+                        self.add_to_glob_map(&directive, trait_name);
                         Some(directive.id)
                     }
                     _ => None,
@@ -4824,8 +4866,13 @@
                 } else if ident.span.rust_2018() {
                     let msg = "relative paths are not supported in visibilities on 2018 edition";
                     self.session.struct_span_err(ident.span, msg)
-                                .span_suggestion(path.span, "try", format!("crate::{}", path))
-                                .emit();
+                        .span_suggestion_with_applicability(
+                            path.span,
+                            "try",
+                            format!("crate::{}", path),
+                            Applicability::MaybeIncorrect,
+                        )
+                        .emit();
                     return ty::Visibility::Public;
                 } else {
                     let ctxt = ident.span.ctxt();
@@ -5306,12 +5353,6 @@
     PathResolution::new(Def::Err)
 }
 
-#[derive(PartialEq,Copy, Clone)]
-pub enum MakeGlobMap {
-    Yes,
-    No,
-}
-
 #[derive(Copy, Clone, Debug)]
 enum CrateLint {
     /// Do not issue the lint
diff --git a/src/librustc_save_analysis/dump_visitor.rs b/src/librustc_save_analysis/dump_visitor.rs
index 0c9e443..995df38 100644
--- a/src/librustc_save_analysis/dump_visitor.rs
+++ b/src/librustc_save_analysis/dump_visitor.rs
@@ -1238,13 +1238,9 @@
                 };
 
                 // Make a comma-separated list of names of imported modules.
-                let glob_map = &self.save_ctxt.analysis.glob_map;
-                let glob_map = glob_map.as_ref().unwrap();
-                let names = if glob_map.contains_key(&id) {
-                    glob_map.get(&id).unwrap().iter().map(|n| n.to_string()).collect()
-                } else {
-                    Vec::new()
-                };
+                let def_id = self.tcx.hir().local_def_id(id);
+                let names = self.tcx.names_imported_by_glob_use(def_id);
+                let names: Vec<_> = names.iter().map(|n| n.to_string()).collect();
 
                 // Otherwise it's a span with wrong macro expansion info, which
                 // we don't want to track anyway, since it's probably macro-internal `use`
diff --git a/src/librustc_save_analysis/lib.rs b/src/librustc_save_analysis/lib.rs
index 132bd4f..73eb5de 100644
--- a/src/librustc_save_analysis/lib.rs
+++ b/src/librustc_save_analysis/lib.rs
@@ -71,7 +71,6 @@
     tcx: TyCtxt<'l, 'tcx, 'tcx>,
     tables: &'l ty::TypeckTables<'tcx>,
     access_levels: &'l AccessLevels,
-    analysis: &'l ty::CrateAnalysis,
     span_utils: SpanUtils<'tcx>,
     config: Config,
     impl_counter: Cell<u32>,
@@ -1120,15 +1119,12 @@
 pub fn process_crate<'l, 'tcx, H: SaveHandler>(
     tcx: TyCtxt<'l, 'tcx, 'tcx>,
     krate: &ast::Crate,
-    analysis: &'l ty::CrateAnalysis,
     cratename: &str,
     input: &'l Input,
     config: Option<Config>,
     mut handler: H,
 ) {
     tcx.dep_graph.with_ignore(|| {
-        assert!(analysis.glob_map.is_some());
-
         info!("Dumping crate {}", cratename);
 
         // Privacy checking requires and is done after type checking; use a
@@ -1141,7 +1137,6 @@
         let save_ctxt = SaveContext {
             tcx,
             tables: &ty::TypeckTables::empty(None),
-            analysis,
             access_levels: &access_levels,
             span_utils: SpanUtils::new(&tcx.sess),
             config: find_config(config),
diff --git a/src/librustc_target/spec/mod.rs b/src/librustc_target/spec/mod.rs
index f42b0a1..3a21ca1 100644
--- a/src/librustc_target/spec/mod.rs
+++ b/src/librustc_target/spec/mod.rs
@@ -217,6 +217,46 @@
     }
 }
 
+#[derive(Clone, Copy, Debug, PartialEq, Hash, RustcEncodable, RustcDecodable)]
+pub enum MergeFunctions {
+    Disabled,
+    Trampolines,
+    Aliases
+}
+
+impl MergeFunctions {
+    pub fn desc(&self) -> &str {
+        match *self {
+            MergeFunctions::Disabled => "disabled",
+            MergeFunctions::Trampolines => "trampolines",
+            MergeFunctions::Aliases => "aliases",
+        }
+    }
+}
+
+impl FromStr for MergeFunctions {
+    type Err = ();
+
+    fn from_str(s: &str) -> Result<MergeFunctions, ()> {
+        match s {
+            "disabled" => Ok(MergeFunctions::Disabled),
+            "trampolines" => Ok(MergeFunctions::Trampolines),
+            "aliases" => Ok(MergeFunctions::Aliases),
+            _ => Err(()),
+        }
+    }
+}
+
+impl ToJson for MergeFunctions {
+    fn to_json(&self) -> Json {
+        match *self {
+            MergeFunctions::Disabled => "disabled".to_json(),
+            MergeFunctions::Trampolines => "trampolines".to_json(),
+            MergeFunctions::Aliases => "aliases".to_json(),
+        }
+    }
+}
+
 pub type LinkArgs = BTreeMap<LinkerFlavor, Vec<String>>;
 pub type TargetResult = Result<Target, String>;
 
@@ -690,7 +730,15 @@
 
     /// If set, have the linker export exactly these symbols, instead of using
     /// the usual logic to figure this out from the crate itself.
-    pub override_export_symbols: Option<Vec<String>>
+    pub override_export_symbols: Option<Vec<String>>,
+
+    /// Determines how or whether the MergeFunctions LLVM pass should run for
+    /// this target. Either "disabled", "trampolines", or "aliases".
+    /// The MergeFunctions pass is generally useful, but some targets may need
+    /// to opt out. The default is "aliases".
+    ///
+    /// Workaround for: https://github.com/rust-lang/rust/issues/57356
+    pub merge_functions: MergeFunctions
 }
 
 impl Default for TargetOptions {
@@ -773,6 +821,7 @@
             requires_uwtable: false,
             simd_types_indirect: true,
             override_export_symbols: None,
+            merge_functions: MergeFunctions::Aliases,
         }
     }
 }
@@ -875,6 +924,19 @@
                     .map(|o| o.as_u64()
                          .map(|s| base.options.$key_name = Some(s)));
             } );
+            ($key_name:ident, MergeFunctions) => ( {
+                let name = (stringify!($key_name)).replace("_", "-");
+                obj.find(&name[..]).and_then(|o| o.as_string().and_then(|s| {
+                    match s.parse::<MergeFunctions>() {
+                        Ok(mergefunc) => base.options.$key_name = mergefunc,
+                        _ => return Some(Err(format!("'{}' is not a valid value for \
+                                                      merge-functions. Use 'disabled', \
+                                                      'trampolines', or 'aliases'.",
+                                                      s))),
+                    }
+                    Some(Ok(()))
+                })).unwrap_or(Ok(()))
+            } );
             ($key_name:ident, PanicStrategy) => ( {
                 let name = (stringify!($key_name)).replace("_", "-");
                 obj.find(&name[..]).and_then(|o| o.as_string().and_then(|s| {
@@ -1064,6 +1126,7 @@
         key!(requires_uwtable, bool);
         key!(simd_types_indirect, bool);
         key!(override_export_symbols, opt_list);
+        key!(merge_functions, MergeFunctions)?;
 
         if let Some(array) = obj.find("abi-blacklist").and_then(Json::as_array) {
             for name in array.iter().filter_map(|abi| abi.as_string()) {
@@ -1275,6 +1338,7 @@
         target_option_val!(requires_uwtable);
         target_option_val!(simd_types_indirect);
         target_option_val!(override_export_symbols);
+        target_option_val!(merge_functions);
 
         if default.abi_blacklist != self.options.abi_blacklist {
             d.insert("abi-blacklist".to_string(), self.options.abi_blacklist.iter()
diff --git a/src/librustc_traits/lowering/mod.rs b/src/librustc_traits/lowering/mod.rs
index 5502a1d..9bdef30 100644
--- a/src/librustc_traits/lowering/mod.rs
+++ b/src/librustc_traits/lowering/mod.rs
@@ -158,7 +158,8 @@
     def_id: DefId,
 ) -> Clauses<'tcx> {
     match tcx.def_key(def_id).disambiguated_data.data {
-        DefPathData::Trait(_) => program_clauses_for_trait(tcx, def_id),
+        DefPathData::Trait(_) |
+        DefPathData::TraitAlias(_) => program_clauses_for_trait(tcx, def_id),
         DefPathData::Impl => program_clauses_for_impl(tcx, def_id),
         DefPathData::AssocTypeInImpl(..) => program_clauses_for_associated_type_value(tcx, def_id),
         DefPathData::AssocTypeInTrait(..) => program_clauses_for_associated_type_def(tcx, def_id),
diff --git a/src/librustc_typeck/Cargo.toml b/src/librustc_typeck/Cargo.toml
index 87f11b0..68b28a6 100644
--- a/src/librustc_typeck/Cargo.toml
+++ b/src/librustc_typeck/Cargo.toml
@@ -15,7 +15,6 @@
 rustc = { path = "../librustc" }
 rustc_data_structures = { path = "../librustc_data_structures" }
 rustc_errors = { path = "../librustc_errors" }
-rustc_platform_intrinsics = { path = "../librustc_platform_intrinsics" }
 rustc_target = { path = "../librustc_target" }
 smallvec = { version = "0.6.7", features = ["union", "may_dangle"] }
 syntax = { path = "../libsyntax" }
diff --git a/src/librustc_typeck/astconv.rs b/src/librustc_typeck/astconv.rs
index 8e5eaa1..e89506a 100644
--- a/src/librustc_typeck/astconv.rs
+++ b/src/librustc_typeck/astconv.rs
@@ -2,7 +2,7 @@
 //! The main routine here is `ast_ty_to_ty()`; each use is parameterized by an
 //! instance of `AstConv`.
 
-use errors::{Applicability, FatalError, DiagnosticId};
+use errors::{Applicability, DiagnosticId};
 use hir::{self, GenericArg, GenericArgs};
 use hir::def::Def;
 use hir::def_id::DefId;
@@ -10,6 +10,7 @@
 use lint;
 use middle::resolve_lifetime as rl;
 use namespace::Namespace;
+use rustc::lint::builtin::AMBIGUOUS_ASSOCIATED_ITEMS;
 use rustc::traits;
 use rustc::ty::{self, Ty, TyCtxt, ToPredicate, TypeFoldable};
 use rustc::ty::{GenericParamDef, GenericParamDefKind};
@@ -689,27 +690,13 @@
     {
         self.prohibit_generics(trait_ref.path.segments.split_last().unwrap().1);
 
-        let trait_def_id = self.trait_def_id(trait_ref);
         self.ast_path_to_mono_trait_ref(trait_ref.path.span,
-                                        trait_def_id,
+                                        trait_ref.trait_def_id(),
                                         self_ty,
                                         trait_ref.path.segments.last().unwrap())
     }
 
-    /// Get the `DefId` of the given trait ref. It _must_ actually be a trait.
-    fn trait_def_id(&self, trait_ref: &hir::TraitRef) -> DefId {
-        let path = &trait_ref.path;
-        match path.def {
-            Def::Trait(trait_def_id) => trait_def_id,
-            Def::TraitAlias(alias_def_id) => alias_def_id,
-            Def::Err => {
-                FatalError.raise();
-            }
-            _ => unreachable!(),
-        }
-    }
-
-    /// The given trait ref must actually be a trait.
+    /// The given trait-ref must actually be a trait.
     pub(super) fn instantiate_poly_trait_ref_inner(&self,
         trait_ref: &hir::TraitRef,
         self_ty: Ty<'tcx>,
@@ -717,7 +704,7 @@
         speculative: bool)
         -> (ty::PolyTraitRef<'tcx>, Option<Vec<Span>>)
     {
-        let trait_def_id = self.trait_def_id(trait_ref);
+        let trait_def_id = trait_ref.trait_def_id();
 
         debug!("instantiate_poly_trait_ref({:?}, def_id={:?})", trait_ref, trait_def_id);
 
@@ -1278,29 +1265,50 @@
     }
 
     // Create a type from a path to an associated type.
-    // For a path `A::B::C::D`, `ty` and `ty_path_def` are the type and def for `A::B::C`
+    // For a path `A::B::C::D`, `qself_ty` and `qself_def` are the type and def for `A::B::C`
     // and item_segment is the path segment for `D`. We return a type and a def for
     // the whole path.
-    // Will fail except for `T::A` and `Self::A`; i.e., if `ty`/`ty_path_def` are not a type
+    // Will fail except for `T::A` and `Self::A`; i.e., if `qself_ty`/`qself_def` are not a type
     // parameter or `Self`.
-    pub fn associated_path_def_to_ty(&self,
-                                     ref_id: ast::NodeId,
-                                     span: Span,
-                                     ty: Ty<'tcx>,
-                                     ty_path_def: Def,
-                                     item_segment: &hir::PathSegment)
-                                     -> (Ty<'tcx>, Def)
-    {
+    pub fn associated_path_to_ty(
+        &self,
+        ref_id: ast::NodeId,
+        span: Span,
+        qself_ty: Ty<'tcx>,
+        qself_def: Def,
+        assoc_segment: &hir::PathSegment,
+        permit_variants: bool,
+    ) -> (Ty<'tcx>, Def) {
         let tcx = self.tcx();
-        let assoc_name = item_segment.ident;
+        let assoc_ident = assoc_segment.ident;
 
-        debug!("associated_path_def_to_ty: {:?}::{}", ty, assoc_name);
+        debug!("associated_path_to_ty: {:?}::{}", qself_ty, assoc_ident);
 
-        self.prohibit_generics(slice::from_ref(item_segment));
+        self.prohibit_generics(slice::from_ref(assoc_segment));
+
+        // Check if we have an enum variant.
+        let mut variant_resolution = None;
+        if let ty::Adt(adt_def, _) = qself_ty.sty {
+            if adt_def.is_enum() {
+                let variant_def = adt_def.variants.iter().find(|vd| {
+                    tcx.hygienic_eq(assoc_ident, vd.ident, adt_def.did)
+                });
+                if let Some(variant_def) = variant_def {
+                    let def = Def::Variant(variant_def.did);
+                    if permit_variants {
+                        check_type_alias_enum_variants_enabled(tcx, span);
+                        tcx.check_stability(variant_def.did, Some(ref_id), span);
+                        return (qself_ty, def);
+                    } else {
+                        variant_resolution = Some(def);
+                    }
+                }
+            }
+        }
 
         // Find the type of the associated item, and the trait where the associated
         // item is declared.
-        let bound = match (&ty.sty, ty_path_def) {
+        let bound = match (&qself_ty.sty, qself_def) {
             (_, Def::SelfTy(Some(_), Some(impl_def_id))) => {
                 // `Self` in an impl of a trait -- we have a concrete self type and a
                 // trait reference.
@@ -1313,77 +1321,61 @@
                 };
 
                 let candidates = traits::supertraits(tcx, ty::Binder::bind(trait_ref))
-                    .filter(|r| self.trait_defines_associated_type_named(r.def_id(), assoc_name));
+                    .filter(|r| self.trait_defines_associated_type_named(r.def_id(), assoc_ident));
 
-                match self.one_bound_for_assoc_type(candidates, "Self", assoc_name, span) {
+                match self.one_bound_for_assoc_type(candidates, "Self", assoc_ident, span) {
                     Ok(bound) => bound,
                     Err(ErrorReported) => return (tcx.types.err, Def::Err),
                 }
             }
             (&ty::Param(_), Def::SelfTy(Some(param_did), None)) |
             (&ty::Param(_), Def::TyParam(param_did)) => {
-                match self.find_bound_for_assoc_item(param_did, assoc_name, span) {
+                match self.find_bound_for_assoc_item(param_did, assoc_ident, span) {
                     Ok(bound) => bound,
                     Err(ErrorReported) => return (tcx.types.err, Def::Err),
                 }
             }
-            (&ty::Adt(adt_def, _substs), Def::Enum(_did)) => {
-                let ty_str = ty.to_string();
-                // Incorrect enum variant.
-                let mut err = tcx.sess.struct_span_err(
-                    span,
-                    &format!("no variant `{}` on enum `{}`", &assoc_name.as_str(), ty_str),
-                );
-                // Check if it was a typo.
-                let input = adt_def.variants.iter().map(|variant| &variant.ident.name);
-                if let Some(suggested_name) = find_best_match_for_name(
-                    input,
-                    &assoc_name.as_str(),
-                    None,
-                ) {
-                    err.span_suggestion_with_applicability(
-                        span,
-                        "did you mean",
-                        format!("{}::{}", ty_str, suggested_name.to_string()),
-                        Applicability::MaybeIncorrect,
-                    );
-                } else {
-                    err.span_label(span, "unknown variant");
-                }
-                err.emit();
-                return (tcx.types.err, Def::Err);
-            }
             _ => {
-                // Check if we have an enum variant.
-                match ty.sty {
-                    ty::Adt(adt_def, _) if adt_def.is_enum() => {
-                        let variant_def = adt_def.variants.iter().find(|vd| {
-                            tcx.hygienic_eq(assoc_name, vd.ident, adt_def.did)
-                        });
-                        if let Some(variant_def) = variant_def {
-                            check_type_alias_enum_variants_enabled(tcx, span);
-
-                            let def = Def::Variant(variant_def.did);
-                            tcx.check_stability(def.def_id(), Some(ref_id), span);
-                            return (ty, def);
-                        }
-                    },
-                    _ => (),
-                }
-
-                // Don't print `TyErr` to the user.
-                if !ty.references_error() {
+                if variant_resolution.is_some() {
+                    // Variant in type position
+                    let msg = format!("expected type, found variant `{}`", assoc_ident);
+                    tcx.sess.span_err(span, &msg);
+                } else if qself_ty.is_enum() {
+                    // Report as incorrect enum variant rather than ambiguous type.
+                    let mut err = tcx.sess.struct_span_err(
+                        span,
+                        &format!("no variant `{}` on enum `{}`", &assoc_ident.as_str(), qself_ty),
+                    );
+                    // Check if it was a typo.
+                    let adt_def = qself_ty.ty_adt_def().expect("enum is not an ADT");
+                    if let Some(suggested_name) = find_best_match_for_name(
+                        adt_def.variants.iter().map(|variant| &variant.ident.name),
+                        &assoc_ident.as_str(),
+                        None,
+                    ) {
+                        err.span_suggestion_with_applicability(
+                            span,
+                            "did you mean",
+                            format!("{}::{}", qself_ty, suggested_name),
+                            Applicability::MaybeIncorrect,
+                        );
+                    } else {
+                        err.span_label(span, "unknown variant");
+                    }
+                    err.emit();
+                } else if !qself_ty.references_error() {
+                    // Don't print `TyErr` to the user.
                     self.report_ambiguous_associated_type(span,
-                                                          &ty.to_string(),
+                                                          &qself_ty.to_string(),
                                                           "Trait",
-                                                          &assoc_name.as_str());
+                                                          &assoc_ident.as_str());
                 }
                 return (tcx.types.err, Def::Err);
             }
         };
 
         let trait_did = bound.def_id();
-        let (assoc_ident, def_scope) = tcx.adjust_ident(assoc_name, trait_did, ref_id);
+        let (assoc_ident, def_scope) = tcx.adjust_ident(assoc_ident, trait_did, ref_id);
         let item = tcx.associated_items(trait_did).find(|i| {
             Namespace::from(i.kind) == Namespace::Type &&
                 i.ident.modern() == assoc_ident
@@ -1394,11 +1386,35 @@
 
         let def = Def::AssociatedTy(item.def_id);
         if !item.vis.is_accessible_from(def_scope, tcx) {
-            let msg = format!("{} `{}` is private", def.kind_name(), assoc_name);
+            let msg = format!("{} `{}` is private", def.kind_name(), assoc_ident);
             tcx.sess.span_err(span, &msg);
         }
         tcx.check_stability(item.def_id, Some(ref_id), span);
 
+        if let Some(variant_def) = variant_resolution {
+            let mut err = tcx.struct_span_lint_node(
+                AMBIGUOUS_ASSOCIATED_ITEMS,
+                ref_id,
+                span,
+                "ambiguous associated item",
+            );
+
+            let mut could_refer_to = |def: Def, also| {
+                let note_msg = format!("`{}` could{} refer to {} defined here",
+                                       assoc_ident, also, def.kind_name());
+                err.span_note(tcx.def_span(def.def_id()), &note_msg);
+            };
+            could_refer_to(variant_def, "");
+            could_refer_to(def, " also");
+
+            err.span_suggestion_with_applicability(
+                span,
+                "use fully-qualified syntax",
+                format!("<{} as {}>::{}", qself_ty, "Trait", assoc_ident),
+                Applicability::HasPlaceholders,
+            ).emit();
+        }
+
         (ty, def)
     }
 
@@ -1773,7 +1789,7 @@
                 } else {
                     Def::Err
                 };
-                self.associated_path_def_to_ty(ast_ty.id, ast_ty.span, ty, def, segment).0
+                self.associated_path_to_ty(ast_ty.id, ast_ty.span, ty, def, segment, false).0
             }
             hir::TyKind::Array(ref ty, ref length) => {
                 let length_def_id = tcx.hir().local_def_id(length.id);
diff --git a/src/librustc_typeck/check/_match.rs b/src/librustc_typeck/check/_match.rs
index 1767af4..47f258e 100644
--- a/src/librustc_typeck/check/_match.rs
+++ b/src/librustc_typeck/check/_match.rs
@@ -1,5 +1,6 @@
 use check::{FnCtxt, Expectation, Diverges, Needs};
 use check::coercion::CoerceMany;
+use errors::Applicability;
 use rustc::hir::{self, PatKind};
 use rustc::hir::def::{Def, CtorKind};
 use rustc::hir::pat_util::EnumerateAndAdjustIterator;
@@ -989,7 +990,13 @@
                     let suggested_name =
                         find_best_match_for_name(input, &ident.as_str(), None);
                     if let Some(suggested_name) = suggested_name {
-                        err.span_suggestion(*span, "did you mean", suggested_name.to_string());
+                        err.span_suggestion_with_applicability(
+                            *span,
+                            "did you mean",
+                            suggested_name.to_string(),
+                            Applicability::MaybeIncorrect,
+                        );
+
                         // we don't want to throw `E0027` in case we have thrown `E0026` for them
                         unmentioned_fields.retain(|&x| x.as_str() != suggested_name.as_str());
                     }
diff --git a/src/librustc_typeck/check/cast.rs b/src/librustc_typeck/check/cast.rs
index fbba891..3f185ba 100644
--- a/src/librustc_typeck/check/cast.rs
+++ b/src/librustc_typeck/check/cast.rs
@@ -257,10 +257,28 @@
                     .emit();
             }
             CastError::CastToBool => {
-                struct_span_err!(fcx.tcx.sess, self.span, E0054, "cannot cast as `bool`")
-                    .span_label(self.span, "unsupported cast")
-                    .help("compare with zero instead")
-                    .emit();
+                let mut err =
+                    struct_span_err!(fcx.tcx.sess, self.span, E0054, "cannot cast as `bool`");
+
+                if self.expr_ty.is_numeric() {
+                    match fcx.tcx.sess.source_map().span_to_snippet(self.expr.span) {
+                        Ok(snippet) => {
+                            err.span_suggestion_with_applicability(
+                                self.span,
+                                "compare with zero instead",
+                                format!("{} != 0", snippet),
+                                Applicability::MachineApplicable,
+                            );
+                        }
+                        Err(_) => {
+                            err.span_help(self.span, "compare with zero instead");
+                        }
+                    }
+                } else {
+                    err.span_label(self.span, "unsupported cast");
+                }
+
+                err.emit();
             }
             CastError::CastToChar => {
                 type_error_struct!(fcx.tcx.sess, self.span, self.expr_ty, E0604,
diff --git a/src/librustc_typeck/check/coercion.rs b/src/librustc_typeck/check/coercion.rs
index a82a0d3..dd63b4f 100644
--- a/src/librustc_typeck/check/coercion.rs
+++ b/src/librustc_typeck/check/coercion.rs
@@ -1216,7 +1216,7 @@
                                       "supposed to be part of a block tail expression, but the \
                                        expression is empty");
                         });
-                        fcx.suggest_mismatched_types_on_tail(
+                        let pointing_at_return_type = fcx.suggest_mismatched_types_on_tail(
                             &mut db,
                             expr,
                             expected,
@@ -1224,7 +1224,44 @@
                             cause.span,
                             blk_id,
                         );
-                        if let Some(sp) = fcx.ret_coercion_span.borrow().as_ref() {
+                        // FIXME: replace with navigating up the chain until hitting an fn or
+                        // bailing if no "pass-through" Node is found, in order to provide a
+                        // suggestion when encountering something like:
+                        // ```
+                        // fn foo(a: bool) -> impl Debug {
+                        //     if a {
+                        //         bar()?;
+                        //     }
+                        //     {
+                        //         let x = unsafe { bar() };
+                        //         x
+                        //     }
+                        // }
+                        // ```
+                        //
+                        // Verify that this is a tail expression of a function, otherwise the
+                        // label pointing out the cause for the type coercion will be wrong
+                        // as prior return coercions would not be relevant (#57664).
+                        let parent_id = fcx.tcx.hir().get_parent_node(blk_id);
+                        let parent = fcx.tcx.hir().get(fcx.tcx.hir().get_parent_node(parent_id));
+                        if fcx.get_node_fn_decl(parent).is_some() && !pointing_at_return_type {
+                            if let Some(sp) = fcx.ret_coercion_span.borrow().as_ref() {
+                                db.span_label(*sp, reason_label);
+                            }
+                        }
+                    }
+                    ObligationCauseCode::ReturnType(_id) => {
+                        db = fcx.report_mismatched_types(cause, expected, found, err);
+                        let _id = fcx.tcx.hir().get_parent_node(_id);
+                        let mut pointing_at_return_type = false;
+                        if let Some((fn_decl, can_suggest)) = fcx.get_fn_decl(_id) {
+                            pointing_at_return_type = fcx.suggest_missing_return_type(
+                                &mut db, &fn_decl, expected, found, can_suggest);
+                        }
+                        if let (Some(sp), false) = (
+                            fcx.ret_coercion_span.borrow().as_ref(),
+                            pointing_at_return_type,
+                        ) {
                             if !sp.overlaps(cause.span) {
                                 db.span_label(*sp, reason_label);
                             }
@@ -1232,11 +1269,6 @@
                     }
                     _ => {
                         db = fcx.report_mismatched_types(cause, expected, found, err);
-                        if let Some(sp) = fcx.ret_coercion_span.borrow().as_ref() {
-                            if !sp.overlaps(cause.span) {
-                                db.span_label(*sp, reason_label);
-                            }
-                        }
                     }
                 }
 
diff --git a/src/librustc_typeck/check/intrinsic.rs b/src/librustc_typeck/check/intrinsic.rs
index 9f323b9..143715d 100644
--- a/src/librustc_typeck/check/intrinsic.rs
+++ b/src/librustc_typeck/check/intrinsic.rs
@@ -1,17 +1,13 @@
 //! Type-checking for the rust-intrinsic and platform-intrinsic
 //! intrinsics that the compiler exposes.
 
-use intrinsics;
 use rustc::traits::{ObligationCause, ObligationCauseCode};
 use rustc::ty::{self, TyCtxt, Ty};
 use rustc::ty::subst::Subst;
-use rustc::util::nodemap::FxHashMap;
 use require_same_types;
 
 use rustc_target::spec::abi::Abi;
-use syntax::ast;
 use syntax::symbol::Symbol;
-use syntax_pos::Span;
 
 use rustc::hir;
 
@@ -402,8 +398,6 @@
         tcx.mk_ty_param(n, name)
     };
 
-    let def_id = tcx.hir().local_def_id(it.id);
-    let i_n_tps = tcx.generics_of(def_id).own_counts().types;
     let name = it.ident.as_str();
 
     let (n_tps, inputs, output) = match &*name {
@@ -461,159 +455,12 @@
             }
         }
         _ => {
-            match intrinsics::Intrinsic::find(&name) {
-                Some(intr) => {
-                    // this function is a platform specific intrinsic
-                    if i_n_tps != 0 {
-                        span_err!(tcx.sess, it.span, E0440,
-                                  "platform-specific intrinsic has wrong number of type \
-                                   parameters: found {}, expected 0",
-                                  i_n_tps);
-                        return
-                    }
-
-                    let mut structural_to_nomimal = FxHashMap::default();
-
-                    let sig = tcx.fn_sig(def_id);
-                    let sig = sig.no_bound_vars().unwrap();
-                    if intr.inputs.len() != sig.inputs().len() {
-                        span_err!(tcx.sess, it.span, E0444,
-                                  "platform-specific intrinsic has invalid number of \
-                                   arguments: found {}, expected {}",
-                                  sig.inputs().len(), intr.inputs.len());
-                        return
-                    }
-                    let input_pairs = intr.inputs.iter().zip(sig.inputs());
-                    for (i, (expected_arg, arg)) in input_pairs.enumerate() {
-                        match_intrinsic_type_to_type(tcx, &format!("argument {}", i + 1), it.span,
-                                                     &mut structural_to_nomimal, expected_arg, arg);
-                    }
-                    match_intrinsic_type_to_type(tcx, "return value", it.span,
-                                                 &mut structural_to_nomimal,
-                                                 &intr.output, sig.output());
-                    return
-                }
-                None => {
-                    span_err!(tcx.sess, it.span, E0441,
-                              "unrecognized platform-specific intrinsic function: `{}`", name);
-                    return;
-                }
-            }
+            let msg = format!("unrecognized platform-specific intrinsic function: `{}`", name);
+            tcx.sess.span_err(it.span, &msg);
+            return;
         }
     };
 
     equate_intrinsic_type(tcx, it, n_tps, Abi::PlatformIntrinsic, hir::Unsafety::Unsafe,
                           inputs, output)
 }
-
-// walk the expected type and the actual type in lock step, checking they're
-// the same, in a kinda-structural way, i.e., `Vector`s have to be simd structs with
-// exactly the right element type
-fn match_intrinsic_type_to_type<'a, 'tcx>(
-        tcx: TyCtxt<'a, 'tcx, 'tcx>,
-        position: &str,
-        span: Span,
-        structural_to_nominal: &mut FxHashMap<&'a intrinsics::Type, Ty<'tcx>>,
-        expected: &'a intrinsics::Type, t: Ty<'tcx>)
-{
-    use intrinsics::Type::*;
-
-    let simple_error = |real: &str, expected: &str| {
-        span_err!(tcx.sess, span, E0442,
-                  "intrinsic {} has wrong type: found {}, expected {}",
-                  position, real, expected)
-    };
-
-    match *expected {
-        Void => match t.sty {
-            ty::Tuple(ref v) if v.is_empty() => {},
-            _ => simple_error(&format!("`{}`", t), "()"),
-        },
-        // (The width we pass to LLVM doesn't concern the type checker.)
-        Integer(signed, bits, _llvm_width) => match (signed, bits, &t.sty) {
-            (true,  8,  &ty::Int(ast::IntTy::I8)) |
-            (false, 8,  &ty::Uint(ast::UintTy::U8)) |
-            (true,  16, &ty::Int(ast::IntTy::I16)) |
-            (false, 16, &ty::Uint(ast::UintTy::U16)) |
-            (true,  32, &ty::Int(ast::IntTy::I32)) |
-            (false, 32, &ty::Uint(ast::UintTy::U32)) |
-            (true,  64, &ty::Int(ast::IntTy::I64)) |
-            (false, 64, &ty::Uint(ast::UintTy::U64)) |
-            (true,  128, &ty::Int(ast::IntTy::I128)) |
-            (false, 128, &ty::Uint(ast::UintTy::U128)) => {},
-            _ => simple_error(&format!("`{}`", t),
-                              &format!("`{}{n}`",
-                                       if signed {"i"} else {"u"},
-                                       n = bits)),
-        },
-        Float(bits) => match (bits, &t.sty) {
-            (32, &ty::Float(ast::FloatTy::F32)) |
-            (64, &ty::Float(ast::FloatTy::F64)) => {},
-            _ => simple_error(&format!("`{}`", t),
-                              &format!("`f{n}`", n = bits)),
-        },
-        Pointer(ref inner_expected, ref _llvm_type, const_) => {
-            match t.sty {
-                ty::RawPtr(ty::TypeAndMut { ty, mutbl }) => {
-                    if (mutbl == hir::MutImmutable) != const_ {
-                        simple_error(&format!("`{}`", t),
-                                     if const_ {"const pointer"} else {"mut pointer"})
-                    }
-                    match_intrinsic_type_to_type(tcx, position, span, structural_to_nominal,
-                                                 inner_expected, ty)
-                }
-                _ => simple_error(&format!("`{}`", t), "raw pointer"),
-            }
-        }
-        Vector(ref inner_expected, ref _llvm_type, len) => {
-            if !t.is_simd() {
-                simple_error(&format!("non-simd type `{}`", t), "simd type");
-                return;
-            }
-            let t_len = t.simd_size(tcx);
-            if len as usize != t_len {
-                simple_error(&format!("vector with length {}", t_len),
-                             &format!("length {}", len));
-                return;
-            }
-            let t_ty = t.simd_type(tcx);
-            {
-                // check that a given structural type always has the same an intrinsic definition
-                let previous = structural_to_nominal.entry(expected).or_insert(t);
-                if *previous != t {
-                    // this gets its own error code because it is non-trivial
-                    span_err!(tcx.sess, span, E0443,
-                              "intrinsic {} has wrong type: found `{}`, expected `{}` which \
-                               was used for this vector type previously in this signature",
-                              position,
-                              t,
-                              *previous);
-                    return;
-                }
-            }
-            match_intrinsic_type_to_type(tcx,
-                                         position,
-                                         span,
-                                         structural_to_nominal,
-                                         inner_expected,
-                                         t_ty)
-        }
-        Aggregate(_flatten, ref expected_contents) => {
-            match t.sty {
-                ty::Tuple(contents) => {
-                    if contents.len() != expected_contents.len() {
-                        simple_error(&format!("tuple with length {}", contents.len()),
-                                     &format!("tuple with length {}", expected_contents.len()));
-                        return
-                    }
-                    for (e, c) in expected_contents.iter().zip(contents) {
-                        match_intrinsic_type_to_type(tcx, position, span, structural_to_nominal,
-                                                     e, c)
-                    }
-                }
-                _ => simple_error(&format!("`{}`", t),
-                                  "tuple"),
-            }
-        }
-    }
-}
diff --git a/src/librustc_typeck/check/method/mod.rs b/src/librustc_typeck/check/method/mod.rs
index 02687df..e71dc01 100644
--- a/src/librustc_typeck/check/method/mod.rs
+++ b/src/librustc_typeck/check/method/mod.rs
@@ -408,45 +408,36 @@
 
         let tcx = self.tcx;
 
-        let mode = probe::Mode::Path;
-        match self.probe_for_name(span, mode, method_name, IsSuggestion(false),
-                                  self_ty, expr_id, ProbeScope::TraitsInScope) {
-            Ok(pick) => {
-                debug!("resolve_ufcs: pick={:?}", pick);
-                if let Some(import_id) = pick.import_id {
-                    let import_def_id = tcx.hir().local_def_id(import_id);
-                    debug!("resolve_ufcs: used_trait_import: {:?}", import_def_id);
-                    Lrc::get_mut(&mut self.tables.borrow_mut().used_trait_imports)
-                                                .unwrap().insert(import_def_id);
+        // Check if we have an enum variant.
+        if let ty::Adt(adt_def, _) = self_ty.sty {
+            if adt_def.is_enum() {
+                let variant_def = adt_def.variants.iter().find(|vd| {
+                    tcx.hygienic_eq(method_name, vd.ident, adt_def.did)
+                });
+                if let Some(variant_def) = variant_def {
+                    check_type_alias_enum_variants_enabled(tcx, span);
+
+                    let def = Def::VariantCtor(variant_def.did, variant_def.ctor_kind);
+                    tcx.check_stability(def.def_id(), Some(expr_id), span);
+                    return Ok(def);
                 }
-
-                let def = pick.item.def();
-                debug!("resolve_ufcs: def={:?}", def);
-                tcx.check_stability(def.def_id(), Some(expr_id), span);
-
-                Ok(def)
-            }
-            Err(err) => {
-                // Check if we have an enum variant.
-                match self_ty.sty {
-                    ty::Adt(adt_def, _) if adt_def.is_enum() => {
-                        let variant_def = adt_def.variants.iter().find(|vd| {
-                            tcx.hygienic_eq(method_name, vd.ident, adt_def.did)
-                        });
-                        if let Some(variant_def) = variant_def {
-                            check_type_alias_enum_variants_enabled(tcx, span);
-
-                            let def = Def::VariantCtor(variant_def.did, variant_def.ctor_kind);
-                            tcx.check_stability(def.def_id(), Some(expr_id), span);
-                            return Ok(def);
-                        }
-                    },
-                    _ => (),
-                }
-
-                Err(err)
             }
         }
+
+        let pick = self.probe_for_name(span, probe::Mode::Path, method_name, IsSuggestion(false),
+                                       self_ty, expr_id, ProbeScope::TraitsInScope)?;
+        debug!("resolve_ufcs: pick={:?}", pick);
+        if let Some(import_id) = pick.import_id {
+            let import_def_id = tcx.hir().local_def_id(import_id);
+            debug!("resolve_ufcs: used_trait_import: {:?}", import_def_id);
+            Lrc::get_mut(&mut self.tables.borrow_mut().used_trait_imports)
+                .unwrap().insert(import_def_id);
+        }
+
+        let def = pick.item.def();
+        debug!("resolve_ufcs: def={:?}", def);
+        tcx.check_stability(def.def_id(), Some(expr_id), span);
+        Ok(def)
     }
 
     /// Find item with name `item_name` defined in impl/trait `def_id`
diff --git a/src/librustc_typeck/check/mod.rs b/src/librustc_typeck/check/mod.rs
index 1b07385..c9173df 100644
--- a/src/librustc_typeck/check/mod.rs
+++ b/src/librustc_typeck/check/mod.rs
@@ -132,7 +132,8 @@
 use std::slice;
 
 use require_c_abi_if_variadic;
-use session::{CompileIncomplete, config, Session};
+use session::{CompileIncomplete, Session};
+use session::config::EntryFnType;
 use TypeAndSubsts;
 use lint;
 use util::captures::Captures;
@@ -1163,19 +1164,18 @@
 
     // Check that the main return type implements the termination trait.
     if let Some(term_id) = fcx.tcx.lang_items().termination() {
-        if let Some((id, _, entry_type)) = *fcx.tcx.sess.entry_fn.borrow() {
-            if id == fn_id {
-                if let config::EntryFnType::Main = entry_type {
-                    let substs = fcx.tcx.mk_substs_trait(declared_ret_ty, &[]);
-                    let trait_ref = ty::TraitRef::new(term_id, substs);
-                    let return_ty_span = decl.output.span();
-                    let cause = traits::ObligationCause::new(
-                        return_ty_span, fn_id, ObligationCauseCode::MainFunctionType);
+        if let Some((def_id, EntryFnType::Main)) = fcx.tcx.entry_fn(LOCAL_CRATE) {
+            let main_id = fcx.tcx.hir().as_local_node_id(def_id).unwrap();
+            if main_id == fn_id {
+                let substs = fcx.tcx.mk_substs_trait(declared_ret_ty, &[]);
+                let trait_ref = ty::TraitRef::new(term_id, substs);
+                let return_ty_span = decl.output.span();
+                let cause = traits::ObligationCause::new(
+                    return_ty_span, fn_id, ObligationCauseCode::MainFunctionType);
 
-                    inherited.register_predicate(
-                        traits::Obligation::new(
-                            cause, param_env, trait_ref.to_predicate()));
-                }
+                inherited.register_predicate(
+                    traits::Obligation::new(
+                        cause, param_env, trait_ref.to_predicate()));
             }
         }
     }
@@ -4347,11 +4347,15 @@
                     struct_span_err!(self.tcx.sess, expr.span, E0572,
                                      "return statement outside of function body").emit();
                 } else if let Some(ref e) = *expr_opt {
-                    *self.ret_coercion_span.borrow_mut() = Some(e.span);
+                    if self.ret_coercion_span.borrow().is_none() {
+                        *self.ret_coercion_span.borrow_mut() = Some(e.span);
+                    }
                     self.check_return_expr(e);
                 } else {
                     let mut coercion = self.ret_coercion.as_ref().unwrap().borrow_mut();
-                    *self.ret_coercion_span.borrow_mut() = Some(expr.span);
+                    if self.ret_coercion_span.borrow().is_none() {
+                        *self.ret_coercion_span.borrow_mut() = Some(expr.span);
+                    }
                     let cause = self.cause(expr.span, ObligationCauseCode::ReturnNoExpression);
                     if let Some((fn_decl, _)) = self.get_fn_decl(expr.id) {
                         coercion.coerce_forced_unit(
@@ -4724,8 +4728,8 @@
                 } else {
                     Def::Err
                 };
-                let (ty, def) = AstConv::associated_path_def_to_ty(self, node_id, path_span,
-                                                                   ty, def, segment);
+                let (ty, def) = AstConv::associated_path_to_ty(self, node_id, path_span,
+                                                               ty, def, segment, true);
 
                 // Write back the new resolution.
                 let hir_id = self.tcx.hir().node_to_hir_id(node_id);
@@ -4840,15 +4844,11 @@
     pub fn check_stmt(&self, stmt: &'gcx hir::Stmt) {
         // Don't do all the complex logic below for `DeclItem`.
         match stmt.node {
-            hir::StmtKind::Decl(ref decl, _) => {
-                if let hir::DeclKind::Item(_) = decl.node {
-                    return
-                }
-            }
-            hir::StmtKind::Expr(..) | hir::StmtKind::Semi(..) => {}
+            hir::StmtKind::Item(..) => return,
+            hir::StmtKind::Local(..) | hir::StmtKind::Expr(..) | hir::StmtKind::Semi(..) => {}
         }
 
-        self.warn_if_unreachable(stmt.node.id(), stmt.span, "statement");
+        self.warn_if_unreachable(stmt.id, stmt.span, "statement");
 
         // Hide the outer diverging and `has_errors` flags.
         let old_diverges = self.diverges.get();
@@ -4857,20 +4857,16 @@
         self.has_errors.set(false);
 
         match stmt.node {
-            hir::StmtKind::Decl(ref decl, _) => {
-                match decl.node {
-                    hir::DeclKind::Local(ref l) => {
-                        self.check_decl_local(&l);
-                    }
-                    // Ignore for now.
-                    hir::DeclKind::Item(_) => ()
-                }
+            hir::StmtKind::Local(ref l) => {
+                self.check_decl_local(&l);
             }
-            hir::StmtKind::Expr(ref expr, _) => {
+            // Ignore for now.
+            hir::StmtKind::Item(_) => {}
+            hir::StmtKind::Expr(ref expr) => {
                 // Check with expected type of `()`.
                 self.check_expr_has_type_or_error(&expr, self.tcx.mk_unit());
             }
-            hir::StmtKind::Semi(ref expr, _) => {
+            hir::StmtKind::Semi(ref expr) => {
                 self.check_expr(&expr);
             }
         }
@@ -5089,12 +5085,15 @@
         found: Ty<'tcx>,
         cause_span: Span,
         blk_id: ast::NodeId,
-    ) {
+    ) -> bool {
         self.suggest_missing_semicolon(err, expression, expected, cause_span);
+        let mut pointing_at_return_type = false;
         if let Some((fn_decl, can_suggest)) = self.get_fn_decl(blk_id) {
-            self.suggest_missing_return_type(err, &fn_decl, expected, found, can_suggest);
+            pointing_at_return_type = self.suggest_missing_return_type(
+                err, &fn_decl, expected, found, can_suggest);
         }
         self.suggest_ref_or_into(err, expression, expected, found);
+        pointing_at_return_type
     }
 
     pub fn suggest_ref_or_into(
@@ -5193,12 +5192,14 @@
     /// This routine checks if the return type is left as default, the method is not part of an
     /// `impl` block and that it isn't the `main` method. If so, it suggests setting the return
     /// type.
-    fn suggest_missing_return_type(&self,
-                                   err: &mut DiagnosticBuilder<'tcx>,
-                                   fn_decl: &hir::FnDecl,
-                                   expected: Ty<'tcx>,
-                                   found: Ty<'tcx>,
-                                   can_suggest: bool) {
+    fn suggest_missing_return_type(
+        &self,
+        err: &mut DiagnosticBuilder<'tcx>,
+        fn_decl: &hir::FnDecl,
+        expected: Ty<'tcx>,
+        found: Ty<'tcx>,
+        can_suggest: bool,
+    ) -> bool {
         // Only suggest changing the return type for methods that
         // haven't set a return type at all (and aren't `fn main()` or an impl).
         match (&fn_decl.output, found.is_suggestable(), can_suggest, expected.is_unit()) {
@@ -5208,16 +5209,19 @@
                     "try adding a return type",
                     format!("-> {} ", self.resolve_type_vars_with_obligations(found)),
                     Applicability::MachineApplicable);
+                true
             }
             (&hir::FunctionRetTy::DefaultReturn(span), false, true, true) => {
                 err.span_label(span, "possibly return type missing here?");
+                true
             }
             (&hir::FunctionRetTy::DefaultReturn(span), _, false, true) => {
                 // `fn main()` must return `()`, do not suggest changing return type
                 err.span_label(span, "expected `()` because of default return type");
+                true
             }
             // expectation was caused by something else, not the default return
-            (&hir::FunctionRetTy::DefaultReturn(_), _, _, false) => {}
+            (&hir::FunctionRetTy::DefaultReturn(_), _, _, false) => false,
             (&hir::FunctionRetTy::Return(ref ty), _, _, _) => {
                 // Only point to return type if the expected type is the return type, as if they
                 // are not, the expectation must have been caused by something else.
@@ -5229,7 +5233,9 @@
                 if ty.sty == expected.sty {
                     err.span_label(sp, format!("expected `{}` because of return type",
                                                expected));
+                    return true;
                 }
+                false
             }
         }
     }
@@ -5273,7 +5279,7 @@
             None => return None,
         };
         let last_expr = match last_stmt.node {
-            hir::StmtKind::Semi(ref e, _) => e,
+            hir::StmtKind::Semi(ref e) => e,
             _ => return None,
         };
         let last_expr_ty = self.node_ty(last_expr.hir_id);
diff --git a/src/librustc_typeck/coherence/mod.rs b/src/librustc_typeck/coherence/mod.rs
index ce71be0..8053ed1 100644
--- a/src/librustc_typeck/coherence/mod.rs
+++ b/src/librustc_typeck/coherence/mod.rs
@@ -171,13 +171,23 @@
         // This is something like impl Trait1 for Trait2. Illegal
         // if Trait1 is a supertrait of Trait2 or Trait2 is not object safe.
 
-        if let Some(principal_def_id) = data.principal_def_id() {
-            if !tcx.is_object_safe(principal_def_id) {
+        let component_def_ids = data.iter().flat_map(|predicate| {
+            match predicate.skip_binder() {
+                ty::ExistentialPredicate::Trait(tr) => Some(tr.def_id),
+                ty::ExistentialPredicate::AutoTrait(def_id) => Some(*def_id),
+                // An associated type projection necessarily comes with
+                // an additional `Trait` requirement.
+                ty::ExistentialPredicate::Projection(..) => None,
+            }
+        });
+
+        for component_def_id in component_def_ids {
+            if !tcx.is_object_safe(component_def_id) {
                 // This is an error, but it will be reported by wfcheck.  Ignore it here.
                 // This is tested by `coherence-impl-trait-for-trait-object-safe.rs`.
             } else {
                 let mut supertrait_def_ids =
-                    traits::supertrait_def_ids(tcx, principal_def_id);
+                    traits::supertrait_def_ids(tcx, component_def_id);
                 if supertrait_def_ids.any(|d| d == trait_def_id) {
                     let sp = tcx.sess.source_map().def_span(tcx.span_of_impl(impl_def_id).unwrap());
                     struct_span_err!(tcx.sess,
@@ -193,6 +203,5 @@
                 }
             }
         }
-        // FIXME: also check auto-trait def-ids? (e.g. `impl Sync for Foo+Sync`)?
     }
 }
diff --git a/src/librustc_typeck/collect.rs b/src/librustc_typeck/collect.rs
index 67e3d12..93f14a2 100644
--- a/src/librustc_typeck/collect.rs
+++ b/src/librustc_typeck/collect.rs
@@ -715,7 +715,7 @@
     // In the case of trait aliases, however, we include all bounds in the where clause,
     // so e.g., `trait Foo = where u32: PartialEq<Self>` would include `u32: PartialEq<Self>`
     // as one of its "superpredicates".
-    let is_trait_alias = ty::is_trait_alias(tcx, trait_def_id);
+    let is_trait_alias = tcx.is_trait_alias(trait_def_id);
     let superbounds2 = icx.type_parameter_bounds_in_generics(
         generics, item.id, self_param_ty, OnlySelfBounds(!is_trait_alias));
 
@@ -2144,12 +2144,7 @@
 ) {
     let list = match attr.meta_item_list() {
         Some(list) => list,
-        None => {
-            let msg = "#[target_feature] attribute must be of the form \
-                       #[target_feature(..)]";
-            tcx.sess.span_err(attr.span, &msg);
-            return;
-        }
+        None => return,
     };
     let rust_features = tcx.features();
     for item in list {
@@ -2347,14 +2342,6 @@
                     ).emit();
                 }
                 codegen_fn_attrs.export_name = Some(s);
-            } else {
-                struct_span_err!(
-                    tcx.sess,
-                    attr.span,
-                    E0558,
-                    "`export_name` attribute has invalid format"
-                ).span_label(attr.span, "did you mean #[export_name=\"*\"]?")
-                 .emit();
             }
         } else if attr.check_name("target_feature") {
             if tcx.fn_sig(id).unsafety() == Unsafety::Normal {
diff --git a/src/librustc_typeck/diagnostics.rs b/src/librustc_typeck/diagnostics.rs
index 387dabe..c0a8dd8 100644
--- a/src/librustc_typeck/diagnostics.rs
+++ b/src/librustc_typeck/diagnostics.rs
@@ -516,7 +516,7 @@
 For a somewhat artificial example:
 
 ```compile_fail,E0055
-#![recursion_limit="2"]
+#![recursion_limit="5"]
 
 struct Foo;
 
@@ -526,9 +526,9 @@
 
 fn main() {
     let foo = Foo;
-    let ref_foo = &&Foo;
+    let ref_foo = &&&&&Foo;
 
-    // error, reached the recursion limit while auto-dereferencing `&&Foo`
+    // error, reached the recursion limit while auto-dereferencing `&&&&&Foo`
     ref_foo.foo();
 }
 ```
@@ -3369,180 +3369,6 @@
 ```
 "##,
 
-E0440: r##"
-A platform-specific intrinsic function has the wrong number of type
-parameters. Erroneous code example:
-
-```compile_fail,E0440
-#![feature(repr_simd)]
-#![feature(platform_intrinsics)]
-
-#[repr(simd)]
-struct f64x2(f64, f64);
-
-extern "platform-intrinsic" {
-    fn x86_mm_movemask_pd<T>(x: f64x2) -> i32;
-    // error: platform-specific intrinsic has wrong number of type
-    //        parameters
-}
-```
-
-Please refer to the function declaration to see if it corresponds
-with yours. Example:
-
-```
-#![feature(repr_simd)]
-#![feature(platform_intrinsics)]
-
-#[repr(simd)]
-struct f64x2(f64, f64);
-
-extern "platform-intrinsic" {
-    fn x86_mm_movemask_pd(x: f64x2) -> i32;
-}
-```
-"##,
-
-E0441: r##"
-An unknown platform-specific intrinsic function was used. Erroneous
-code example:
-
-```compile_fail,E0441
-#![feature(repr_simd)]
-#![feature(platform_intrinsics)]
-
-#[repr(simd)]
-struct i16x8(i16, i16, i16, i16, i16, i16, i16, i16);
-
-extern "platform-intrinsic" {
-    fn x86_mm_adds_ep16(x: i16x8, y: i16x8) -> i16x8;
-    // error: unrecognized platform-specific intrinsic function
-}
-```
-
-Please verify that the function name wasn't misspelled, and ensure
-that it is declared in the rust source code (in the file
-src/librustc_platform_intrinsics/x86.rs). Example:
-
-```
-#![feature(repr_simd)]
-#![feature(platform_intrinsics)]
-
-#[repr(simd)]
-struct i16x8(i16, i16, i16, i16, i16, i16, i16, i16);
-
-extern "platform-intrinsic" {
-    fn x86_mm_adds_epi16(x: i16x8, y: i16x8) -> i16x8; // ok!
-}
-```
-"##,
-
-E0442: r##"
-Intrinsic argument(s) and/or return value have the wrong type.
-Erroneous code example:
-
-```compile_fail,E0442
-#![feature(repr_simd)]
-#![feature(platform_intrinsics)]
-
-#[repr(simd)]
-struct i8x16(i8, i8, i8, i8, i8, i8, i8, i8,
-             i8, i8, i8, i8, i8, i8, i8, i8);
-#[repr(simd)]
-struct i32x4(i32, i32, i32, i32);
-#[repr(simd)]
-struct i64x2(i64, i64);
-
-extern "platform-intrinsic" {
-    fn x86_mm_adds_epi16(x: i8x16, y: i32x4) -> i64x2;
-    // error: intrinsic arguments/return value have wrong type
-}
-```
-
-To fix this error, please refer to the function declaration to give
-it the awaited types. Example:
-
-```
-#![feature(repr_simd)]
-#![feature(platform_intrinsics)]
-
-#[repr(simd)]
-struct i16x8(i16, i16, i16, i16, i16, i16, i16, i16);
-
-extern "platform-intrinsic" {
-    fn x86_mm_adds_epi16(x: i16x8, y: i16x8) -> i16x8; // ok!
-}
-```
-"##,
-
-E0443: r##"
-Intrinsic argument(s) and/or return value have the wrong type.
-Erroneous code example:
-
-```compile_fail,E0443
-#![feature(repr_simd)]
-#![feature(platform_intrinsics)]
-
-#[repr(simd)]
-struct i16x8(i16, i16, i16, i16, i16, i16, i16, i16);
-#[repr(simd)]
-struct i64x8(i64, i64, i64, i64, i64, i64, i64, i64);
-
-extern "platform-intrinsic" {
-    fn x86_mm_adds_epi16(x: i16x8, y: i16x8) -> i64x8;
-    // error: intrinsic argument/return value has wrong type
-}
-```
-
-To fix this error, please refer to the function declaration to give
-it the awaited types. Example:
-
-```
-#![feature(repr_simd)]
-#![feature(platform_intrinsics)]
-
-#[repr(simd)]
-struct i16x8(i16, i16, i16, i16, i16, i16, i16, i16);
-
-extern "platform-intrinsic" {
-    fn x86_mm_adds_epi16(x: i16x8, y: i16x8) -> i16x8; // ok!
-}
-```
-"##,
-
-E0444: r##"
-A platform-specific intrinsic function has wrong number of arguments.
-Erroneous code example:
-
-```compile_fail,E0444
-#![feature(repr_simd)]
-#![feature(platform_intrinsics)]
-
-#[repr(simd)]
-struct f64x2(f64, f64);
-
-extern "platform-intrinsic" {
-    fn x86_mm_movemask_pd(x: f64x2, y: f64x2, z: f64x2) -> i32;
-    // error: platform-specific intrinsic has invalid number of arguments
-}
-```
-
-Please refer to the function declaration to see if it corresponds
-with yours. Example:
-
-```
-#![feature(repr_simd)]
-#![feature(platform_intrinsics)]
-
-#[repr(simd)]
-struct f64x2(f64, f64);
-
-extern "platform-intrinsic" {
-    fn x86_mm_movemask_pd(x: f64x2) -> i32; // ok!
-}
-```
-"##,
-
 E0516: r##"
 The `typeof` keyword is currently reserved but unimplemented.
 Erroneous code example:
@@ -3785,29 +3611,6 @@
 read://doc.rust-lang.org/reference.html#inline-attributes
 "##,
 
-E0558: r##"
-The `export_name` attribute was malformed.
-
-Erroneous code example:
-
-```ignore (error-emitted-at-codegen-which-cannot-be-handled-by-compile_fail)
-#[export_name] // error: `export_name` attribute has invalid format
-pub fn something() {}
-
-fn main() {}
-```
-
-The `export_name` attribute expects a string in order to determine the name of
-the exported symbol. Example:
-
-```
-#[export_name = "some_function"] // ok!
-pub fn something() {}
-
-fn main() {}
-```
-"##,
-
 E0559: r##"
 An unknown field was specified into an enum's structure variant.
 
@@ -4896,6 +4699,7 @@
 //  E0372, // coherence not object safe
     E0377, // the trait `CoerceUnsized` may only be implemented for a coercion
            // between structures with the same definition
+//  E0558, // replaced with a generic attribute input check
     E0533, // `{}` does not name a unit variant, unit struct or a constant
 //  E0563, // cannot determine a type for this `impl Trait`: {} // removed in 6383de15
     E0564, // only named lifetimes are allowed in `impl Trait`,
diff --git a/src/librustc_typeck/lib.rs b/src/librustc_typeck/lib.rs
index c55a125..6c1c49b 100644
--- a/src/librustc_typeck/lib.rs
+++ b/src/librustc_typeck/lib.rs
@@ -82,7 +82,6 @@
 extern crate arena;
 
 #[macro_use] extern crate rustc;
-extern crate rustc_platform_intrinsics as intrinsics;
 extern crate rustc_data_structures;
 extern crate rustc_errors as errors;
 extern crate rustc_target;
@@ -104,23 +103,22 @@
 mod outlives;
 mod variance;
 
-use hir::Node;
 use rustc_target::spec::abi::Abi;
-use rustc::hir;
+use rustc::hir::{self, Node};
+use rustc::hir::def_id::{DefId, LOCAL_CRATE};
 use rustc::infer::InferOk;
 use rustc::lint;
 use rustc::middle;
 use rustc::session;
-use rustc::session::config::nightly_options;
+use rustc::session::CompileIncomplete;
+use rustc::session::config::{EntryFnType, nightly_options};
 use rustc::traits::{ObligationCause, ObligationCauseCode, TraitEngine, TraitEngineExt};
 use rustc::ty::subst::Substs;
 use rustc::ty::{self, Ty, TyCtxt};
 use rustc::ty::query::Providers;
 use rustc::util;
 use rustc::util::profiling::ProfileCategory;
-use session::{CompileIncomplete, config};
 use syntax_pos::Span;
-use syntax::ast;
 use util::common::time;
 
 use std::iter;
@@ -185,10 +183,9 @@
     })
 }
 
-fn check_main_fn_ty<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
-                              main_id: ast::NodeId,
-                              main_span: Span) {
-    let main_def_id = tcx.hir().local_def_id(main_id);
+fn check_main_fn_ty<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, main_def_id: DefId) {
+    let main_id = tcx.hir().as_local_node_id(main_def_id).unwrap();
+    let main_span = tcx.def_span(main_def_id);
     let main_t = tcx.type_of(main_def_id);
     match main_t.sty {
         ty::FnDef(..) => {
@@ -251,10 +248,9 @@
     }
 }
 
-fn check_start_fn_ty<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
-                               start_id: ast::NodeId,
-                               start_span: Span) {
-    let start_def_id = tcx.hir().local_def_id(start_id);
+fn check_start_fn_ty<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, start_def_id: DefId) {
+    let start_id = tcx.hir().as_local_node_id(start_def_id).unwrap();
+    let start_span = tcx.def_span(start_def_id);
     let start_t = tcx.type_of(start_def_id);
     match start_t.sty {
         ty::FnDef(..) => {
@@ -310,11 +306,10 @@
 }
 
 fn check_for_entry_fn<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>) {
-    if let Some((id, sp, entry_type)) = *tcx.sess.entry_fn.borrow() {
-        match entry_type {
-            config::EntryFnType::Main => check_main_fn_ty(tcx, id, sp),
-            config::EntryFnType::Start => check_start_fn_ty(tcx, id, sp),
-        }
+    match tcx.entry_fn(LOCAL_CRATE) {
+        Some((def_id, EntryFnType::Main)) => check_main_fn_ty(tcx, def_id),
+        Some((def_id, EntryFnType::Start)) => check_start_fn_ty(tcx, def_id),
+        _ => {}
     }
 }
 
diff --git a/src/librustdoc/Cargo.toml b/src/librustdoc/Cargo.toml
index 8bac007..4b42188 100644
--- a/src/librustdoc/Cargo.toml
+++ b/src/librustdoc/Cargo.toml
@@ -9,6 +9,6 @@
 
 [dependencies]
 pulldown-cmark = { version = "0.1.2", default-features = false }
-minifier = "0.0.20"
+minifier = "0.0.26"
 tempfile = "3"
 parking_lot = "0.6.4"
diff --git a/src/librustdoc/config.rs b/src/librustdoc/config.rs
index d991368..635d071 100644
--- a/src/librustdoc/config.rs
+++ b/src/librustdoc/config.rs
@@ -68,6 +68,9 @@
     pub should_test: bool,
     /// List of arguments to pass to the test harness, if running tests.
     pub test_args: Vec<String>,
+    /// Optional path to persist the doctest executables to, defaults to a
+    /// temporary directory if not set.
+    pub persist_doctests: Option<PathBuf>,
 
     // Options that affect the documentation process
 
@@ -121,6 +124,7 @@
             .field("lint_cap", &self.lint_cap)
             .field("should_test", &self.should_test)
             .field("test_args", &self.test_args)
+            .field("persist_doctests", &self.persist_doctests)
             .field("default_passes", &self.default_passes)
             .field("manual_passes", &self.manual_passes)
             .field("display_warnings", &self.display_warnings)
@@ -431,6 +435,7 @@
         let enable_index_page = matches.opt_present("enable-index-page") || index_page.is_some();
         let static_root_path = matches.opt_str("static-root-path");
         let generate_search_filter = !matches.opt_present("disable-per-crate-search");
+        let persist_doctests = matches.opt_str("persist-doctests").map(PathBuf::from);
 
         let (lint_opts, describe_lints, lint_cap) = get_cmd_lint_options(matches, error_format);
 
@@ -456,6 +461,7 @@
             manual_passes,
             display_warnings,
             crate_version,
+            persist_doctests,
             render_options: RenderOptions {
                 output,
                 external_html,
diff --git a/src/librustdoc/core.rs b/src/librustdoc/core.rs
index 8bb0dc9..7069f04 100644
--- a/src/librustdoc/core.rs
+++ b/src/librustdoc/core.rs
@@ -51,9 +51,6 @@
     /// The stack of module NodeIds up till this point
     pub crate_name: Option<String>,
     pub cstore: Rc<CStore>,
-    // Note that external items for which `doc(hidden)` applies to are shown as
-    // non-reachable while local items aren't. This is because we're reusing
-    // the access levels from crateanalysis.
     /// Later on moved into `html::render::CACHE_KEY`
     pub renderinfo: RefCell<RenderInfo>,
     /// Later on moved through `clean::Crate` into `html::render::CACHE_KEY`
@@ -451,7 +448,6 @@
                                                         None,
                                                         &name,
                                                         None,
-                                                        resolve::MakeGlobMap::No,
                                                         &resolver_arenas,
                                                         &mut crate_loader,
                                                         |_| Ok(()));
@@ -469,15 +465,13 @@
             freevars: resolver.freevars.clone(),
             export_map: resolver.export_map.clone(),
             trait_map: resolver.trait_map.clone(),
+            glob_map: resolver.glob_map.clone(),
             maybe_unused_trait_imports: resolver.maybe_unused_trait_imports.clone(),
             maybe_unused_extern_crates: resolver.maybe_unused_extern_crates.clone(),
             extern_prelude: resolver.extern_prelude.iter().map(|(ident, entry)| {
                 (ident.name, entry.introduced_by_item)
             }).collect(),
         };
-        let analysis = ty::CrateAnalysis {
-            glob_map: if resolver.make_glob_map { Some(resolver.glob_map.clone()) } else { None },
-        };
 
         let mut arenas = AllArenas::new();
         let hir_map = hir_map::map_crate(&sess, &*cstore, &mut hir_forest, &defs);
@@ -493,12 +487,11 @@
                                                         &sess,
                                                         &*cstore,
                                                         hir_map,
-                                                        analysis,
                                                         resolutions,
                                                         &mut arenas,
                                                         &name,
                                                         &output_filenames,
-                                                        |tcx, _, _, result| {
+                                                        |tcx, _, result| {
             if result.is_err() {
                 sess.fatal("Compilation failed, aborting rustdoc");
             }
diff --git a/src/librustdoc/html/render.rs b/src/librustdoc/html/render.rs
index 31e06cb..ad1659b 100644
--- a/src/librustdoc/html/render.rs
+++ b/src/librustdoc/html/render.rs
@@ -309,7 +309,7 @@
 
     // Note that external items for which `doc(hidden)` applies to are shown as
     // non-reachable while local items aren't. This is because we're reusing
-    // the access levels from crateanalysis.
+    // the access levels from the privacy check pass.
     pub access_levels: AccessLevels<DefId>,
 
     /// The version of the crate being documented, if given from the `--crate-version` flag.
@@ -741,8 +741,8 @@
 
     let mut crate_data = BTreeMap::new();
     crate_data.insert("doc".to_owned(), Json::String(crate_doc));
-    crate_data.insert("items".to_owned(), Json::Array(crate_items));
-    crate_data.insert("paths".to_owned(), Json::Array(crate_paths));
+    crate_data.insert("i".to_owned(), Json::Array(crate_items));
+    crate_data.insert("p".to_owned(), Json::Array(crate_paths));
 
     // Collect the index into a string
     format!("searchIndex[{}] = {};",
@@ -914,12 +914,44 @@
     write(cx.dst.join("COPYRIGHT.txt"),
           static_files::COPYRIGHT)?;
 
-    fn collect(path: &Path, krate: &str, key: &str) -> io::Result<(Vec<String>, Vec<String>)> {
+    fn collect(
+        path: &Path,
+        krate: &str,
+        key: &str,
+        for_search_index: bool,
+    ) -> io::Result<(Vec<String>, Vec<String>, Vec<String>)> {
+        use minifier::js;
+
         let mut ret = Vec::new();
         let mut krates = Vec::new();
+        let mut variables = Vec::new();
+
+        let mut krate = krate.to_owned();
+
         if path.exists() {
             for line in BufReader::new(File::open(path)?).lines() {
                 let line = line?;
+                if for_search_index && line.starts_with("var r_") {
+                    variables.push(line.clone());
+                    // We need to check if the crate name has been put into a variable as well.
+                    let tokens = js::simple_minify(&line).apply(js::clean_tokens);
+                    let mut pos = 0;
+                    while pos < tokens.len() {
+                        if let Some((var_pos, Some(value_pos))) =
+                                js::get_variable_name_and_value_positions(&tokens, pos) {
+                            if let Some(s) = tokens.0[value_pos].get_string() {
+                                if &s[1..s.len() - 1] == krate {
+                                    if let Some(var) = tokens[var_pos].get_other() {
+                                        krate = var.to_owned();
+                                        break
+                                    }
+                                }
+                            }
+                        }
+                        pos += 1;
+                    }
+                    continue;
+                }
                 if !line.starts_with(key) {
                     continue;
                 }
@@ -933,7 +965,7 @@
                                                  .unwrap_or_else(|| String::new()));
             }
         }
-        Ok((ret, krates))
+        Ok((ret, krates, variables))
     }
 
     fn show_item(item: &IndexItem, krate: &str) -> String {
@@ -948,7 +980,7 @@
 
     let dst = cx.dst.join("aliases.js");
     {
-        let (mut all_aliases, _) = try_err!(collect(&dst, &krate.name, "ALIASES"), &dst);
+        let (mut all_aliases, _, _) = try_err!(collect(&dst, &krate.name, "ALIASES", false), &dst);
         let mut w = try_err!(File::create(&dst), &dst);
         let mut output = String::with_capacity(100);
         for (alias, items) in &cache.aliases {
@@ -1035,34 +1067,38 @@
         }
 
         let dst = cx.dst.join("source-files.js");
-        let (mut all_sources, _krates) = try_err!(collect(&dst, &krate.name, "sourcesIndex"), &dst);
+        let (mut all_sources, _krates, _) = try_err!(collect(&dst, &krate.name, "sourcesIndex",
+                                                             false),
+                                                     &dst);
         all_sources.push(format!("sourcesIndex[\"{}\"] = {};",
                                  &krate.name,
                                  hierarchy.to_json_string()));
         all_sources.sort();
         let mut w = try_err!(File::create(&dst), &dst);
         try_err!(writeln!(&mut w,
-                          "var N = null;var sourcesIndex = {{}};\n{}",
+                          "var N = null;var sourcesIndex = {{}};\n{}\ncreateSourceSidebar();",
                           all_sources.join("\n")),
                  &dst);
     }
 
     // Update the search index
     let dst = cx.dst.join("search-index.js");
-    let (mut all_indexes, mut krates) = try_err!(collect(&dst, &krate.name, "searchIndex"), &dst);
+    let (mut all_indexes, mut krates, variables) = try_err!(collect(&dst,
+                                                                    &krate.name,
+                                                                    "searchIndex",
+                                                                    true), &dst);
     all_indexes.push(search_index);
 
     // Sort the indexes by crate so the file will be generated identically even
     // with rustdoc running in parallel.
     all_indexes.sort();
     let mut w = try_err!(File::create(&dst), &dst);
-    try_err!(writeln!(&mut w, "var N = null;var searchIndex = {{}};"), &dst);
-    for index in &all_indexes {
-        try_err!(write_minify_replacer(&mut w, &*index, options.enable_minification,
-                                       &[(minifier::js::Keyword::Null, "N")]),
-                 &dst);
-    }
-    try_err!(writeln!(&mut w, "initSearch(searchIndex);addSearchOptions(searchIndex);"), &dst);
+    try_err!(writeln!(&mut w, "var N=null,E=\"\",T=\"t\",U=\"u\",searchIndex={{}};"), &dst);
+    try_err!(write_minify_replacer(&mut w,
+                                   &format!("{}\n{}", variables.join(""), all_indexes.join("\n")),
+                                   options.enable_minification),
+             &dst);
+    try_err!(write!(&mut w, "initSearch(searchIndex);addSearchOptions(searchIndex);"), &dst);
 
     if options.enable_index_page {
         if let Some(index_page) = options.index_page.clone() {
@@ -1161,8 +1197,9 @@
                             remote_item_type.css_class(),
                             remote_path[remote_path.len() - 1]));
 
-        let (mut all_implementors, _) = try_err!(collect(&mydst, &krate.name, "implementors"),
-                                                 &mydst);
+        let (mut all_implementors, _, _) = try_err!(collect(&mydst, &krate.name, "implementors",
+                                                            false),
+                                                    &mydst);
         all_implementors.push(implementors);
         // Sort the implementors by crate so the file will be generated
         // identically even with rustdoc running in parallel.
@@ -1216,14 +1253,50 @@
     }
 }
 
-fn write_minify_replacer<W: Write>(dst: &mut W,
-                                   contents: &str,
-                                   enable_minification: bool,
-                                   keywords_to_replace: &[(minifier::js::Keyword, &str)])
-                                   -> io::Result<()> {
+fn write_minify_replacer<W: Write>(
+    dst: &mut W,
+    contents: &str,
+    enable_minification: bool,
+) -> io::Result<()> {
+    use minifier::js::{Keyword, ReservedChar, Token};
+
     if enable_minification {
         writeln!(dst, "{}",
-                 minifier::js::minify_and_replace_keywords(contents, keywords_to_replace))
+                 minifier::js::simple_minify(contents)
+                              .apply(|f| {
+                                  // We keep backlines.
+                                  minifier::js::clean_tokens_except(f, |c| {
+                                      c.get_char() != Some(ReservedChar::Backline)
+                                  })
+                              })
+                              .apply(|f| {
+                                  minifier::js::replace_token_with(f, |t| {
+                                      match *t {
+                                          Token::Keyword(Keyword::Null) => Some(Token::Other("N")),
+                                          Token::String(s) => {
+                                              let s = &s[1..s.len() -1]; // The quotes are included
+                                              if s.is_empty() {
+                                                  Some(Token::Other("E"))
+                                              } else if s == "t" {
+                                                  Some(Token::Other("T"))
+                                              } else if s == "u" {
+                                                  Some(Token::Other("U"))
+                                              } else {
+                                                  None
+                                              }
+                                          }
+                                          _ => None,
+                                      }
+                                  })
+                              })
+                              .apply(|f| {
+                                  // We add a backline after the newly created variables.
+                                  minifier::js::aggregate_strings_with_separation(
+                                      f,
+                                      Token::Char(ReservedChar::Backline),
+                                  )
+                              })
+                              .to_string())
     } else {
         writeln!(dst, "{}", contents)
     }
diff --git a/src/librustdoc/html/static/main.js b/src/librustdoc/html/static/main.js
index 9db1c68..82604cc 100644
--- a/src/librustdoc/html/static/main.js
+++ b/src/librustdoc/html/static/main.js
@@ -1555,10 +1555,10 @@
                 //              (String) description,
                 //              (Number | null) the parent path index to `paths`]
                 //              (Object | null) the type of the function (if any)
-                var items = rawSearchIndex[crate].items;
+                var items = rawSearchIndex[crate].i;
                 // an array of [(Number) item type,
                 //              (String) name]
-                var paths = rawSearchIndex[crate].paths;
+                var paths = rawSearchIndex[crate].p;
 
                 // convert `paths` into an object form
                 var len = paths.length;
@@ -2431,7 +2431,7 @@
             return;
         }
         var crates_text = [];
-        if (crates.length > 1) {
+        if (Object.keys(crates).length > 1) {
             for (var crate in crates) {
                 if (crates.hasOwnProperty(crate)) {
                     crates_text.push(crate);
diff --git a/src/librustdoc/html/static/rustdoc.css b/src/librustdoc/html/static/rustdoc.css
index 8a8b7ad..3676549 100644
--- a/src/librustdoc/html/static/rustdoc.css
+++ b/src/librustdoc/html/static/rustdoc.css
@@ -391,10 +391,6 @@
 	display: block;
 }
 
-.in-band, code {
-	z-index: -5;
-}
-
 .invisible {
 	width: 100%;
 	display: inline-block;
diff --git a/src/librustdoc/html/static/source-script.js b/src/librustdoc/html/static/source-script.js
index 0affe1c..c5d6fa1 100644
--- a/src/librustdoc/html/static/source-script.js
+++ b/src/librustdoc/html/static/source-script.js
@@ -137,5 +137,3 @@
 
     main.insertBefore(sidebar, main.firstChild);
 }
-
-createSourceSidebar();
diff --git a/src/librustdoc/html/static/themes/dark.css b/src/librustdoc/html/static/themes/dark.css
index 1390be7..52a3096 100644
--- a/src/librustdoc/html/static/themes/dark.css
+++ b/src/librustdoc/html/static/themes/dark.css
@@ -82,12 +82,6 @@
 	border-bottom-color: #ddd;
 }
 
-:target { background: #494a3d; }
-
-:target > .in-band {
-	background: #494a3d;
-}
-
 .content .method .where,
 .content .fn .where,
 .content .where.fmt-newline {
@@ -252,7 +246,7 @@
 	color: #999;
 }
 
-:target > code {
+:target > code, :target > .in-band {
 	background-color: #494a3d;
 }
 
diff --git a/src/librustdoc/html/static/themes/light.css b/src/librustdoc/html/static/themes/light.css
index 2b04dd2..d20fea6 100644
--- a/src/librustdoc/html/static/themes/light.css
+++ b/src/librustdoc/html/static/themes/light.css
@@ -84,12 +84,6 @@
 	border-bottom-color: #ddd;
 }
 
-:target { background: #FDFFD3; }
-
-:target > .in-band {
-	background: #FDFFD3;
-}
-
 .content .method .where,
 .content .fn .where,
 .content .where.fmt-newline {
@@ -247,7 +241,7 @@
 	color: #999;
 }
 
-:target > code {
+:target > code, :target > .in-band {
 	background: #FDFFD3;
 }
 
diff --git a/src/librustdoc/lib.rs b/src/librustdoc/lib.rs
index 1b6d7e8..4bbc01d 100644
--- a/src/librustdoc/lib.rs
+++ b/src/librustdoc/lib.rs
@@ -341,6 +341,12 @@
                       "disable-per-crate-search",
                       "disables generating the crate selector on the search box")
         }),
+        unstable("persist-doctests", |o| {
+             o.optopt("",
+                       "persist-doctests",
+                       "Directory to persist doctest executables into",
+                       "PATH")
+        }),
     ]
 }
 
diff --git a/src/librustdoc/markdown.rs b/src/librustdoc/markdown.rs
index da56194..65a96e9 100644
--- a/src/librustdoc/markdown.rs
+++ b/src/librustdoc/markdown.rs
@@ -142,7 +142,7 @@
                                        options.libs, options.codegen_options, options.externs,
                                        true, opts, options.maybe_sysroot, None,
                                        Some(options.input),
-                                       options.linker, options.edition);
+                                       options.linker, options.edition, options.persist_doctests);
     collector.set_position(DUMMY_SP);
     let codes = ErrorCodes::from(UnstableFeatures::from_environment().is_nightly_build());
     let res = find_testable_code(&input_str, &mut collector, codes);
diff --git a/src/librustdoc/test.rs b/src/librustdoc/test.rs
index 1f19fa2..0b9fbc8 100644
--- a/src/librustdoc/test.rs
+++ b/src/librustdoc/test.rs
@@ -6,7 +6,6 @@
 use rustc_driver::driver::phase_2_configure_and_expand;
 use rustc_metadata::cstore::CStore;
 use rustc_metadata::dynamic_lib::DynamicLibrary;
-use rustc_resolve::MakeGlobMap;
 use rustc::hir;
 use rustc::hir::intravisit;
 use rustc::session::{self, CompileIncomplete, config};
@@ -100,7 +99,6 @@
                 None,
                 "rustdoc-test",
                 None,
-                MakeGlobMap::No,
                 |_| Ok(()),
             ).expect("phase_2_configure_and_expand aborted in rustdoc!")
         };
@@ -122,7 +120,8 @@
             Some(source_map),
             None,
             options.linker,
-            options.edition
+            options.edition,
+            options.persist_doctests,
         );
 
         {
@@ -186,7 +185,8 @@
             cg: CodegenOptions, externs: Externs,
             should_panic: bool, no_run: bool, as_test_harness: bool,
             compile_fail: bool, mut error_codes: Vec<String>, opts: &TestOptions,
-            maybe_sysroot: Option<PathBuf>, linker: Option<PathBuf>, edition: Edition) {
+            maybe_sysroot: Option<PathBuf>, linker: Option<PathBuf>, edition: Edition,
+            persist_doctests: Option<PathBuf>) {
     // The test harness wants its own `main` and top-level functions, so
     // never wrap the test in `fn main() { ... }`.
     let (test, line_offset) = make_test(test, Some(cratename), as_test_harness, opts);
@@ -251,6 +251,20 @@
     let old = io::set_panic(Some(box Sink(data.clone())));
     let _bomb = Bomb(data.clone(), old.unwrap_or(box io::stdout()));
 
+    enum DirState {
+        Temp(tempfile::TempDir),
+        Perm(PathBuf),
+    }
+
+    impl DirState {
+        fn path(&self) -> &std::path::Path {
+            match self {
+                DirState::Temp(t) => t.path(),
+                DirState::Perm(p) => p.as_path(),
+            }
+        }
+    }
+
     let (libdir, outdir, compile_result) = driver::spawn_thread_pool(sessopts, |sessopts| {
         let source_map = Lrc::new(SourceMap::new(sessopts.file_path_mapping()));
         let emitter = errors::emitter::EmitterWriter::new(box Sink(data.clone()),
@@ -269,7 +283,26 @@
         rustc_lint::register_builtins(&mut sess.lint_store.borrow_mut(), Some(&sess));
 
         let outdir = Mutex::new(
-            TempFileBuilder::new().prefix("rustdoctest").tempdir().expect("rustdoc needs a tempdir")
+            if let Some(mut path) = persist_doctests {
+                path.push(format!("{}_{}",
+                    filename
+                        .to_string()
+                        .rsplit('/')
+                        .next()
+                        .unwrap()
+                        .replace(".", "_"),
+                        line)
+                );
+                std::fs::create_dir_all(&path)
+                    .expect("Couldn't create directory for doctest executables");
+
+                DirState::Perm(path)
+            } else {
+                DirState::Temp(TempFileBuilder::new()
+                                .prefix("rustdoctest")
+                                .tempdir()
+                                .expect("rustdoc needs a tempdir"))
+            }
         );
         let libdir = sess.target_filesearch(PathKind::All).get_lib_path();
         let mut control = driver::CompileController::basic();
@@ -631,13 +664,15 @@
     filename: Option<PathBuf>,
     linker: Option<PathBuf>,
     edition: Edition,
+    persist_doctests: Option<PathBuf>,
 }
 
 impl Collector {
     pub fn new(cratename: String, cfgs: Vec<String>, libs: Vec<SearchPath>, cg: CodegenOptions,
                externs: Externs, use_headers: bool, opts: TestOptions,
                maybe_sysroot: Option<PathBuf>, source_map: Option<Lrc<SourceMap>>,
-               filename: Option<PathBuf>, linker: Option<PathBuf>, edition: Edition) -> Collector {
+               filename: Option<PathBuf>, linker: Option<PathBuf>, edition: Edition,
+               persist_doctests: Option<PathBuf>) -> Collector {
         Collector {
             tests: Vec::new(),
             names: Vec::new(),
@@ -654,6 +689,7 @@
             filename,
             linker,
             edition,
+            persist_doctests,
         }
     }
 
@@ -697,6 +733,8 @@
         let maybe_sysroot = self.maybe_sysroot.clone();
         let linker = self.linker.clone();
         let edition = config.edition.unwrap_or(self.edition);
+        let persist_doctests = self.persist_doctests.clone();
+
         debug!("Creating test {}: {}", name, test);
         self.tests.push(testing::TestDescAndFn {
             desc: testing::TestDesc {
@@ -729,7 +767,8 @@
                                  &opts,
                                  maybe_sysroot,
                                  linker,
-                                 edition)
+                                 edition,
+                                 persist_doctests)
                     }))
                 } {
                     Ok(()) => (),
diff --git a/src/libserialize/json.rs b/src/libserialize/json.rs
index 3c289596..362b457 100644
--- a/src/libserialize/json.rs
+++ b/src/libserialize/json.rs
@@ -1,4 +1,4 @@
-// Rust JSON serialization library
+// Rust JSON serialization library.
 // Copyright (c) 2011 Google Inc.
 
 #![forbid(non_camel_case_types)]
diff --git a/src/libstd/collections/hash/set.rs b/src/libstd/collections/hash/set.rs
index 9214590..c55dd04 100644
--- a/src/libstd/collections/hash/set.rs
+++ b/src/libstd/collections/hash/set.rs
@@ -410,9 +410,16 @@
     /// ```
     #[stable(feature = "rust1", since = "1.0.0")]
     pub fn intersection<'a>(&'a self, other: &'a HashSet<T, S>) -> Intersection<'a, T, S> {
-        Intersection {
-            iter: self.iter(),
-            other,
+        if self.len() <= other.len() {
+            Intersection {
+                iter: self.iter(),
+                other,
+            }
+        } else {
+            Intersection {
+                iter: other.iter(),
+                other: self,
+            }
         }
     }
 
@@ -436,7 +443,15 @@
     /// ```
     #[stable(feature = "rust1", since = "1.0.0")]
     pub fn union<'a>(&'a self, other: &'a HashSet<T, S>) -> Union<'a, T, S> {
-        Union { iter: self.iter().chain(other.difference(self)) }
+        if self.len() <= other.len() {
+            Union {
+                iter: self.iter().chain(other.difference(self)),
+            }
+        } else {
+            Union {
+                iter: other.iter().chain(self.difference(other)),
+            }
+        }
     }
 
     /// Returns the number of elements in the set.
@@ -584,7 +599,11 @@
     /// ```
     #[stable(feature = "rust1", since = "1.0.0")]
     pub fn is_disjoint(&self, other: &HashSet<T, S>) -> bool {
-        self.iter().all(|v| !other.contains(v))
+        if self.len() <= other.len() {
+            self.iter().all(|v| !other.contains(v))
+        } else {
+            other.iter().all(|v| !self.contains(v))
+        }
     }
 
     /// Returns `true` if the set is a subset of another,
@@ -1494,6 +1513,7 @@
     fn test_intersection() {
         let mut a = HashSet::new();
         let mut b = HashSet::new();
+        assert!(a.intersection(&b).next().is_none());
 
         assert!(a.insert(11));
         assert!(a.insert(1));
@@ -1518,6 +1538,22 @@
             i += 1
         }
         assert_eq!(i, expected.len());
+
+        assert!(a.insert(9)); // make a bigger than b
+
+        i = 0;
+        for x in a.intersection(&b) {
+            assert!(expected.contains(x));
+            i += 1
+        }
+        assert_eq!(i, expected.len());
+
+        i = 0;
+        for x in b.intersection(&a) {
+            assert!(expected.contains(x));
+            i += 1
+        }
+        assert_eq!(i, expected.len());
     }
 
     #[test]
@@ -1573,11 +1609,11 @@
     fn test_union() {
         let mut a = HashSet::new();
         let mut b = HashSet::new();
+        assert!(a.union(&b).next().is_none());
+        assert!(b.union(&a).next().is_none());
 
         assert!(a.insert(1));
         assert!(a.insert(3));
-        assert!(a.insert(5));
-        assert!(a.insert(9));
         assert!(a.insert(11));
         assert!(a.insert(16));
         assert!(a.insert(19));
@@ -1597,6 +1633,23 @@
             i += 1
         }
         assert_eq!(i, expected.len());
+
+        assert!(a.insert(9)); // make a bigger than b
+        assert!(a.insert(5));
+
+        i = 0;
+        for x in a.union(&b) {
+            assert!(expected.contains(x));
+            i += 1
+        }
+        assert_eq!(i, expected.len());
+
+        i = 0;
+        for x in b.union(&a) {
+            assert!(expected.contains(x));
+            i += 1
+        }
+        assert_eq!(i, expected.len());
     }
 
     #[test]
diff --git a/src/libstd/ffi/mod.rs b/src/libstd/ffi/mod.rs
index 62081e7..7a38f0e 100644
--- a/src/libstd/ffi/mod.rs
+++ b/src/libstd/ffi/mod.rs
@@ -169,7 +169,7 @@
 #[unstable(feature = "c_variadic",
            reason = "the `c_variadic` feature has not been properly tested on \
                      all supported platforms",
-           issue = "27745")]
+           issue = "44930")]
 pub use core::ffi::VaList;
 
 mod c_str;
diff --git a/src/libstd/fs.rs b/src/libstd/fs.rs
index 119b3f7..3538816 100644
--- a/src/libstd/fs.rs
+++ b/src/libstd/fs.rs
@@ -1121,7 +1121,9 @@
     /// writing.
     ///
     /// This operation does **not** modify the filesystem. To modify the
-    /// filesystem use the `fs::set_permissions` function.
+    /// filesystem use the [`fs::set_permissions`] function.
+    ///
+    /// [`fs::set_permissions`]: fn.set_permissions.html
     ///
     /// # Examples
     ///
@@ -1639,10 +1641,15 @@
 ///
 /// The `dst` path will be a symbolic link pointing to the `src` path.
 /// On Windows, this will be a file symlink, not a directory symlink;
-/// for this reason, the platform-specific `std::os::unix::fs::symlink`
-/// and `std::os::windows::fs::{symlink_file, symlink_dir}` should be
+/// for this reason, the platform-specific [`std::os::unix::fs::symlink`]
+/// and [`std::os::windows::fs::symlink_file`] or [`symlink_dir`] should be
 /// used instead to make the intent explicit.
 ///
+/// [`std::os::unix::fs::symlink`]: ../os/unix/fs/fn.symlink.html
+/// [`std::os::windows::fs::symlink_file`]: ../os/windows/fs/fn.symlink_file.html
+/// [`symlink_dir`]: ../os/windows/fs/fn.symlink_dir.html
+///
+///
 /// # Examples
 ///
 /// ```no_run
@@ -1795,7 +1802,7 @@
 /// * If any directory in the path specified by `path`
 /// does not already exist and it could not be created otherwise. The specific
 /// error conditions for when a directory is being created (after it is
-/// determined to not exist) are outlined by `fs::create_dir`.
+/// determined to not exist) are outlined by [`fs::create_dir`].
 ///
 /// Notable exception is made for situations where any of the directories
 /// specified in the `path` could not be created as it was being created concurrently.
@@ -1803,6 +1810,8 @@
 /// concurrently from multiple threads or processes is guaranteed not to fail
 /// due to a race condition with itself.
 ///
+/// [`fs::create_dir`]: fn.create_dir.html
+///
 /// # Examples
 ///
 /// ```no_run
@@ -1868,7 +1877,10 @@
 ///
 /// # Errors
 ///
-/// See `file::remove_file` and `fs::remove_dir`.
+/// See [`fs::remove_file`] and [`fs::remove_dir`].
+///
+/// [`fs::remove_file`]:  fn.remove_file.html
+/// [`fs::remove_dir`]: fn.remove_dir.html
 ///
 /// # Examples
 ///
diff --git a/src/libstd/lib.rs b/src/libstd/lib.rs
index 41f1ac8..83db3f3 100644
--- a/src/libstd/lib.rs
+++ b/src/libstd/lib.rs
@@ -286,6 +286,7 @@
 #![feature(staged_api)]
 #![feature(stmt_expr_attributes)]
 #![feature(str_internals)]
+#![feature(renamed_spin_loop)]
 #![feature(rustc_private)]
 #![feature(thread_local)]
 #![feature(toowned_clone_into)]
diff --git a/src/libstd/memchr.rs b/src/libstd/memchr.rs
index b43a299..9f44c67 100644
--- a/src/libstd/memchr.rs
+++ b/src/libstd/memchr.rs
@@ -1,5 +1,4 @@
-//
-// Original implementation taken from rust-memchr
+// Original implementation taken from rust-memchr.
 // Copyright 2015 Andrew Gallant, bluss and Nicolas Koch
 
 /// A safe interface to `memchr`.
diff --git a/src/libstd/prelude/mod.rs b/src/libstd/prelude/mod.rs
index ec8318f..bf689ba 100644
--- a/src/libstd/prelude/mod.rs
+++ b/src/libstd/prelude/mod.rs
@@ -44,8 +44,8 @@
 //! The current version of the prelude (version 1) lives in
 //! [`std::prelude::v1`], and re-exports the following.
 //!
-//! * [`std::marker`]::{[`Copy`], [`Send`], [`Sized`], [`Sync`]}. The marker
-//!   traits indicate fundamental properties of types.
+//! * [`std::marker`]::{[`Copy`], [`Send`], [`Sized`], [`Sync`], [`Unpin`]}. The
+//!   marker traits indicate fundamental properties of types.
 //! * [`std::ops`]::{[`Drop`], [`Fn`], [`FnMut`], [`FnOnce`]}. Various
 //!   operations for both destructors and overloading `()`.
 //! * [`std::mem`]::[`drop`][`mem::drop`], a convenience function for explicitly
@@ -108,6 +108,7 @@
 //! [`Sync`]: ../marker/trait.Sync.html
 //! [`ToOwned`]: ../borrow/trait.ToOwned.html
 //! [`ToString`]: ../string/trait.ToString.html
+//! [`Unpin`]: ../marker/trait.Unpin.html
 //! [`Vec`]: ../vec/struct.Vec.html
 //! [`Clone::clone`]: ../clone/trait.Clone.html#tymethod.clone
 //! [`mem::drop`]: ../mem/fn.drop.html
diff --git a/src/libstd/sys/cloudabi/abi/cloudabi.rs b/src/libstd/sys/cloudabi/abi/cloudabi.rs
index aac1804..0bf8c2d 100644
--- a/src/libstd/sys/cloudabi/abi/cloudabi.rs
+++ b/src/libstd/sys/cloudabi/abi/cloudabi.rs
@@ -1,4 +1,4 @@
-// Copyright (c) 2016-2017 Nuxi (https://nuxi.nl/) and contributors.
+// Copyright (c) 2016-2017 Nuxi <https://nuxi.nl/> and contributors.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions
diff --git a/src/libstd/sys/redox/memchr.rs b/src/libstd/sys/redox/memchr.rs
index 409d3a7..d2bfcce 100644
--- a/src/libstd/sys/redox/memchr.rs
+++ b/src/libstd/sys/redox/memchr.rs
@@ -1,5 +1,4 @@
-//
-// Original implementation taken from rust-memchr
+// Original implementation taken from rust-memchr.
 // Copyright 2015 Andrew Gallant, bluss and Nicolas Koch
 
 pub use core::slice::memchr::{memchr, memrchr};
diff --git a/src/libstd/sys/sgx/abi/entry.S b/src/libstd/sys/sgx/abi/entry.S
index 8dad6ee..ac7f95d 100644
--- a/src/libstd/sys/sgx/abi/entry.S
+++ b/src/libstd/sys/sgx/abi/entry.S
@@ -4,6 +4,16 @@
 .global IMAGE_BASE
 IMAGE_BASE:
 
+.section ".note.x86_64-fortanix-unknown-sgx", "", @note
+    .align 4
+    .long 1f - 0f              /* name length (not including padding) */
+    .long 3f - 2f              /* desc length (not including padding) */
+    .long 1                    /* type = NT_VERSION */
+0:  .asciz "toolchain-version" /* name */
+1:  .align 4
+2:  .long 0                    /* desc - toolchain version number, 32-bit LE */
+3:  .align 4
+
 .section .rodata
 /*  The XSAVE area needs to be a large chunk of readable memory, but since we are */
 /*  going to restore everything to its initial state (XSTATE_BV=0), only certain */
diff --git a/src/libstd/sys/sgx/time.rs b/src/libstd/sys/sgx/time.rs
index 10fe72d..407fe72 100644
--- a/src/libstd/sys/sgx/time.rs
+++ b/src/libstd/sys/sgx/time.rs
@@ -25,6 +25,14 @@
     pub fn checked_sub_duration(&self, other: &Duration) -> Option<Instant> {
         Some(Instant(self.0.checked_sub(*other)?))
     }
+
+    pub fn actually_monotonic() -> bool {
+        false
+    }
+
+    pub const fn zero() -> Instant {
+        Instant(Duration::from_secs(0))
+    }
 }
 
 impl SystemTime {
diff --git a/src/libstd/sys/sgx/waitqueue.rs b/src/libstd/sys/sgx/waitqueue.rs
index a473820..51c00a1 100644
--- a/src/libstd/sys/sgx/waitqueue.rs
+++ b/src/libstd/sys/sgx/waitqueue.rs
@@ -456,6 +456,7 @@
         }
     }
 
+    /// Lock the Mutex or return false.
     pub macro try_lock_or_false {
         ($e:expr) => {
             if let Some(v) = $e.try_lock() {
diff --git a/src/libstd/sys/unix/ext/fs.rs b/src/libstd/sys/unix/ext/fs.rs
index 7930dd0..e962d09 100644
--- a/src/libstd/sys/unix/ext/fs.rs
+++ b/src/libstd/sys/unix/ext/fs.rs
@@ -84,7 +84,6 @@
     /// # Examples
     ///
     /// ```no_run
-    /// #![feature(rw_exact_all_at)]
     /// use std::io;
     /// use std::fs::File;
     /// use std::os::unix::prelude::FileExt;
@@ -99,7 +98,7 @@
     ///     Ok(())
     /// }
     /// ```
-    #[unstable(feature = "rw_exact_all_at", issue = "51984")]
+    #[stable(feature = "rw_exact_all_at", since = "1.33.0")]
     fn read_exact_at(&self, mut buf: &mut [u8], mut offset: u64) -> io::Result<()> {
         while !buf.is_empty() {
             match self.read_at(buf, offset) {
@@ -181,7 +180,6 @@
     /// # Examples
     ///
     /// ```no_run
-    /// #![feature(rw_exact_all_at)]
     /// use std::fs::File;
     /// use std::io;
     /// use std::os::unix::prelude::FileExt;
@@ -194,7 +192,7 @@
     ///     Ok(())
     /// }
     /// ```
-    #[unstable(feature = "rw_exact_all_at", issue = "51984")]
+    #[stable(feature = "rw_exact_all_at", since = "1.33.0")]
     fn write_all_at(&self, mut buf: &[u8], mut offset: u64) -> io::Result<()> {
         while !buf.is_empty() {
             match self.write_at(buf, offset) {
diff --git a/src/libstd/sys/unix/memchr.rs b/src/libstd/sys/unix/memchr.rs
index 05bfecd..ec04a22 100644
--- a/src/libstd/sys/unix/memchr.rs
+++ b/src/libstd/sys/unix/memchr.rs
@@ -1,5 +1,4 @@
-//
-// Original implementation taken from rust-memchr
+// Original implementation taken from rust-memchr.
 // Copyright 2015 Andrew Gallant, bluss and Nicolas Koch
 
 pub fn memchr(needle: u8, haystack: &[u8]) -> Option<usize> {
diff --git a/src/libstd/sys/windows/memchr.rs b/src/libstd/sys/windows/memchr.rs
index 87b1aa2..b9e5bcc 100644
--- a/src/libstd/sys/windows/memchr.rs
+++ b/src/libstd/sys/windows/memchr.rs
@@ -1,6 +1,5 @@
-//
-// Original implementation taken from rust-memchr
+// Original implementation taken from rust-memchr.
 // Copyright 2015 Andrew Gallant, bluss and Nicolas Koch
 
-// Fallback memchr is fastest on windows
+// Fallback memchr is fastest on Windows.
 pub use core::slice::memchr::{memchr, memrchr};
diff --git a/src/libsyntax/ast.rs b/src/libsyntax/ast.rs
index e3a8980..bbcaaac 100644
--- a/src/libsyntax/ast.rs
+++ b/src/libsyntax/ast.rs
@@ -15,7 +15,7 @@
 use source_map::{dummy_spanned, respan, Spanned};
 use symbol::{keywords, Symbol};
 use syntax_pos::{Span, DUMMY_SP};
-use tokenstream::{ThinTokenStream, TokenStream};
+use tokenstream::TokenStream;
 use ThinVec;
 
 use rustc_data_structures::fx::FxHashSet;
@@ -853,13 +853,13 @@
 
 pub type SpannedIdent = Spanned<Ident>;
 
-#[derive(Clone, RustcEncodable, RustcDecodable, Debug, Copy)]
+#[derive(Clone, PartialEq, RustcEncodable, RustcDecodable, Debug, Copy)]
 pub enum BlockCheckMode {
     Default,
     Unsafe(UnsafeSource),
 }
 
-#[derive(Clone, RustcEncodable, RustcDecodable, Debug, Copy)]
+#[derive(Clone, PartialEq, RustcEncodable, RustcDecodable, Debug, Copy)]
 pub enum UnsafeSource {
     CompilerGenerated,
     UserProvided,
@@ -1216,7 +1216,7 @@
 pub struct Mac_ {
     pub path: Path,
     pub delim: MacDelimiter,
-    pub tts: ThinTokenStream,
+    pub tts: TokenStream,
 }
 
 #[derive(Copy, Clone, PartialEq, Eq, RustcEncodable, RustcDecodable, Debug)]
@@ -1228,13 +1228,13 @@
 
 impl Mac_ {
     pub fn stream(&self) -> TokenStream {
-        self.tts.stream()
+        self.tts.clone()
     }
 }
 
 #[derive(Clone, RustcEncodable, RustcDecodable, Debug)]
 pub struct MacroDef {
-    pub tokens: ThinTokenStream,
+    pub tokens: TokenStream,
     pub legacy: bool,
 }
 
diff --git a/src/libsyntax/attr/builtin.rs b/src/libsyntax/attr/builtin.rs
index 98585dc..15e4804 100644
--- a/src/libsyntax/attr/builtin.rs
+++ b/src/libsyntax/attr/builtin.rs
@@ -436,9 +436,6 @@
                 }
                 _ => unreachable!()
             }
-        } else {
-            span_err!(diagnostic, attr.span(), E0548, "incorrect stability attribute type");
-            continue
         }
     }
 
diff --git a/src/libsyntax/attr/mod.rs b/src/libsyntax/attr/mod.rs
index d03563f..f6d7590 100644
--- a/src/libsyntax/attr/mod.rs
+++ b/src/libsyntax/attr/mod.rs
@@ -481,28 +481,33 @@
     {
         // FIXME: Share code with `parse_path`.
         let ident = match tokens.next() {
-            Some(TokenTree::Token(span, Token::Ident(ident, _))) => {
-                if let Some(TokenTree::Token(_, Token::ModSep)) = tokens.peek() {
-                    let mut segments = vec![PathSegment::from_ident(ident.with_span_pos(span))];
-                    tokens.next();
-                    loop {
-                        if let Some(TokenTree::Token(span,
-                                                     Token::Ident(ident, _))) = tokens.next() {
-                            segments.push(PathSegment::from_ident(ident.with_span_pos(span)));
-                        } else {
-                            return None;
-                        }
-                        if let Some(TokenTree::Token(_, Token::ModSep)) = tokens.peek() {
-                            tokens.next();
-                        } else {
-                            break;
-                        }
+            Some(TokenTree::Token(span, token @ Token::Ident(..))) |
+            Some(TokenTree::Token(span, token @ Token::ModSep)) => 'arm: {
+                let mut segments = if let Token::Ident(ident, _) = token {
+                    if let Some(TokenTree::Token(_, Token::ModSep)) = tokens.peek() {
+                        tokens.next();
+                        vec![PathSegment::from_ident(ident.with_span_pos(span))]
+                    } else {
+                        break 'arm Path::from_ident(ident.with_span_pos(span));
                     }
-                    let span = span.with_hi(segments.last().unwrap().ident.span.hi());
-                    Path { span, segments }
                 } else {
-                    Path::from_ident(ident.with_span_pos(span))
+                    vec![PathSegment::path_root(span)]
+                };
+                loop {
+                    if let Some(TokenTree::Token(span,
+                                                    Token::Ident(ident, _))) = tokens.next() {
+                        segments.push(PathSegment::from_ident(ident.with_span_pos(span)));
+                    } else {
+                        return None;
+                    }
+                    if let Some(TokenTree::Token(_, Token::ModSep)) = tokens.peek() {
+                        tokens.next();
+                    } else {
+                        break;
+                    }
                 }
+                let span = span.with_hi(segments.last().unwrap().ident.span.hi());
+                Path { span, segments }
             }
             Some(TokenTree::Token(_, Token::Interpolated(ref nt))) => match nt.0 {
                 token::Nonterminal::NtIdent(ident, _) => Path::from_ident(ident),
@@ -565,7 +570,7 @@
             }
             Some(TokenTree::Delimited(_, delim, ref tts)) if delim == token::Paren => {
                 tokens.next();
-                tts.stream()
+                tts.clone()
             }
             _ => return Some(MetaItemKind::Word),
         };
diff --git a/src/libsyntax/config.rs b/src/libsyntax/config.rs
index a987f53..50e0056 100644
--- a/src/libsyntax/config.rs
+++ b/src/libsyntax/config.rs
@@ -166,12 +166,9 @@
                 true
             };
 
-            let meta_item = if let Some(meta_item) = attr.meta() {
-                meta_item
-            } else {
-                // Not a well-formed meta-item. Why? We don't know.
-                return error(attr.span, "`cfg` is not a well-formed meta-item",
-                                        "#[cfg(/* predicate */)]");
+            let meta_item = match attr.parse_meta(self.sess) {
+                Ok(meta_item) => meta_item,
+                Err(mut err) => { err.emit(); return true; }
             };
             let nested_meta_items = if let Some(nested_meta_items) = meta_item.meta_item_list() {
                 nested_meta_items
diff --git a/src/libsyntax/diagnostic_list.rs b/src/libsyntax/diagnostic_list.rs
index 548bf8b..2c367f1 100644
--- a/src/libsyntax/diagnostic_list.rs
+++ b/src/libsyntax/diagnostic_list.rs
@@ -389,12 +389,12 @@
     E0545, // incorrect 'issue'
     E0546, // missing 'feature'
     E0547, // missing 'issue'
-    E0548, // incorrect stability attribute type
+//  E0548, // replaced with a generic attribute input check
     E0549, // rustc_deprecated attribute must be paired with either stable or unstable attribute
     E0550, // multiple deprecated attributes
     E0551, // incorrect meta item
     E0553, // multiple rustc_const_unstable attributes
-    E0555, // malformed feature attribute, expected #![feature(...)]
+//  E0555, // replaced with a generic attribute input check
     E0556, // malformed feature, expected just one word
     E0584, // file for module `..` found at both .. and ..
     E0629, // missing 'feature' (rustc_const_unstable)
diff --git a/src/libsyntax/early_buffered_lints.rs b/src/libsyntax/early_buffered_lints.rs
index 204e076..cf9671a 100644
--- a/src/libsyntax/early_buffered_lints.rs
+++ b/src/libsyntax/early_buffered_lints.rs
@@ -11,6 +11,7 @@
 pub enum BufferedEarlyLintId {
     /// Usage of `?` as a macro separator is deprecated.
     QuestionMarkMacroSep,
+    IllFormedAttributeInput,
 }
 
 /// Stores buffered lint info which can later be passed to `librustc`.
diff --git a/src/libsyntax/ext/derive.rs b/src/libsyntax/ext/derive.rs
index d5a51bc..7ef09ce 100644
--- a/src/libsyntax/ext/derive.rs
+++ b/src/libsyntax/ext/derive.rs
@@ -15,6 +15,11 @@
         if attr.path != "derive" {
             return true;
         }
+        if !attr.is_meta_item_list() {
+            cx.span_err(attr.span,
+                        "attribute must be of the form `#[derive(Trait1, Trait2, ...)]`");
+            return false;
+        }
 
         match attr.parse_list(cx.parse_sess,
                               |parser| parser.parse_path_allowing_meta(PathStyle::Mod)) {
diff --git a/src/libsyntax/ext/quote.rs b/src/libsyntax/ext/quote.rs
index c312414..c01e7f5 100644
--- a/src/libsyntax/ext/quote.rs
+++ b/src/libsyntax/ext/quote.rs
@@ -748,7 +748,7 @@
         },
         TokenTree::Delimited(span, delim, ref tts) => {
             let mut stmts = statements_mk_tt(cx, &TokenTree::open_tt(span.open, delim), false);
-            stmts.extend(statements_mk_tts(cx, tts.stream()));
+            stmts.extend(statements_mk_tts(cx, tts.clone()));
             stmts.extend(statements_mk_tt(cx, &TokenTree::close_tt(span.close, delim), false));
             stmts
         }
diff --git a/src/libsyntax/ext/tt/macro_rules.rs b/src/libsyntax/ext/tt/macro_rules.rs
index 24202ca..9a129e7 100644
--- a/src/libsyntax/ext/tt/macro_rules.rs
+++ b/src/libsyntax/ext/tt/macro_rules.rs
@@ -435,7 +435,8 @@
                     match *seq_tt {
                         TokenTree::MetaVarDecl(_, _, id) => id.name == "vis",
                         TokenTree::Sequence(_, ref sub_seq) =>
-                            sub_seq.op == quoted::KleeneOp::ZeroOrMore,
+                            sub_seq.op == quoted::KleeneOp::ZeroOrMore
+                            || sub_seq.op == quoted::KleeneOp::ZeroOrOne,
                         _ => false,
                     }
                 }) {
@@ -543,7 +544,10 @@
                         }
 
                         // Reverse scan: Sequence comes before `first`.
-                        if subfirst.maybe_empty || seq_rep.op == quoted::KleeneOp::ZeroOrMore {
+                        if subfirst.maybe_empty
+                           || seq_rep.op == quoted::KleeneOp::ZeroOrMore
+                           || seq_rep.op == quoted::KleeneOp::ZeroOrOne
+                        {
                             // If sequence is potentially empty, then
                             // union them (preserving first emptiness).
                             first.add_all(&TokenSet { maybe_empty: true, ..subfirst });
@@ -591,8 +595,10 @@
 
                             assert!(first.maybe_empty);
                             first.add_all(subfirst);
-                            if subfirst.maybe_empty ||
-                               seq_rep.op == quoted::KleeneOp::ZeroOrMore {
+                            if subfirst.maybe_empty
+                               || seq_rep.op == quoted::KleeneOp::ZeroOrMore
+                               || seq_rep.op == quoted::KleeneOp::ZeroOrOne
+                            {
                                 // continue scanning for more first
                                 // tokens, but also make sure we
                                 // restore empty-tracking state
diff --git a/src/libsyntax/feature_gate.rs b/src/libsyntax/feature_gate.rs
index ac20a62..9b54e8f 100644
--- a/src/libsyntax/feature_gate.rs
+++ b/src/libsyntax/feature_gate.rs
@@ -19,15 +19,16 @@
 use rustc_target::spec::abi::Abi;
 use ast::{self, NodeId, PatKind, RangeEnd};
 use attr;
+use early_buffered_lints::BufferedEarlyLintId;
 use source_map::Spanned;
 use edition::{ALL_EDITIONS, Edition};
 use syntax_pos::{Span, DUMMY_SP};
 use errors::{DiagnosticBuilder, Handler};
 use visit::{self, FnKind, Visitor};
 use parse::ParseSess;
-use symbol::{keywords, Symbol};
+use symbol::Symbol;
 
-use std::{env};
+use std::env;
 
 macro_rules! set {
     ($field: ident) => {{
@@ -372,9 +373,6 @@
     // Generic associated types (RFC 1598)
     (active, generic_associated_types, "1.23.0", Some(44265), None),
 
-    // `extern` in paths
-    (active, extern_in_paths, "1.23.0", Some(55600), None),
-
     // Infer static outlives requirements (RFC 2093).
     (active, infer_static_outlives_requirements, "1.26.0", Some(54185), None),
 
@@ -503,6 +501,9 @@
     // Allows the use of `#[derive(Anything)]` as sugar for `#[derive_Anything]`.
     (removed, custom_derive, "1.0.0", Some(29644), None,
      Some("subsumed by `#[proc_macro_derive]`")),
+    // Paths of the form: `extern::foo::bar`
+    (removed, extern_in_paths, "1.33.0", Some(55600), None,
+     Some("subsumed by `::foo::bar` paths")),
 );
 
 declare_features! (
@@ -715,6 +716,47 @@
     Ungated,
 }
 
+/// A template that the attribute input must match.
+/// Only top-level shape (`#[attr]` vs `#[attr(...)]` vs `#[attr = ...]`) is considered now.
+#[derive(Clone, Copy)]
+pub struct AttributeTemplate {
+    word: bool,
+    list: Option<&'static str>,
+    name_value_str: Option<&'static str>,
+}
+
+impl AttributeTemplate {
+    /// Check that the given meta-item is compatible with this template.
+    fn compatible(&self, meta_item_kind: &ast::MetaItemKind) -> bool {
+        match meta_item_kind {
+            ast::MetaItemKind::Word => self.word,
+            ast::MetaItemKind::List(..) => self.list.is_some(),
+            ast::MetaItemKind::NameValue(lit) if lit.node.is_str() => self.name_value_str.is_some(),
+            ast::MetaItemKind::NameValue(..) => false,
+        }
+    }
+}
+
+/// A convenience macro for constructing attribute templates.
+/// E.g. `template!(Word, List: "description")` means that the attribute
+/// supports forms `#[attr]` and `#[attr(description)]`.
+macro_rules! template {
+    (Word) => { template!(@ true, None, None) };
+    (List: $descr: expr) => { template!(@ false, Some($descr), None) };
+    (NameValueStr: $descr: expr) => { template!(@ false, None, Some($descr)) };
+    (Word, List: $descr: expr) => { template!(@ true, Some($descr), None) };
+    (Word, NameValueStr: $descr: expr) => { template!(@ true, None, Some($descr)) };
+    (List: $descr1: expr, NameValueStr: $descr2: expr) => {
+        template!(@ false, Some($descr1), Some($descr2))
+    };
+    (Word, List: $descr1: expr, NameValueStr: $descr2: expr) => {
+        template!(@ true, Some($descr1), Some($descr2))
+    };
+    (@ $word: expr, $list: expr, $name_value_str: expr) => { AttributeTemplate {
+        word: $word, list: $list, name_value_str: $name_value_str
+    } };
+}
+
 impl AttributeGate {
     fn is_deprecated(&self) -> bool {
         match *self {
@@ -752,225 +794,241 @@
     }}
 }
 
-pub fn deprecated_attributes() -> Vec<&'static (&'static str, AttributeType, AttributeGate)> {
-    BUILTIN_ATTRIBUTES.iter().filter(|a| a.2.is_deprecated()).collect()
+pub fn deprecated_attributes() -> Vec<&'static (&'static str, AttributeType,
+                                                AttributeTemplate, AttributeGate)> {
+    BUILTIN_ATTRIBUTES.iter().filter(|(.., gate)| gate.is_deprecated()).collect()
 }
 
 pub fn is_builtin_attr_name(name: ast::Name) -> bool {
-    BUILTIN_ATTRIBUTES.iter().any(|&(builtin_name, _, _)| name == builtin_name)
+    BUILTIN_ATTRIBUTES.iter().any(|&(builtin_name, ..)| name == builtin_name)
 }
 
 pub fn is_builtin_attr(attr: &ast::Attribute) -> bool {
-    BUILTIN_ATTRIBUTES.iter().any(|&(builtin_name, _, _)| attr.path == builtin_name)
+    BUILTIN_ATTRIBUTES.iter().any(|&(builtin_name, ..)| attr.path == builtin_name)
 }
 
 // Attributes that have a special meaning to rustc or rustdoc
-pub const BUILTIN_ATTRIBUTES: &[(&str, AttributeType, AttributeGate)] = &[
+pub const BUILTIN_ATTRIBUTES: &[(&str, AttributeType, AttributeTemplate, AttributeGate)] = &[
     // Normal attributes
 
-    ("warn", Normal, Ungated),
-    ("allow", Normal, Ungated),
-    ("forbid", Normal, Ungated),
-    ("deny", Normal, Ungated),
+    ("warn", Normal, template!(List: r#"lint1, lint2, ..., /*opt*/ reason = "...""#), Ungated),
+    ("allow", Normal, template!(List: r#"lint1, lint2, ..., /*opt*/ reason = "...""#), Ungated),
+    ("forbid", Normal, template!(List: r#"lint1, lint2, ..., /*opt*/ reason = "...""#), Ungated),
+    ("deny", Normal, template!(List: r#"lint1, lint2, ..., /*opt*/ reason = "...""#), Ungated),
 
-    ("macro_use", Normal, Ungated),
-    ("macro_export", Normal, Ungated),
-    ("plugin_registrar", Normal, Ungated),
+    ("macro_use", Normal, template!(Word, List: "name1, name2, ..."), Ungated),
+    ("macro_export", Normal, template!(Word, List: "local_inner_macros"), Ungated),
+    ("plugin_registrar", Normal, template!(Word), Ungated),
 
-    ("cfg", Normal, Ungated),
-    ("cfg_attr", Normal, Ungated),
-    ("main", Normal, Ungated),
-    ("start", Normal, Ungated),
-    ("repr", Normal, Ungated),
-    ("path", Normal, Ungated),
-    ("abi", Normal, Ungated),
-    ("automatically_derived", Normal, Ungated),
-    ("no_mangle", Normal, Ungated),
-    ("no_link", Normal, Ungated),
-    ("derive", Normal, Ungated),
-    ("should_panic", Normal, Ungated),
-    ("ignore", Normal, Ungated),
-    ("no_implicit_prelude", Normal, Ungated),
-    ("reexport_test_harness_main", Normal, Ungated),
-    ("link_args", Normal, Gated(Stability::Unstable,
+    ("cfg", Normal, template!(List: "predicate"), Ungated),
+    ("cfg_attr", Normal, template!(List: "predicate, attr1, attr2, ..."), Ungated),
+    ("main", Normal, template!(Word), Ungated),
+    ("start", Normal, template!(Word), Ungated),
+    ("repr", Normal, template!(List: "C, packed, ..."), Ungated),
+    ("path", Normal, template!(NameValueStr: "file"), Ungated),
+    ("automatically_derived", Normal, template!(Word), Ungated),
+    ("no_mangle", Normal, template!(Word), Ungated),
+    ("no_link", Normal, template!(Word), Ungated),
+    ("derive", Normal, template!(List: "Trait1, Trait2, ..."), Ungated),
+    ("should_panic", Normal, template!(Word, List: r#"expected = "reason"#, NameValueStr: "reason"),
+                                Ungated),
+    ("ignore", Normal, template!(Word, NameValueStr: "reason"), Ungated),
+    ("no_implicit_prelude", Normal, template!(Word), Ungated),
+    ("reexport_test_harness_main", Normal, template!(NameValueStr: "name"), Ungated),
+    ("link_args", Normal, template!(NameValueStr: "args"), Gated(Stability::Unstable,
                                 "link_args",
                                 "the `link_args` attribute is experimental and not \
                                  portable across platforms, it is recommended to \
                                  use `#[link(name = \"foo\")] instead",
                                 cfg_fn!(link_args))),
-    ("macro_escape", Normal, Ungated),
+    ("macro_escape", Normal, template!(Word), Ungated),
 
     // RFC #1445.
-    ("structural_match", Whitelisted, Gated(Stability::Unstable,
+    ("structural_match", Whitelisted, template!(Word), Gated(Stability::Unstable,
                                             "structural_match",
                                             "the semantics of constant patterns is \
                                              not yet settled",
                                             cfg_fn!(structural_match))),
 
     // RFC #2008
-    ("non_exhaustive", Whitelisted, Gated(Stability::Unstable,
+    ("non_exhaustive", Whitelisted, template!(Word), Gated(Stability::Unstable,
                                           "non_exhaustive",
                                           "non exhaustive is an experimental feature",
                                           cfg_fn!(non_exhaustive))),
 
     // RFC #1268
-    ("marker", Normal, Gated(Stability::Unstable,
+    ("marker", Normal, template!(Word), Gated(Stability::Unstable,
                              "marker_trait_attr",
                              "marker traits is an experimental feature",
                              cfg_fn!(marker_trait_attr))),
 
-    ("plugin", CrateLevel, Gated(Stability::Unstable,
+    ("plugin", CrateLevel, template!(List: "name|name(args)"), Gated(Stability::Unstable,
                                  "plugin",
                                  "compiler plugins are experimental \
                                   and possibly buggy",
                                  cfg_fn!(plugin))),
 
-    ("no_std", CrateLevel, Ungated),
-    ("no_core", CrateLevel, Gated(Stability::Unstable,
+    ("no_std", CrateLevel, template!(Word), Ungated),
+    ("no_core", CrateLevel, template!(Word), Gated(Stability::Unstable,
                                   "no_core",
                                   "no_core is experimental",
                                   cfg_fn!(no_core))),
-    ("lang", Normal, Gated(Stability::Unstable,
+    ("lang", Normal, template!(NameValueStr: "name"), Gated(Stability::Unstable,
                            "lang_items",
                            "language items are subject to change",
                            cfg_fn!(lang_items))),
-    ("linkage", Whitelisted, Gated(Stability::Unstable,
+    ("linkage", Whitelisted, template!(NameValueStr: "external|internal|..."),
+                                   Gated(Stability::Unstable,
                                    "linkage",
                                    "the `linkage` attribute is experimental \
                                     and not portable across platforms",
                                    cfg_fn!(linkage))),
-    ("thread_local", Whitelisted, Gated(Stability::Unstable,
+    ("thread_local", Whitelisted, template!(Word), Gated(Stability::Unstable,
                                         "thread_local",
                                         "`#[thread_local]` is an experimental feature, and does \
                                          not currently handle destructors.",
                                         cfg_fn!(thread_local))),
 
-    ("rustc_on_unimplemented", Normal, Gated(Stability::Unstable,
+    ("rustc_on_unimplemented", Normal, template!(List:
+                          r#"/*opt*/ message = "...", /*opt*/ label = "...", /*opt*/ note = "...""#,
+                          NameValueStr: "message"),
+                                             Gated(Stability::Unstable,
                                              "on_unimplemented",
                                              "the `#[rustc_on_unimplemented]` attribute \
                                               is an experimental feature",
                                              cfg_fn!(on_unimplemented))),
-    ("rustc_const_unstable", Normal, Gated(Stability::Unstable,
+    ("rustc_const_unstable", Normal, template!(List: r#"feature = "name""#),
+                                             Gated(Stability::Unstable,
                                              "rustc_const_unstable",
                                              "the `#[rustc_const_unstable]` attribute \
                                               is an internal feature",
                                              cfg_fn!(rustc_const_unstable))),
-    ("global_allocator", Normal, Ungated),
-    ("default_lib_allocator", Whitelisted, Gated(Stability::Unstable,
+    ("global_allocator", Normal, template!(Word), Ungated),
+    ("default_lib_allocator", Whitelisted, template!(Word), Gated(Stability::Unstable,
                                             "allocator_internals",
                                             "the `#[default_lib_allocator]` \
                                              attribute is an experimental feature",
                                             cfg_fn!(allocator_internals))),
-    ("needs_allocator", Normal, Gated(Stability::Unstable,
+    ("needs_allocator", Normal, template!(Word), Gated(Stability::Unstable,
                                       "allocator_internals",
                                       "the `#[needs_allocator]` \
                                        attribute is an experimental \
                                        feature",
                                       cfg_fn!(allocator_internals))),
-    ("panic_runtime", Whitelisted, Gated(Stability::Unstable,
+    ("panic_runtime", Whitelisted, template!(Word), Gated(Stability::Unstable,
                                          "panic_runtime",
                                          "the `#[panic_runtime]` attribute is \
                                           an experimental feature",
                                          cfg_fn!(panic_runtime))),
-    ("needs_panic_runtime", Whitelisted, Gated(Stability::Unstable,
+    ("needs_panic_runtime", Whitelisted, template!(Word), Gated(Stability::Unstable,
                                                "needs_panic_runtime",
                                                "the `#[needs_panic_runtime]` \
                                                 attribute is an experimental \
                                                 feature",
                                                cfg_fn!(needs_panic_runtime))),
-    ("rustc_outlives", Normal, Gated(Stability::Unstable,
+    ("rustc_outlives", Normal, template!(Word), Gated(Stability::Unstable,
                                      "rustc_attrs",
                                      "the `#[rustc_outlives]` attribute \
                                       is just used for rustc unit tests \
                                       and will never be stable",
                                      cfg_fn!(rustc_attrs))),
-    ("rustc_variance", Normal, Gated(Stability::Unstable,
+    ("rustc_variance", Normal, template!(Word), Gated(Stability::Unstable,
                                      "rustc_attrs",
                                      "the `#[rustc_variance]` attribute \
                                       is just used for rustc unit tests \
                                       and will never be stable",
                                      cfg_fn!(rustc_attrs))),
-    ("rustc_regions", Normal, Gated(Stability::Unstable,
+    ("rustc_regions", Normal, template!(Word), Gated(Stability::Unstable,
                                     "rustc_attrs",
                                     "the `#[rustc_regions]` attribute \
                                      is just used for rustc unit tests \
                                      and will never be stable",
                                     cfg_fn!(rustc_attrs))),
-    ("rustc_error", Whitelisted, Gated(Stability::Unstable,
+    ("rustc_error", Whitelisted, template!(Word), Gated(Stability::Unstable,
                                        "rustc_attrs",
                                        "the `#[rustc_error]` attribute \
                                         is just used for rustc unit tests \
                                         and will never be stable",
                                        cfg_fn!(rustc_attrs))),
-    ("rustc_dump_user_substs", Whitelisted, Gated(Stability::Unstable,
+    ("rustc_dump_user_substs", Whitelisted, template!(Word), Gated(Stability::Unstable,
                                        "rustc_attrs",
                                        "this attribute \
                                         is just used for rustc unit tests \
                                         and will never be stable",
                                        cfg_fn!(rustc_attrs))),
-    ("rustc_if_this_changed", Whitelisted, Gated(Stability::Unstable,
+    ("rustc_if_this_changed", Whitelisted, template!(Word, List: "DepNode"),
+                                                 Gated(Stability::Unstable,
                                                  "rustc_attrs",
                                                  "the `#[rustc_if_this_changed]` attribute \
                                                   is just used for rustc unit tests \
                                                   and will never be stable",
                                                  cfg_fn!(rustc_attrs))),
-    ("rustc_then_this_would_need", Whitelisted, Gated(Stability::Unstable,
+    ("rustc_then_this_would_need", Whitelisted, template!(List: "DepNode"),
+                                                      Gated(Stability::Unstable,
                                                       "rustc_attrs",
                                                       "the `#[rustc_if_this_changed]` attribute \
                                                        is just used for rustc unit tests \
                                                        and will never be stable",
                                                       cfg_fn!(rustc_attrs))),
-    ("rustc_dirty", Whitelisted, Gated(Stability::Unstable,
+    ("rustc_dirty", Whitelisted, template!(List: r#"cfg = "...", /*opt*/ label = "...",
+                                                    /*opt*/ except = "...""#),
+                                       Gated(Stability::Unstable,
                                        "rustc_attrs",
                                        "the `#[rustc_dirty]` attribute \
                                         is just used for rustc unit tests \
                                         and will never be stable",
                                        cfg_fn!(rustc_attrs))),
-    ("rustc_clean", Whitelisted, Gated(Stability::Unstable,
+    ("rustc_clean", Whitelisted, template!(List: r#"cfg = "...", /*opt*/ label = "...",
+                                                    /*opt*/ except = "...""#),
+                                       Gated(Stability::Unstable,
                                        "rustc_attrs",
                                        "the `#[rustc_clean]` attribute \
                                         is just used for rustc unit tests \
                                         and will never be stable",
                                        cfg_fn!(rustc_attrs))),
-    ("rustc_partition_reused", Whitelisted, Gated(Stability::Unstable,
+    ("rustc_partition_reused", Whitelisted, template!(List: r#"cfg = "...", module = "...""#),
+                                                  Gated(Stability::Unstable,
                                                   "rustc_attrs",
                                                   "this attribute \
                                                    is just used for rustc unit tests \
                                                    and will never be stable",
                                                   cfg_fn!(rustc_attrs))),
-    ("rustc_partition_codegened", Whitelisted, Gated(Stability::Unstable,
+    ("rustc_partition_codegened", Whitelisted, template!(List: r#"cfg = "...", module = "...""#),
+                                                      Gated(Stability::Unstable,
                                                       "rustc_attrs",
                                                       "this attribute \
                                                        is just used for rustc unit tests \
                                                        and will never be stable",
                                                       cfg_fn!(rustc_attrs))),
-    ("rustc_expected_cgu_reuse", Whitelisted, Gated(Stability::Unstable,
+    ("rustc_expected_cgu_reuse", Whitelisted, template!(List: r#"cfg = "...", module = "...",
+                                                              kind = "...""#),
+                                                    Gated(Stability::Unstable,
                                                     "rustc_attrs",
                                                     "this attribute \
                                                      is just used for rustc unit tests \
                                                      and will never be stable",
                                                     cfg_fn!(rustc_attrs))),
-    ("rustc_synthetic", Whitelisted, Gated(Stability::Unstable,
+    ("rustc_synthetic", Whitelisted, template!(Word), Gated(Stability::Unstable,
                                                       "rustc_attrs",
                                                       "this attribute \
                                                        is just used for rustc unit tests \
                                                        and will never be stable",
                                                       cfg_fn!(rustc_attrs))),
-    ("rustc_symbol_name", Whitelisted, Gated(Stability::Unstable,
+    ("rustc_symbol_name", Whitelisted, template!(Word), Gated(Stability::Unstable,
                                              "rustc_attrs",
                                              "internal rustc attributes will never be stable",
                                              cfg_fn!(rustc_attrs))),
-    ("rustc_item_path", Whitelisted, Gated(Stability::Unstable,
+    ("rustc_item_path", Whitelisted, template!(Word), Gated(Stability::Unstable,
                                            "rustc_attrs",
                                            "internal rustc attributes will never be stable",
                                            cfg_fn!(rustc_attrs))),
-    ("rustc_mir", Whitelisted, Gated(Stability::Unstable,
+    ("rustc_mir", Whitelisted, template!(List: "arg1, arg2, ..."), Gated(Stability::Unstable,
                                      "rustc_attrs",
                                      "the `#[rustc_mir]` attribute \
                                       is just used for rustc unit tests \
                                       and will never be stable",
                                      cfg_fn!(rustc_attrs))),
-    ("rustc_inherit_overflow_checks", Whitelisted, Gated(Stability::Unstable,
+    ("rustc_inherit_overflow_checks", Whitelisted, template!(Word), Gated(Stability::Unstable,
                                                          "rustc_attrs",
                                                          "the `#[rustc_inherit_overflow_checks]` \
                                                           attribute is just used to control \
@@ -979,41 +1037,35 @@
                                                           across crates and will never be stable",
                                                           cfg_fn!(rustc_attrs))),
 
-    ("rustc_dump_program_clauses", Whitelisted, Gated(Stability::Unstable,
+    ("rustc_dump_program_clauses", Whitelisted, template!(Word), Gated(Stability::Unstable,
                                                      "rustc_attrs",
                                                      "the `#[rustc_dump_program_clauses]` \
                                                       attribute is just used for rustc unit \
                                                       tests and will never be stable",
                                                      cfg_fn!(rustc_attrs))),
-    ("rustc_test_marker", Normal, Gated(Stability::Unstable,
+    ("rustc_test_marker", Normal, template!(Word), Gated(Stability::Unstable,
                                      "rustc_attrs",
                                      "the `#[rustc_test_marker]` attribute \
                                       is used internally to track tests",
                                      cfg_fn!(rustc_attrs))),
-    ("rustc_transparent_macro", Whitelisted, Gated(Stability::Unstable,
+    ("rustc_transparent_macro", Whitelisted, template!(Word), Gated(Stability::Unstable,
                                                    "rustc_attrs",
                                                    "used internally for testing macro hygiene",
                                                     cfg_fn!(rustc_attrs))),
-
-    // RFC #2094
-    ("nll", Whitelisted, Gated(Stability::Unstable,
-                               "nll",
-                               "Non lexical lifetimes",
-                               cfg_fn!(nll))),
-    ("compiler_builtins", Whitelisted, Gated(Stability::Unstable,
+    ("compiler_builtins", Whitelisted, template!(Word), Gated(Stability::Unstable,
                                              "compiler_builtins",
                                              "the `#[compiler_builtins]` attribute is used to \
                                               identify the `compiler_builtins` crate which \
                                               contains compiler-rt intrinsics and will never be \
                                               stable",
                                           cfg_fn!(compiler_builtins))),
-    ("sanitizer_runtime", Whitelisted, Gated(Stability::Unstable,
+    ("sanitizer_runtime", Whitelisted, template!(Word), Gated(Stability::Unstable,
                                              "sanitizer_runtime",
                                              "the `#[sanitizer_runtime]` attribute is used to \
                                               identify crates that contain the runtime of a \
                                               sanitizer and will never be stable",
                                              cfg_fn!(sanitizer_runtime))),
-    ("profiler_runtime", Whitelisted, Gated(Stability::Unstable,
+    ("profiler_runtime", Whitelisted, template!(Word), Gated(Stability::Unstable,
                                              "profiler_runtime",
                                              "the `#[profiler_runtime]` attribute is used to \
                                               identify the `profiler_builtins` crate which \
@@ -1021,55 +1073,58 @@
                                               stable",
                                              cfg_fn!(profiler_runtime))),
 
-    ("allow_internal_unstable", Normal, Gated(Stability::Unstable,
+    ("allow_internal_unstable", Normal, template!(Word), Gated(Stability::Unstable,
                                               "allow_internal_unstable",
                                               EXPLAIN_ALLOW_INTERNAL_UNSTABLE,
                                               cfg_fn!(allow_internal_unstable))),
 
-    ("allow_internal_unsafe", Normal, Gated(Stability::Unstable,
+    ("allow_internal_unsafe", Normal, template!(Word), Gated(Stability::Unstable,
                                             "allow_internal_unsafe",
                                             EXPLAIN_ALLOW_INTERNAL_UNSAFE,
                                             cfg_fn!(allow_internal_unsafe))),
 
-    ("fundamental", Whitelisted, Gated(Stability::Unstable,
+    ("fundamental", Whitelisted, template!(Word), Gated(Stability::Unstable,
                                        "fundamental",
                                        "the `#[fundamental]` attribute \
                                         is an experimental feature",
                                        cfg_fn!(fundamental))),
 
-    ("proc_macro_derive", Normal, Ungated),
+    ("proc_macro_derive", Normal, template!(List: "TraitName, \
+                                                   /*opt*/ attributes(name1, name2, ...)"),
+                                       Ungated),
 
-    ("rustc_copy_clone_marker", Whitelisted, Gated(Stability::Unstable,
+    ("rustc_copy_clone_marker", Whitelisted, template!(Word), Gated(Stability::Unstable,
                                                    "rustc_attrs",
                                                    "internal implementation detail",
                                                    cfg_fn!(rustc_attrs))),
 
     // FIXME: #14408 whitelist docs since rustdoc looks at them
-    ("doc", Whitelisted, Ungated),
+    ("doc", Whitelisted, template!(List: "hidden|inline|...", NameValueStr: "string"), Ungated),
 
     // FIXME: #14406 these are processed in codegen, which happens after the
     // lint pass
-    ("cold", Whitelisted, Ungated),
-    ("naked", Whitelisted, Gated(Stability::Unstable,
+    ("cold", Whitelisted, template!(Word), Ungated),
+    ("naked", Whitelisted, template!(Word), Gated(Stability::Unstable,
                                  "naked_functions",
                                  "the `#[naked]` attribute \
                                   is an experimental feature",
                                  cfg_fn!(naked_functions))),
-    ("target_feature", Whitelisted, Ungated),
-    ("export_name", Whitelisted, Ungated),
-    ("inline", Whitelisted, Ungated),
-    ("link", Whitelisted, Ungated),
-    ("link_name", Whitelisted, Ungated),
-    ("link_section", Whitelisted, Ungated),
-    ("no_builtins", Whitelisted, Ungated),
-    ("no_mangle", Whitelisted, Ungated),
-    ("no_debug", Whitelisted, Gated(
+    ("target_feature", Whitelisted, template!(List: r#"enable = "name""#), Ungated),
+    ("export_name", Whitelisted, template!(NameValueStr: "name"), Ungated),
+    ("inline", Whitelisted, template!(Word, List: "always|never"), Ungated),
+    ("link", Whitelisted, template!(List: r#"name = "...", /*opt*/ kind = "dylib|static|...",
+                                             /*opt*/ cfg = "...""#), Ungated),
+    ("link_name", Whitelisted, template!(NameValueStr: "name"), Ungated),
+    ("link_section", Whitelisted, template!(NameValueStr: "name"), Ungated),
+    ("no_builtins", Whitelisted, template!(Word), Ungated),
+    ("no_mangle", Whitelisted, template!(Word), Ungated),
+    ("no_debug", Whitelisted, template!(Word), Gated(
         Stability::Deprecated("https://github.com/rust-lang/rust/issues/29721", None),
         "no_debug",
         "the `#[no_debug]` attribute was an experimental feature that has been \
          deprecated due to lack of demand",
         cfg_fn!(no_debug))),
-    ("omit_gdb_pretty_printer_section", Whitelisted, Gated(Stability::Unstable,
+    ("omit_gdb_pretty_printer_section", Whitelisted, template!(Word), Gated(Stability::Unstable,
                                                        "omit_gdb_pretty_printer_section",
                                                        "the `#[omit_gdb_pretty_printer_section]` \
                                                         attribute is just used for the Rust test \
@@ -1077,6 +1132,7 @@
                                                        cfg_fn!(omit_gdb_pretty_printer_section))),
     ("unsafe_destructor_blind_to_params",
      Normal,
+     template!(Word),
      Gated(Stability::Deprecated("https://github.com/rust-lang/rust/issues/34761",
                                  Some("replace this attribute with `#[may_dangle]`")),
            "dropck_parametricity",
@@ -1085,93 +1141,91 @@
            cfg_fn!(dropck_parametricity))),
     ("may_dangle",
      Normal,
+     template!(Word),
      Gated(Stability::Unstable,
            "dropck_eyepatch",
            "may_dangle has unstable semantics and may be removed in the future",
            cfg_fn!(dropck_eyepatch))),
-    ("unwind", Whitelisted, Gated(Stability::Unstable,
+    ("unwind", Whitelisted, template!(List: "allowed"), Gated(Stability::Unstable,
                                   "unwind_attributes",
                                   "#[unwind] is experimental",
                                   cfg_fn!(unwind_attributes))),
-    ("used", Whitelisted, Ungated),
+    ("used", Whitelisted, template!(Word), Ungated),
 
     // used in resolve
-    ("prelude_import", Whitelisted, Gated(Stability::Unstable,
+    ("prelude_import", Whitelisted, template!(Word), Gated(Stability::Unstable,
                                           "prelude_import",
                                           "`#[prelude_import]` is for use by rustc only",
                                           cfg_fn!(prelude_import))),
 
     // FIXME: #14407 these are only looked at on-demand so we can't
     // guarantee they'll have already been checked
-    ("rustc_deprecated", Whitelisted, Ungated),
-    ("must_use", Whitelisted, Ungated),
-    ("stable", Whitelisted, Ungated),
-    ("unstable", Whitelisted, Ungated),
-    ("deprecated", Normal, Ungated),
+    ("rustc_deprecated", Whitelisted, template!(List: r#"since = "version", reason = "...""#),
+                                        Ungated),
+    ("must_use", Whitelisted, template!(Word, NameValueStr: "reason"), Ungated),
+    ("stable", Whitelisted, template!(List: r#"feature = "name", since = "version""#), Ungated),
+    ("unstable", Whitelisted, template!(List: r#"feature = "name", reason = "...", issue = "N""#),
+                                        Ungated),
+    ("deprecated", Normal, template!(Word, List: r#"/*opt*/ since = "version",
+                                                    /*opt*/ note = "reason"#,
+                                                    NameValueStr: "reason"), Ungated),
 
-    ("rustc_paren_sugar", Normal, Gated(Stability::Unstable,
+    ("rustc_paren_sugar", Normal, template!(Word), Gated(Stability::Unstable,
                                         "unboxed_closures",
                                         "unboxed_closures are still evolving",
                                         cfg_fn!(unboxed_closures))),
 
-    ("windows_subsystem", Whitelisted, Ungated),
+    ("windows_subsystem", Whitelisted, template!(NameValueStr: "windows|console"), Ungated),
 
-    ("proc_macro_attribute", Normal, Ungated),
-    ("proc_macro", Normal, Ungated),
+    ("proc_macro_attribute", Normal, template!(Word), Ungated),
+    ("proc_macro", Normal, template!(Word), Ungated),
 
-    ("rustc_proc_macro_decls", Normal, Gated(Stability::Unstable,
+    ("rustc_proc_macro_decls", Normal, template!(Word), Gated(Stability::Unstable,
                                              "rustc_proc_macro_decls",
                                              "used internally by rustc",
                                              cfg_fn!(rustc_attrs))),
 
-    ("allow_fail", Normal, Gated(Stability::Unstable,
+    ("allow_fail", Normal, template!(Word), Gated(Stability::Unstable,
                                  "allow_fail",
                                  "allow_fail attribute is currently unstable",
                                  cfg_fn!(allow_fail))),
 
-    ("rustc_std_internal_symbol", Whitelisted, Gated(Stability::Unstable,
+    ("rustc_std_internal_symbol", Whitelisted, template!(Word), Gated(Stability::Unstable,
                                      "rustc_attrs",
                                      "this is an internal attribute that will \
                                       never be stable",
                                      cfg_fn!(rustc_attrs))),
 
     // whitelists "identity-like" conversion methods to suggest on type mismatch
-    ("rustc_conversion_suggestion", Whitelisted, Gated(Stability::Unstable,
+    ("rustc_conversion_suggestion", Whitelisted, template!(Word), Gated(Stability::Unstable,
                                                        "rustc_attrs",
                                                        "this is an internal attribute that will \
                                                         never be stable",
                                                        cfg_fn!(rustc_attrs))),
 
-    ("rustc_args_required_const", Whitelisted, Gated(Stability::Unstable,
+    ("rustc_args_required_const", Whitelisted, template!(List: "N"), Gated(Stability::Unstable,
                                  "rustc_attrs",
                                  "never will be stable",
                                  cfg_fn!(rustc_attrs))),
-
-    // RFC #2093
-    ("infer_static_outlives_requirements", Normal, Gated(Stability::Unstable,
-                                   "infer_static_outlives_requirements",
-                                   "infer 'static lifetime requirements",
-                                   cfg_fn!(infer_static_outlives_requirements))),
-
     // RFC 2070
-    ("panic_handler", Normal, Ungated),
+    ("panic_handler", Normal, template!(Word), Ungated),
 
-    ("alloc_error_handler", Normal, Gated(Stability::Unstable,
+    ("alloc_error_handler", Normal, template!(Word), Gated(Stability::Unstable,
                            "alloc_error_handler",
                            "#[alloc_error_handler] is an unstable feature",
                            cfg_fn!(alloc_error_handler))),
 
     // Crate level attributes
-    ("crate_name", CrateLevel, Ungated),
-    ("crate_type", CrateLevel, Ungated),
-    ("crate_id", CrateLevel, Ungated),
-    ("feature", CrateLevel, Ungated),
-    ("no_start", CrateLevel, Ungated),
-    ("no_main", CrateLevel, Ungated),
-    ("no_builtins", CrateLevel, Ungated),
-    ("recursion_limit", CrateLevel, Ungated),
-    ("type_length_limit", CrateLevel, Ungated),
-    ("test_runner", CrateLevel, Gated(Stability::Unstable,
+    ("crate_name", CrateLevel, template!(NameValueStr: "name"), Ungated),
+    ("crate_type", CrateLevel, template!(NameValueStr: "bin|lib|..."), Ungated),
+    ("crate_id", CrateLevel, template!(NameValueStr: "ignored"), Ungated),
+    ("feature", CrateLevel, template!(List: "name1, name1, ..."), Ungated),
+    ("no_start", CrateLevel, template!(Word), Ungated),
+    ("no_main", CrateLevel, template!(Word), Ungated),
+    ("no_builtins", CrateLevel, template!(Word), Ungated),
+    ("recursion_limit", CrateLevel, template!(NameValueStr: "N"), Ungated),
+    ("type_length_limit", CrateLevel, template!(NameValueStr: "N"), Ungated),
+    ("test_runner", CrateLevel, template!(List: "path"), Gated(Stability::Unstable,
                     "custom_test_frameworks",
                     EXPLAIN_CUSTOM_TEST_FRAMEWORKS,
                     cfg_fn!(custom_test_frameworks))),
@@ -1247,7 +1301,7 @@
     fn check_attribute(&self, attr: &ast::Attribute, is_macro: bool) {
         debug!("check_attribute(attr = {:?})", attr);
         let name = attr.name().as_str();
-        for &(n, ty, ref gateage) in BUILTIN_ATTRIBUTES {
+        for &(n, ty, _template, ref gateage) in BUILTIN_ATTRIBUTES {
             if name == n {
                 if let Gated(_, name, desc, ref has_feature) = *gateage {
                     gate_feature_fn!(self, has_feature, attr.span, name, desc, GateStrength::Hard);
@@ -1482,6 +1536,52 @@
             Abi::System => {}
         }
     }
+
+    fn check_builtin_attribute(&mut self, attr: &ast::Attribute, name: &str,
+                               template: AttributeTemplate) {
+        // Some special attributes like `cfg` must be checked
+        // before the generic check, so we skip them here.
+        let should_skip = |name| name == "cfg";
+        // Some of previously accepted forms were used in practice,
+        // report them as warnings for now.
+        let should_warn = |name| name == "doc" || name == "ignore" ||
+                                 name == "inline" || name == "link";
+
+        match attr.parse_meta(self.context.parse_sess) {
+            Ok(meta) => if !should_skip(name) && !template.compatible(&meta.node) {
+                let mut msg = "attribute must be of the form ".to_owned();
+                let mut first = true;
+                if template.word {
+                    first = false;
+                    msg.push_str(&format!("`#[{}{}]`", name, ""));
+                }
+                if let Some(descr) = template.list {
+                    if !first {
+                        msg.push_str(" or ");
+                    }
+                    first = false;
+                    msg.push_str(&format!("`#[{}({})]`", name, descr));
+                }
+                if let Some(descr) = template.name_value_str {
+                    if !first {
+                        msg.push_str(" or ");
+                    }
+                    msg.push_str(&format!("`#[{} = \"{}\"]`", name, descr));
+                }
+                if should_warn(name) {
+                    self.context.parse_sess.buffer_lint(
+                        BufferedEarlyLintId::IllFormedAttributeInput,
+                        meta.span,
+                        ast::CRATE_NODE_ID,
+                        &msg,
+                    );
+                } else {
+                    self.context.parse_sess.span_diagnostic.span_err(meta.span, &msg);
+                }
+            }
+            Err(mut err) => err.emit(),
+        }
+    }
 }
 
 impl<'a> Visitor<'a> for PostExpansionVisitor<'a> {
@@ -1517,12 +1617,15 @@
             }
         }
 
-        if !self.context.features.unrestricted_attribute_tokens {
-            // Unfortunately, `parse_meta` cannot be called speculatively
-            // because it can report errors by itself, so we have to call it
-            // only if the feature is disabled.
-            if let Err(mut err) = attr.parse_meta(self.context.parse_sess) {
-                err.help("try enabling `#![feature(unrestricted_attribute_tokens)]`").emit()
+        match BUILTIN_ATTRIBUTES.iter().find(|(name, ..)| attr.path == name) {
+            Some(&(name, _, template, _)) => self.check_builtin_attribute(attr, name, template),
+            None => if !self.context.features.unrestricted_attribute_tokens {
+                // Unfortunately, `parse_meta` cannot be called speculatively
+                // because it can report errors by itself, so we have to call it
+                // only if the feature is disabled.
+                if let Err(mut err) = attr.parse_meta(self.context.parse_sess) {
+                    err.help("try enabling `#![feature(unrestricted_attribute_tokens)]`").emit()
+                }
             }
         }
     }
@@ -1827,25 +1930,6 @@
         visit::walk_impl_item(self, ii);
     }
 
-    fn visit_path(&mut self, path: &'a ast::Path, _id: NodeId) {
-        for segment in &path.segments {
-            // Identifiers we are going to check could come from a legacy macro (e.g., `#[test]`).
-            // For such macros identifiers must have empty context, because this context is
-            // used during name resolution and produced names must be unhygienic for compatibility.
-            // On the other hand, we need the actual non-empty context for feature gate checking
-            // because it's hygienic even for legacy macros. As previously stated, such context
-            // cannot be kept in identifiers, so it's kept in paths instead and we take it from
-            // there while keeping location info from the ident span.
-            let span = segment.ident.span.with_ctxt(path.span.ctxt());
-            if segment.ident.name == keywords::Extern.name() {
-                gate_feature_post!(&self, extern_in_paths, span,
-                                   "`extern` in paths is experimental");
-            }
-        }
-
-        visit::walk_path(self, path);
-    }
-
     fn visit_vis(&mut self, vis: &'a ast::Visibility) {
         if let ast::VisibilityKind::Crate(ast::CrateSugar::JustCrate) = vis.node {
             gate_feature_post!(&self, crate_visibility_modifier, vis.span,
@@ -1945,11 +2029,7 @@
 
         let list = match attr.meta_item_list() {
             Some(list) => list,
-            None => {
-                span_err!(span_handler, attr.span, E0555,
-                          "malformed feature attribute, expected #![feature(...)]");
-                continue
-            }
+            None => continue,
         };
 
         for mi in list {
diff --git a/src/libsyntax/fold.rs b/src/libsyntax/fold.rs
index 8ac1038..a4c3b38 100644
--- a/src/libsyntax/fold.rs
+++ b/src/libsyntax/fold.rs
@@ -598,7 +598,7 @@
         TokenTree::Delimited(span, delim, tts) => TokenTree::Delimited(
             DelimSpan::from_pair(fld.new_span(span.open), fld.new_span(span.close)),
             delim,
-            fld.fold_tts(tts.stream()).into(),
+            fld.fold_tts(tts).into(),
         ),
     }
 }
diff --git a/src/libsyntax/json.rs b/src/libsyntax/json.rs
index ea0fe71..cf11ac5 100644
--- a/src/libsyntax/json.rs
+++ b/src/libsyntax/json.rs
@@ -7,7 +7,7 @@
 //! The format of the JSON output should be considered *unstable*. For now the
 //! structs at the end of this file (Diagnostic*) specify the error format.
 
-// FIXME spec the JSON output properly.
+// FIXME: spec the JSON output properly.
 
 use source_map::{SourceMap, FilePathMapping};
 use syntax_pos::{self, MacroBacktrace, Span, SpanLabel, MultiSpan};
diff --git a/src/libsyntax/lib.rs b/src/libsyntax/lib.rs
index ea943e1..df22dac 100644
--- a/src/libsyntax/lib.rs
+++ b/src/libsyntax/lib.rs
@@ -10,6 +10,7 @@
        test(attr(deny(warnings))))]
 
 #![feature(crate_visibility_modifier)]
+#![feature(label_break_value)]
 #![feature(nll)]
 #![feature(rustc_attrs)]
 #![feature(rustc_diagnostic_macros)]
diff --git a/src/libsyntax/parse/lexer/mod.rs b/src/libsyntax/parse/lexer/mod.rs
index ecb34e4..0e1c3b4 100644
--- a/src/libsyntax/parse/lexer/mod.rs
+++ b/src/libsyntax/parse/lexer/mod.rs
@@ -299,7 +299,7 @@
 
     /// Report a lexical error with a given span.
     fn err_span(&self, sp: Span, m: &str) {
-        self.sess.span_diagnostic.span_err(sp, m)
+        self.sess.span_diagnostic.struct_span_err(sp, m).emit();
     }
 
 
diff --git a/src/libsyntax/parse/mod.rs b/src/libsyntax/parse/mod.rs
index ba5676a..ddb350f 100644
--- a/src/libsyntax/parse/mod.rs
+++ b/src/libsyntax/parse/mod.rs
@@ -520,6 +520,7 @@
                 } else {
                     let msg = format!("invalid suffix `{}` for float literal", suf);
                     diag.struct_span_err(span, &msg)
+                        .span_label(span, format!("invalid suffix `{}`", suf))
                         .help("valid suffixes are `f32` and `f64`")
                         .emit();
                 }
@@ -673,7 +674,11 @@
                 _ => None,
             };
             if let Some(err) = err {
-                err!(diag, |span, diag| diag.span_err(span, err));
+                err!(diag, |span, diag| {
+                    diag.struct_span_err(span, err)
+                        .span_label(span, "not supported")
+                        .emit();
+                });
             }
             return filtered_float_lit(Symbol::intern(s), Some(suf), diag)
         }
@@ -712,6 +717,7 @@
                     } else {
                         let msg = format!("invalid suffix `{}` for numeric literal", suf);
                         diag.struct_span_err(span, &msg)
+                            .span_label(span, format!("invalid suffix `{}`", suf))
                             .help("the suffix must be one of the integral types \
                                    (`u32`, `isize`, etc)")
                             .emit();
@@ -811,7 +817,7 @@
                 )
                 if name_macro_rules.name == "macro_rules"
                 && name_zip.name == "zip" => {
-                    let tts = &macro_tts.stream().trees().collect::<Vec<_>>();
+                    let tts = &macro_tts.trees().collect::<Vec<_>>();
                     match (tts.len(), tts.get(0), tts.get(1), tts.get(2)) {
                         (
                             3,
@@ -820,7 +826,7 @@
                             Some(&TokenTree::Delimited(_, second_delim, ref second_tts)),
                         )
                         if macro_delim == token::Paren => {
-                            let tts = &first_tts.stream().trees().collect::<Vec<_>>();
+                            let tts = &first_tts.trees().collect::<Vec<_>>();
                             match (tts.len(), tts.get(0), tts.get(1)) {
                                 (
                                     2,
@@ -830,7 +836,7 @@
                                 if first_delim == token::Paren && ident.name == "a" => {},
                                 _ => panic!("value 3: {:?} {:?}", first_delim, first_tts),
                             }
-                            let tts = &second_tts.stream().trees().collect::<Vec<_>>();
+                            let tts = &second_tts.trees().collect::<Vec<_>>();
                             match (tts.len(), tts.get(0), tts.get(1)) {
                                 (
                                     2,
diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs
index 5c8ed94..7e15b231 100644
--- a/src/libsyntax/parse/parser.rs
+++ b/src/libsyntax/parse/parser.rs
@@ -46,7 +46,7 @@
 use ptr::P;
 use parse::PResult;
 use ThinVec;
-use tokenstream::{self, DelimSpan, ThinTokenStream, TokenTree, TokenStream};
+use tokenstream::{self, DelimSpan, TokenTree, TokenStream, TreeAndJoint};
 use symbol::{Symbol, keywords};
 
 use std::borrow::Cow;
@@ -280,17 +280,17 @@
 /// on the parser.
 #[derive(Clone)]
 enum LastToken {
-    Collecting(Vec<TokenStream>),
-    Was(Option<TokenStream>),
+    Collecting(Vec<TreeAndJoint>),
+    Was(Option<TreeAndJoint>),
 }
 
 impl TokenCursorFrame {
-    fn new(sp: DelimSpan, delim: DelimToken, tts: &ThinTokenStream) -> Self {
+    fn new(sp: DelimSpan, delim: DelimToken, tts: &TokenStream) -> Self {
         TokenCursorFrame {
             delim: delim,
             span: sp,
             open_delim: delim == token::NoDelim,
-            tree_cursor: tts.stream().into_trees(),
+            tree_cursor: tts.clone().into_trees(),
             close_delim: delim == token::NoDelim,
             last_token: LastToken::Was(None),
         }
@@ -1012,7 +1012,10 @@
                 if text.is_empty() {
                     self.span_bug(sp, "found empty literal suffix in Some")
                 }
-                self.span_err(sp, &format!("{} with a suffix is invalid", kind));
+                let msg = format!("{} with a suffix is invalid", kind);
+                self.struct_span_err(sp, &msg)
+                    .span_label(sp, msg)
+                    .emit();
             }
         }
     }
@@ -1299,7 +1302,7 @@
     fn token_is_bare_fn_keyword(&mut self) -> bool {
         self.check_keyword(keywords::Fn) ||
             self.check_keyword(keywords::Unsafe) ||
-            self.check_keyword(keywords::Extern) && self.is_extern_non_path()
+            self.check_keyword(keywords::Extern)
     }
 
     /// parse a `TyKind::BareFn` type:
@@ -1768,9 +1771,11 @@
             Mutability::Immutable
         } else {
             let span = self.prev_span;
-            self.span_err(span,
-                          "expected mut or const in raw pointer type (use \
-                           `*mut T` or `*const T` as appropriate)");
+            let msg = "expected mut or const in raw pointer type";
+            self.struct_span_err(span, msg)
+                .span_label(span, msg)
+                .help("use `*mut T` or `*const T` as appropriate")
+                .emit();
             Mutability::Immutable
         };
         let t = self.parse_ty_no_plus()?;
@@ -2325,7 +2330,7 @@
         })
     }
 
-    fn expect_delimited_token_tree(&mut self) -> PResult<'a, (MacDelimiter, ThinTokenStream)> {
+    fn expect_delimited_token_tree(&mut self) -> PResult<'a, (MacDelimiter, TokenStream)> {
         let delim = match self.token {
             token::OpenDelim(delim) => delim,
             _ => {
@@ -2345,7 +2350,7 @@
             token::Brace => MacDelimiter::Brace,
             token::NoDelim => self.bug("unexpected no delimiter"),
         };
-        Ok((delim, tts.stream().into()))
+        Ok((delim, tts.into()))
     }
 
     /// At the bottom (top?) of the precedence hierarchy,
@@ -3815,8 +3820,12 @@
                     ddpos = Some(fields.len());
                 } else {
                     // Emit a friendly error, ignore `..` and continue parsing
-                    self.span_err(self.prev_span,
-                                  "`..` can only be used once per tuple or tuple struct pattern");
+                    self.struct_span_err(
+                        self.prev_span,
+                        "`..` can only be used once per tuple or tuple struct pattern",
+                    )
+                        .span_label(self.prev_span, "can only be used once per pattern")
+                        .emit();
                 }
             } else if !self.check(&token::CloseDelim(token::Paren)) {
                 fields.push(self.parse_pat(None)?);
@@ -3832,7 +3841,10 @@
 
         if ddpos == Some(fields.len()) && trailing_comma {
             // `..` needs to be followed by `)` or `, pat`, `..,)` is disallowed.
-            self.span_err(self.prev_span, "trailing comma is not permitted after `..`");
+            let msg = "trailing comma is not permitted after `..`";
+            self.struct_span_err(self.prev_span, msg)
+                .span_label(self.prev_span, msg)
+                .emit();
         }
 
         Ok((fields, ddpos, trailing_comma))
@@ -4051,12 +4063,13 @@
 
         if let Some(mut err) = delayed_err {
             if let Some(etc_span) = etc_span {
-                err.multipart_suggestion(
+                err.multipart_suggestion_with_applicability(
                     "move the `..` to the end of the field list",
                     vec![
                         (etc_span, String::new()),
                         (self.span, format!("{}.. }}", if ate_comma { "" } else { ", " })),
                     ],
+                    Applicability::MachineApplicable,
                 );
             }
             err.emit();
@@ -4605,10 +4618,6 @@
         self.token.is_keyword(keywords::Crate) && self.look_ahead(1, |t| t != &token::ModSep)
     }
 
-    fn is_extern_non_path(&self) -> bool {
-        self.token.is_keyword(keywords::Extern) && self.look_ahead(1, |t| t != &token::ModSep)
-    }
-
     fn is_existential_type_decl(&self) -> bool {
         self.token.is_keyword(keywords::Existential) &&
         self.look_ahead(1, |t| t.is_keyword(keywords::Type))
@@ -4633,7 +4642,7 @@
                 let ident = self.parse_ident()?;
                 let tokens = if self.check(&token::OpenDelim(token::Brace)) {
                     match self.parse_token_tree() {
-                        TokenTree::Delimited(_, _, tts) => tts.stream(),
+                        TokenTree::Delimited(_, _, tts) => tts,
                         _ => unreachable!(),
                     }
                 } else if self.check(&token::OpenDelim(token::Paren)) {
@@ -4712,12 +4721,10 @@
         // like a path (1 token), but it fact not a path.
         // `union::b::c` - path, `union U { ... }` - not a path.
         // `crate::b::c` - path, `crate struct S;` - not a path.
-        // `extern::b::c` - path, `extern crate c;` - not a path.
         } else if self.token.is_path_start() &&
                   !self.token.is_qpath_start() &&
                   !self.is_union_item() &&
                   !self.is_crate_vis() &&
-                  !self.is_extern_non_path() &&
                   !self.is_existential_type_decl() &&
                   !self.is_auto_trait_item() {
             let pth = self.parse_path(PathStyle::Expr)?;
@@ -5228,22 +5235,13 @@
                     kind: ast::GenericParamKind::Lifetime,
                 });
                 if let Some(sp) = seen_ty_param {
-                    let param_span = self.prev_span;
-                    let ate_comma = self.eat(&token::Comma);
-                    let remove_sp = if ate_comma {
-                        param_span.until(self.span)
-                    } else {
-                        last_comma_span.unwrap_or(param_span).to(param_span)
-                    };
-                    bad_lifetime_pos.push(param_span);
-
-                    if let Ok(snippet) = self.sess.source_map().span_to_snippet(param_span) {
+                    let remove_sp = last_comma_span.unwrap_or(self.prev_span).to(self.prev_span);
+                    bad_lifetime_pos.push(self.prev_span);
+                    if let Ok(snippet) = self.sess.source_map().span_to_snippet(self.prev_span) {
                         suggestions.push((remove_sp, String::new()));
-                        suggestions.push((sp.shrink_to_lo(), format!("{}, ", snippet)));
-                    }
-                    if ate_comma {
-                        last_comma_span = Some(self.prev_span);
-                        continue
+                        suggestions.push((
+                            sp.shrink_to_lo(),
+                            format!("{}, ", snippet)));
                     }
                 }
             } else if self.check_ident() {
@@ -5256,8 +5254,12 @@
                 // Check for trailing attributes and stop parsing.
                 if !attrs.is_empty() {
                     let param_kind = if seen_ty_param.is_some() { "type" } else { "lifetime" };
-                    self.span_err(attrs[0].span,
-                        &format!("trailing attribute after {} parameters", param_kind));
+                    self.struct_span_err(
+                        attrs[0].span,
+                        &format!("trailing attribute after {} parameters", param_kind),
+                    )
+                    .span_label(attrs[0].span, "attributes must go before parameters")
+                    .emit();
                 }
                 break
             }
@@ -5315,19 +5317,28 @@
 
     /// Parses (possibly empty) list of lifetime and type arguments and associated type bindings,
     /// possibly including trailing comma.
-    fn parse_generic_args(&mut self)
-                          -> PResult<'a, (Vec<GenericArg>, Vec<TypeBinding>)> {
+    fn parse_generic_args(&mut self) -> PResult<'a, (Vec<GenericArg>, Vec<TypeBinding>)> {
         let mut args = Vec::new();
         let mut bindings = Vec::new();
         let mut seen_type = false;
         let mut seen_binding = false;
+        let mut first_type_or_binding_span: Option<Span> = None;
+        let mut bad_lifetime_pos = vec![];
+        let mut last_comma_span = None;
+        let mut suggestions = vec![];
         loop {
             if self.check_lifetime() && self.look_ahead(1, |t| !t.is_like_plus()) {
                 // Parse lifetime argument.
                 args.push(GenericArg::Lifetime(self.expect_lifetime()));
                 if seen_type || seen_binding {
-                    self.span_err(self.prev_span,
-                        "lifetime parameters must be declared prior to type parameters");
+                    let remove_sp = last_comma_span.unwrap_or(self.prev_span).to(self.prev_span);
+                    bad_lifetime_pos.push(self.prev_span);
+                    if let Ok(snippet) = self.sess.source_map().span_to_snippet(self.prev_span) {
+                        suggestions.push((remove_sp, String::new()));
+                        suggestions.push((
+                            first_type_or_binding_span.unwrap().shrink_to_lo(),
+                            format!("{}, ", snippet)));
+                    }
                 }
             } else if self.check_ident() && self.look_ahead(1, |t| t == &token::Eq) {
                 // Parse associated type binding.
@@ -5335,19 +5346,33 @@
                 let ident = self.parse_ident()?;
                 self.bump();
                 let ty = self.parse_ty()?;
+                let span = lo.to(self.prev_span);
                 bindings.push(TypeBinding {
                     id: ast::DUMMY_NODE_ID,
                     ident,
                     ty,
-                    span: lo.to(self.prev_span),
+                    span,
                 });
                 seen_binding = true;
+                if first_type_or_binding_span.is_none() {
+                    first_type_or_binding_span = Some(span);
+                }
             } else if self.check_type() {
                 // Parse type argument.
                 let ty_param = self.parse_ty()?;
                 if seen_binding {
-                    self.span_err(ty_param.span,
-                        "type parameters must be declared prior to associated type bindings");
+                    self.struct_span_err(
+                        ty_param.span,
+                        "type parameters must be declared prior to associated type bindings"
+                    )
+                        .span_label(
+                            ty_param.span,
+                            "must be declared prior to associated type bindings",
+                        )
+                        .emit();
+                }
+                if first_type_or_binding_span.is_none() {
+                    first_type_or_binding_span = Some(ty_param.span);
                 }
                 args.push(GenericArg::Type(ty_param));
                 seen_type = true;
@@ -5357,8 +5382,30 @@
 
             if !self.eat(&token::Comma) {
                 break
+            } else {
+                last_comma_span = Some(self.prev_span);
             }
         }
+        if !bad_lifetime_pos.is_empty() {
+            let mut err = self.struct_span_err(
+                bad_lifetime_pos.clone(),
+                "lifetime parameters must be declared prior to type parameters"
+            );
+            for sp in &bad_lifetime_pos {
+                err.span_label(*sp, "must be declared prior to type parameters");
+            }
+            if !suggestions.is_empty() {
+                err.multipart_suggestion_with_applicability(
+                    &format!(
+                        "move the lifetime parameter{} prior to the first type parameter",
+                        if bad_lifetime_pos.len() > 1 { "s" } else { "" },
+                    ),
+                    suggestions,
+                    Applicability::MachineApplicable,
+                );
+            }
+            err.emit();
+        }
         Ok((args, bindings))
     }
 
@@ -5386,8 +5433,12 @@
         // change we parse those generics now, but report an error.
         if self.choose_generics_over_qpath() {
             let generics = self.parse_generics()?;
-            self.span_err(generics.span,
-                          "generic parameters on `where` clauses are reserved for future use");
+            self.struct_span_err(
+                generics.span,
+                "generic parameters on `where` clauses are reserved for future use",
+            )
+                .span_label(generics.span, "currently unsupported")
+                .emit();
         }
 
         loop {
@@ -5587,15 +5638,20 @@
                 // *mut self
                 // *not_self
                 // Emit special error for `self` cases.
+                let msg = "cannot pass `self` by raw pointer";
                 (if isolated_self(self, 1) {
                     self.bump();
-                    self.span_err(self.span, "cannot pass `self` by raw pointer");
+                    self.struct_span_err(self.span, msg)
+                        .span_label(self.span, msg)
+                        .emit();
                     SelfKind::Value(Mutability::Immutable)
                 } else if self.look_ahead(1, |t| t.is_mutability()) &&
                           isolated_self(self, 2) {
                     self.bump();
                     self.bump();
-                    self.span_err(self.span, "cannot pass `self` by raw pointer");
+                    self.struct_span_err(self.span, msg)
+                        .span_label(self.span, msg)
+                        .emit();
                     SelfKind::Value(Mutability::Immutable)
                 } else {
                     return Ok(None);
@@ -5932,7 +5988,10 @@
             tps.where_clause = self.parse_where_clause()?;
             self.expect(&token::Semi)?;
             if unsafety != Unsafety::Normal {
-                self.span_err(self.prev_span, "trait aliases cannot be unsafe");
+                let msg = "trait aliases cannot be unsafe";
+                self.struct_span_err(self.prev_span, msg)
+                    .span_label(self.prev_span, msg)
+                    .emit();
             }
             Ok((ident, ItemKind::TraitAlias(tps, bounds), None))
         } else {
@@ -6048,7 +6107,13 @@
             Some(ty_second) => {
                 // impl Trait for Type
                 if !has_for {
-                    self.span_err(missing_for_span, "missing `for` in a trait impl");
+                    self.struct_span_err(missing_for_span, "missing `for` in a trait impl")
+                        .span_suggestion_short_with_applicability(
+                            missing_for_span,
+                            "add `for` here",
+                            " for ".to_string(),
+                            Applicability::MachineApplicable,
+                        ).emit();
                 }
 
                 let ty_first = ty_first.into_inner();
@@ -6409,41 +6474,52 @@
         }
     }
 
+    fn maybe_consume_incorrect_semicolon(&mut self, items: &[P<Item>]) -> bool {
+        if self.eat(&token::Semi) {
+            let mut err = self.struct_span_err(self.prev_span, "expected item, found `;`");
+            err.span_suggestion_short_with_applicability(
+                self.prev_span,
+                "remove this semicolon",
+                String::new(),
+                Applicability::MachineApplicable,
+            );
+            if !items.is_empty() {
+                let previous_item = &items[items.len()-1];
+                let previous_item_kind_name = match previous_item.node {
+                    // say "braced struct" because tuple-structs and
+                    // braceless-empty-struct declarations do take a semicolon
+                    ItemKind::Struct(..) => Some("braced struct"),
+                    ItemKind::Enum(..) => Some("enum"),
+                    ItemKind::Trait(..) => Some("trait"),
+                    ItemKind::Union(..) => Some("union"),
+                    _ => None,
+                };
+                if let Some(name) = previous_item_kind_name {
+                    err.help(&format!("{} declarations are not followed by a semicolon", name));
+                }
+            }
+            err.emit();
+            true
+        } else {
+            false
+        }
+    }
+
     /// Given a termination token, parse all of the items in a module
     fn parse_mod_items(&mut self, term: &token::Token, inner_lo: Span) -> PResult<'a, Mod> {
         let mut items = vec![];
         while let Some(item) = self.parse_item()? {
             items.push(item);
+            self.maybe_consume_incorrect_semicolon(&items);
         }
 
         if !self.eat(term) {
             let token_str = self.this_token_descr();
-            let mut err = self.fatal(&format!("expected item, found {}", token_str));
-            if self.token == token::Semi {
-                let msg = "consider removing this semicolon";
-                err.span_suggestion_short_with_applicability(
-                    self.span, msg, String::new(), Applicability::MachineApplicable
-                );
-                if !items.is_empty() {  // Issue #51603
-                    let previous_item = &items[items.len()-1];
-                    let previous_item_kind_name = match previous_item.node {
-                        // say "braced struct" because tuple-structs and
-                        // braceless-empty-struct declarations do take a semicolon
-                        ItemKind::Struct(..) => Some("braced struct"),
-                        ItemKind::Enum(..) => Some("enum"),
-                        ItemKind::Trait(..) => Some("trait"),
-                        ItemKind::Union(..) => Some("union"),
-                        _ => None,
-                    };
-                    if let Some(name) = previous_item_kind_name {
-                        err.help(&format!("{} declarations are not followed by a semicolon",
-                                          name));
-                    }
-                }
-            } else {
+            if !self.maybe_consume_incorrect_semicolon(&items) {
+                let mut err = self.fatal(&format!("expected item, found {}", token_str));
                 err.span_label(self.span, "expected item");
+                return Err(err);
             }
-            return Err(err);
         }
 
         let hi = if self.span.is_dummy() {
@@ -6829,7 +6905,11 @@
 
             let mut err = self.struct_span_err(fixed_name_sp, error_msg);
             err.span_label(fixed_name_sp, "dash-separated idents are not valid");
-            err.multipart_suggestion(suggestion_msg, replacement);
+            err.multipart_suggestion_with_applicability(
+                suggestion_msg,
+                replacement,
+                Applicability::MachineApplicable,
+            );
             err.emit();
         }
         Ok(ident)
@@ -6939,7 +7019,7 @@
     fn parse_enum_def(&mut self, _generics: &ast::Generics) -> PResult<'a, EnumDef> {
         let mut variants = Vec::new();
         let mut all_nullary = true;
-        let mut any_disr = None;
+        let mut any_disr = vec![];
         while self.token != token::CloseDelim(token::Brace) {
             let variant_attrs = self.parse_outer_attributes()?;
             let vlo = self.span;
@@ -6961,7 +7041,9 @@
                     id: ast::DUMMY_NODE_ID,
                     value: self.parse_expr()?,
                 });
-                any_disr = disr_expr.as_ref().map(|c| c.value.span);
+                if let Some(sp) = disr_expr.as_ref().map(|c| c.value.span) {
+                    any_disr.push(sp);
+                }
                 struct_def = VariantData::Unit(ast::DUMMY_NODE_ID);
             } else {
                 struct_def = VariantData::Unit(ast::DUMMY_NODE_ID);
@@ -6978,11 +7060,15 @@
             if !self.eat(&token::Comma) { break; }
         }
         self.expect(&token::CloseDelim(token::Brace))?;
-        match any_disr {
-            Some(disr_span) if !all_nullary =>
-                self.span_err(disr_span,
-                    "discriminator values can only be used with a field-less enum"),
-            _ => ()
+        if !any_disr.is_empty() && !all_nullary {
+            let mut err =self.struct_span_err(
+                any_disr.clone(),
+                "discriminator values can only be used with a field-less enum",
+            );
+            for sp in any_disr {
+                err.span_label(sp, "only valid in field-less enums");
+            }
+            err.emit();
         }
 
         Ok(ast::EnumDef { variants })
@@ -7113,8 +7199,7 @@
             return Ok(Some(item));
         }
 
-        if self.check_keyword(keywords::Extern) && self.is_extern_non_path() {
-            self.bump(); // `extern`
+        if self.eat_keyword(keywords::Extern) {
             if self.eat_keyword(keywords::Crate) {
                 return Ok(Some(self.parse_item_extern_crate(lo, visibility, attrs)?));
             }
@@ -7623,7 +7708,7 @@
     fn parse_assoc_macro_invoc(&mut self, item_kind: &str, vis: Option<&Visibility>,
                                at_end: &mut bool) -> PResult<'a, Option<Mac>>
     {
-        if self.token.is_path_start() && !self.is_extern_non_path() {
+        if self.token.is_path_start() {
             let prev_span = self.prev_span;
             let lo = self.span;
             let pth = self.parse_path(PathStyle::Mod)?;
@@ -7677,7 +7762,7 @@
             &mut self.token_cursor.stack[prev].last_token
         };
 
-        // Pull our the toekns that we've collected from the call to `f` above
+        // Pull out the tokens that we've collected from the call to `f` above.
         let mut collected_tokens = match *last_token {
             LastToken::Collecting(ref mut v) => mem::replace(v, Vec::new()),
             LastToken::Was(_) => panic!("our vector went away?"),
@@ -7696,10 +7781,9 @@
         // call. In that case we need to record all the tokens we collected in
         // our parent list as well. To do that we push a clone of our stream
         // onto the previous list.
-        let stream = collected_tokens.into_iter().collect::<TokenStream>();
         match prev_collecting {
             Some(mut list) => {
-                list.push(stream.clone());
+                list.extend(collected_tokens.iter().cloned());
                 list.extend(extra_token);
                 *last_token = LastToken::Collecting(list);
             }
@@ -7708,7 +7792,7 @@
             }
         }
 
-        Ok((ret?, stream))
+        Ok((ret?, TokenStream::new(collected_tokens)))
     }
 
     pub fn parse_item(&mut self) -> PResult<'a, Option<P<Item>>> {
diff --git a/src/libsyntax/print/pprust.rs b/src/libsyntax/print/pprust.rs
index 2ad3d3a..c535940 100644
--- a/src/libsyntax/print/pprust.rs
+++ b/src/libsyntax/print/pprust.rs
@@ -807,7 +807,7 @@
             TokenTree::Delimited(_, delim, tts) => {
                 self.writer().word(token_to_string(&token::OpenDelim(delim)))?;
                 self.writer().space()?;
-                self.print_tts(tts.stream())?;
+                self.print_tts(tts)?;
                 self.writer().space()?;
                 self.writer().word(token_to_string(&token::CloseDelim(delim)))
             },
diff --git a/src/libsyntax/test.rs b/src/libsyntax/test.rs
index 884c4fd..b352486 100644
--- a/src/libsyntax/test.rs
+++ b/src/libsyntax/test.rs
@@ -428,14 +428,11 @@
 
 fn get_test_runner(sd: &errors::Handler, krate: &ast::Crate) -> Option<ast::Path> {
     let test_attr = attr::find_by_name(&krate.attrs, "test_runner")?;
-    if let Some(meta_list) = test_attr.meta_item_list() {
+    test_attr.meta_item_list().map(|meta_list| {
         if meta_list.len() != 1 {
             sd.span_fatal(test_attr.span(),
                 "#![test_runner(..)] accepts exactly 1 argument").raise()
         }
-        Some(meta_list[0].word().as_ref().unwrap().ident.clone())
-    } else {
-        sd.span_fatal(test_attr.span(),
-            "test_runner must be of the form #[test_runner(..)]").raise()
-    }
+        meta_list[0].word().as_ref().unwrap().ident.clone()
+    })
 }
diff --git a/src/libsyntax/tokenstream.rs b/src/libsyntax/tokenstream.rs
index fb72ef9..f5d2d6f 100644
--- a/src/libsyntax/tokenstream.rs
+++ b/src/libsyntax/tokenstream.rs
@@ -41,7 +41,7 @@
     /// A single token
     Token(Span, token::Token),
     /// A delimited sequence of token trees
-    Delimited(DelimSpan, DelimToken, ThinTokenStream),
+    Delimited(DelimSpan, DelimToken, TokenStream),
 }
 
 impl TokenTree {
@@ -62,8 +62,7 @@
             (&TokenTree::Token(_, ref tk), &TokenTree::Token(_, ref tk2)) => tk == tk2,
             (&TokenTree::Delimited(_, delim, ref tts),
              &TokenTree::Delimited(_, delim2, ref tts2)) => {
-                delim == delim2 &&
-                tts.stream().eq_unspanned(&tts2.stream())
+                delim == delim2 && tts.eq_unspanned(&tts2)
             }
             (_, _) => false,
         }
@@ -81,8 +80,7 @@
             }
             (&TokenTree::Delimited(_, delim, ref tts),
              &TokenTree::Delimited(_, delim2, ref tts2)) => {
-                delim == delim2 &&
-                tts.stream().probably_equal_for_proc_macro(&tts2.stream())
+                delim == delim2 && tts.probably_equal_for_proc_macro(&tts2)
             }
             (_, _) => false,
         }
@@ -113,7 +111,7 @@
     }
 
     pub fn joint(self) -> TokenStream {
-        TokenStream::Tree(self, Joint)
+        TokenStream::new(vec![(self, Joint)])
     }
 
     /// Returns the opening delimiter as a token tree.
@@ -143,18 +141,19 @@
 /// The goal is for procedural macros to work with `TokenStream`s and `TokenTree`s
 /// instead of a representation of the abstract syntax tree.
 /// Today's `TokenTree`s can still contain AST via `Token::Interpolated` for back-compat.
+///
+/// The use of `Option` is an optimization that avoids the need for an
+/// allocation when the stream is empty. However, it is not guaranteed that an
+/// empty stream is represented with `None`; it may be represented as a `Some`
+/// around an empty `Vec`.
 #[derive(Clone, Debug)]
-pub enum TokenStream {
-    Empty,
-    Tree(TokenTree, IsJoint),
-    Stream(Lrc<Vec<TreeAndJoint>>),
-}
+pub struct TokenStream(Option<Lrc<Vec<TreeAndJoint>>>);
 
 pub type TreeAndJoint = (TokenTree, IsJoint);
 
 // `TokenStream` is used a lot. Make sure it doesn't unintentionally get bigger.
 #[cfg(target_arch = "x86_64")]
-static_assert!(MEM_SIZE_OF_TOKEN_STREAM: mem::size_of::<TokenStream>() == 32);
+static_assert!(MEM_SIZE_OF_TOKEN_STREAM: mem::size_of::<TokenStream>() == 8);
 
 #[derive(Clone, Copy, Debug, PartialEq)]
 pub enum IsJoint {
@@ -169,7 +168,7 @@
     /// separating the two arguments with a comma for diagnostic suggestions.
     pub(crate) fn add_comma(&self) -> Option<(TokenStream, Span)> {
         // Used to suggest if a user writes `foo!(a b);`
-        if let TokenStream::Stream(ref stream) = self {
+        if let Some(ref stream) = self.0 {
             let mut suggestion = None;
             let mut iter = stream.iter().enumerate().peekable();
             while let Some((pos, ts)) = iter.next() {
@@ -201,7 +200,7 @@
 
 impl From<TokenTree> for TokenStream {
     fn from(tree: TokenTree) -> TokenStream {
-        TokenStream::Tree(tree, NonJoint)
+        TokenStream::new(vec![(tree, NonJoint)])
     }
 }
 
@@ -233,7 +232,7 @@
 
 impl TokenStream {
     pub fn len(&self) -> usize {
-        if let TokenStream::Stream(ref slice) = self {
+        if let Some(ref slice) = self.0 {
             slice.len()
         } else {
             0
@@ -241,13 +240,13 @@
     }
 
     pub fn empty() -> TokenStream {
-        TokenStream::Empty
+        TokenStream(None)
     }
 
     pub fn is_empty(&self) -> bool {
-        match self {
-            TokenStream::Empty => true,
-            _ => false,
+        match self.0 {
+            None => true,
+            Some(ref stream) => stream.is_empty(),
         }
     }
 
@@ -258,10 +257,9 @@
             _ => {
                 let mut vec = vec![];
                 for stream in streams {
-                    match stream {
-                        TokenStream::Empty => {},
-                        TokenStream::Tree(tree, is_joint) => vec.push((tree, is_joint)),
-                        TokenStream::Stream(stream2) => vec.extend(stream2.iter().cloned()),
+                    match stream.0 {
+                        None => {},
+                        Some(stream2) => vec.extend(stream2.iter().cloned()),
                     }
                 }
                 TokenStream::new(vec)
@@ -269,22 +267,16 @@
         }
     }
 
-    pub fn new(mut streams: Vec<TreeAndJoint>) -> TokenStream {
+    pub fn new(streams: Vec<TreeAndJoint>) -> TokenStream {
         match streams.len() {
-            0 => TokenStream::empty(),
-            1 => {
-                let (tree, is_joint) = streams.pop().unwrap();
-                TokenStream::Tree(tree, is_joint)
-            }
-            _ => TokenStream::Stream(Lrc::new(streams)),
+            0 => TokenStream(None),
+            _ => TokenStream(Some(Lrc::new(streams))),
         }
     }
 
     pub fn append_to_tree_and_joint_vec(self, vec: &mut Vec<TreeAndJoint>) {
-        match self {
-            TokenStream::Empty => {}
-            TokenStream::Tree(tree, is_joint) => vec.push((tree, is_joint)),
-            TokenStream::Stream(stream) => vec.extend(stream.iter().cloned()),
+        if let Some(stream) = self.0 {
+            vec.extend(stream.iter().cloned());
         }
     }
 
@@ -349,51 +341,36 @@
     }
 
     pub fn map_enumerated<F: FnMut(usize, TokenTree) -> TokenTree>(self, mut f: F) -> TokenStream {
-        match self {
-            TokenStream::Empty => TokenStream::Empty,
-            TokenStream::Tree(tree, is_joint) => TokenStream::Tree(f(0, tree), is_joint),
-            TokenStream::Stream(stream) => TokenStream::Stream(Lrc::new(
+        TokenStream(self.0.map(|stream| {
+            Lrc::new(
                 stream
                     .iter()
                     .enumerate()
                     .map(|(i, (tree, is_joint))| (f(i, tree.clone()), *is_joint))
-                    .collect()
-            )),
-        }
+                    .collect())
+        }))
     }
 
     pub fn map<F: FnMut(TokenTree) -> TokenTree>(self, mut f: F) -> TokenStream {
-        match self {
-            TokenStream::Empty => TokenStream::Empty,
-            TokenStream::Tree(tree, is_joint) => TokenStream::Tree(f(tree), is_joint),
-            TokenStream::Stream(stream) => TokenStream::Stream(Lrc::new(
+        TokenStream(self.0.map(|stream| {
+            Lrc::new(
                 stream
                     .iter()
                     .map(|(tree, is_joint)| (f(tree.clone()), *is_joint))
-                    .collect()
-            )),
-        }
+                    .collect())
+        }))
     }
 
-    fn first_tree_and_joint(&self) -> Option<(TokenTree, IsJoint)> {
-        match self {
-            TokenStream::Empty => None,
-            TokenStream::Tree(ref tree, is_joint) => Some((tree.clone(), *is_joint)),
-            TokenStream::Stream(ref stream) => Some(stream.first().unwrap().clone())
-        }
+    fn first_tree_and_joint(&self) -> Option<TreeAndJoint> {
+        self.0.as_ref().map(|stream| {
+            stream.first().unwrap().clone()
+        })
     }
 
     fn last_tree_if_joint(&self) -> Option<TokenTree> {
-        match self {
-            TokenStream::Empty => None,
-            TokenStream::Tree(ref tree, is_joint) => {
-                if *is_joint == Joint {
-                    Some(tree.clone())
-                } else {
-                    None
-                }
-            }
-            TokenStream::Stream(ref stream) => {
+        match self.0 {
+            None => None,
+            Some(ref stream) => {
                 if let (tree, Joint) = stream.last().unwrap() {
                     Some(tree.clone())
                 } else {
@@ -422,7 +399,7 @@
                     self.push_all_but_last_tree(&last_stream);
                     let glued_span = last_span.to(span);
                     let glued_tt = TokenTree::Token(glued_span, glued_tok);
-                    let glued_tokenstream = TokenStream::Tree(glued_tt, is_joint);
+                    let glued_tokenstream = TokenStream::new(vec![(glued_tt, is_joint)]);
                     self.0.push(glued_tokenstream);
                     self.push_all_but_first_tree(&stream);
                     return
@@ -437,23 +414,21 @@
     }
 
     fn push_all_but_last_tree(&mut self, stream: &TokenStream) {
-        if let TokenStream::Stream(ref streams) = stream {
+        if let Some(ref streams) = stream.0 {
             let len = streams.len();
             match len {
                 1 => {}
-                2 => self.0.push(TokenStream::Tree(streams[0].0.clone(), streams[0].1)),
-                _ => self.0.push(TokenStream::Stream(Lrc::new(streams[0 .. len - 1].to_vec()))),
+                _ => self.0.push(TokenStream(Some(Lrc::new(streams[0 .. len - 1].to_vec())))),
             }
         }
     }
 
     fn push_all_but_first_tree(&mut self, stream: &TokenStream) {
-        if let TokenStream::Stream(ref streams) = stream {
+        if let Some(ref streams) = stream.0 {
             let len = streams.len();
             match len {
                 1 => {}
-                2 => self.0.push(TokenStream::Tree(streams[1].0.clone(), streams[1].1)),
-                _ => self.0.push(TokenStream::Stream(Lrc::new(streams[1 .. len].to_vec()))),
+                _ => self.0.push(TokenStream(Some(Lrc::new(streams[1 .. len].to_vec())))),
             }
         }
     }
@@ -479,17 +454,9 @@
     }
 
     pub fn next_with_joint(&mut self) -> Option<TreeAndJoint> {
-        match self.stream {
-            TokenStream::Empty => None,
-            TokenStream::Tree(ref tree, ref is_joint) => {
-                if self.index == 0 {
-                    self.index = 1;
-                    Some((tree.clone(), *is_joint))
-                } else {
-                    None
-                }
-            }
-            TokenStream::Stream(ref stream) => {
+        match self.stream.0 {
+            None => None,
+            Some(ref stream) => {
                 if self.index < stream.len() {
                     self.index += 1;
                     Some(stream[self.index - 1].clone())
@@ -505,63 +472,19 @@
             return;
         }
         let index = self.index;
-        let stream = mem::replace(&mut self.stream, TokenStream::Empty);
+        let stream = mem::replace(&mut self.stream, TokenStream(None));
         *self = TokenStream::from_streams(vec![stream, new_stream]).into_trees();
         self.index = index;
     }
 
     pub fn look_ahead(&self, n: usize) -> Option<TokenTree> {
-        match self.stream {
-            TokenStream::Empty => None,
-            TokenStream::Tree(ref tree, _) => {
-                if n == 0 && self.index == 0 {
-                    Some(tree.clone())
-                } else {
-                    None
-                }
-            }
-            TokenStream::Stream(ref stream) =>
-                stream[self.index ..].get(n).map(|(tree, _)| tree.clone()),
+        match self.stream.0 {
+            None => None,
+            Some(ref stream) => stream[self.index ..].get(n).map(|(tree, _)| tree.clone()),
         }
     }
 }
 
-/// The `TokenStream` type is large enough to represent a single `TokenTree` without allocation.
-/// `ThinTokenStream` is smaller, but needs to allocate to represent a single `TokenTree`.
-/// We must use `ThinTokenStream` in `TokenTree::Delimited` to avoid infinite size due to recursion.
-#[derive(Debug, Clone)]
-pub struct ThinTokenStream(Option<Lrc<Vec<TreeAndJoint>>>);
-
-impl ThinTokenStream {
-    pub fn stream(&self) -> TokenStream {
-        self.clone().into()
-    }
-}
-
-impl From<TokenStream> for ThinTokenStream {
-    fn from(stream: TokenStream) -> ThinTokenStream {
-        ThinTokenStream(match stream {
-            TokenStream::Empty => None,
-            TokenStream::Tree(tree, is_joint) => Some(Lrc::new(vec![(tree, is_joint)])),
-            TokenStream::Stream(stream) => Some(stream),
-        })
-    }
-}
-
-impl From<ThinTokenStream> for TokenStream {
-    fn from(stream: ThinTokenStream) -> TokenStream {
-        stream.0.map(TokenStream::Stream).unwrap_or_else(TokenStream::empty)
-    }
-}
-
-impl Eq for ThinTokenStream {}
-
-impl PartialEq<ThinTokenStream> for ThinTokenStream {
-    fn eq(&self, other: &ThinTokenStream) -> bool {
-        TokenStream::from(self.clone()) == TokenStream::from(other.clone())
-    }
-}
-
 impl fmt::Display for TokenStream {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
         f.write_str(&pprust::tokens_to_string(self.clone()))
@@ -580,18 +503,6 @@
     }
 }
 
-impl Encodable for ThinTokenStream {
-    fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), E::Error> {
-        TokenStream::from(self.clone()).encode(encoder)
-    }
-}
-
-impl Decodable for ThinTokenStream {
-    fn decode<D: Decoder>(decoder: &mut D) -> Result<ThinTokenStream, D::Error> {
-        TokenStream::decode(decoder).map(Into::into)
-    }
-}
-
 #[derive(Debug, Copy, Clone, PartialEq, RustcEncodable, RustcDecodable)]
 pub struct DelimSpan {
     pub open: Span,
diff --git a/src/libsyntax/visit.rs b/src/libsyntax/visit.rs
index 156546b..8cbd47c 100644
--- a/src/libsyntax/visit.rs
+++ b/src/libsyntax/visit.rs
@@ -832,7 +832,7 @@
 pub fn walk_tt<'a, V: Visitor<'a>>(visitor: &mut V, tt: TokenTree) {
     match tt {
         TokenTree::Token(_, tok) => visitor.visit_token(tok),
-        TokenTree::Delimited(_, _, tts) => visitor.visit_tts(tts.stream()),
+        TokenTree::Delimited(_, _, tts) => visitor.visit_tts(tts),
     }
 }
 
diff --git a/src/libsyntax_ext/proc_macro_decls.rs b/src/libsyntax_ext/proc_macro_decls.rs
index 38f7ca5..1d27271 100644
--- a/src/libsyntax_ext/proc_macro_decls.rs
+++ b/src/libsyntax_ext/proc_macro_decls.rs
@@ -105,12 +105,7 @@
         // `#[proc_macro_derive(Foo, attributes(A, ..))]`
         let list = match attr.meta_item_list() {
             Some(list) => list,
-            None => {
-                self.handler.span_err(attr.span(),
-                                      "attribute must be of form: \
-                                       #[proc_macro_derive(TraitName)]");
-                return
-            }
+            None => return,
         };
         if list.len() != 1 && list.len() != 2 {
             self.handler.span_err(attr.span(),
@@ -182,13 +177,7 @@
         }
     }
 
-    fn collect_attr_proc_macro(&mut self, item: &'a ast::Item, attr: &'a ast::Attribute) {
-        if !attr.is_word() {
-            self.handler.span_err(attr.span, "`#[proc_macro_attribute]` attribute \
-                does not take any arguments");
-            return;
-        }
-
+    fn collect_attr_proc_macro(&mut self, item: &'a ast::Item) {
         if self.in_root && item.vis.node.is_pub() {
             self.attr_macros.push(ProcMacroDef {
                 span: item.span,
@@ -205,13 +194,7 @@
         }
     }
 
-    fn collect_bang_proc_macro(&mut self, item: &'a ast::Item, attr: &'a ast::Attribute) {
-        if !attr.is_word() {
-            self.handler.span_err(attr.span, "`#[proc_macro]` attribute \
-                does not take any arguments");
-            return;
-        }
-
+    fn collect_bang_proc_macro(&mut self, item: &'a ast::Item) {
         if self.in_root && item.vis.node.is_pub() {
             self.bang_macros.push(ProcMacroDef {
                 span: item.span,
@@ -308,9 +291,9 @@
         if attr.check_name("proc_macro_derive") {
             self.collect_custom_derive(item, attr);
         } else if attr.check_name("proc_macro_attribute") {
-            self.collect_attr_proc_macro(item, attr);
+            self.collect_attr_proc_macro(item);
         } else if attr.check_name("proc_macro") {
-            self.collect_bang_proc_macro(item, attr);
+            self.collect_bang_proc_macro(item);
         };
 
         let prev_in_root = mem::replace(&mut self.in_root, false);
diff --git a/src/libsyntax_ext/proc_macro_server.rs b/src/libsyntax_ext/proc_macro_server.rs
index 158cbc7..7de9b93 100644
--- a/src/libsyntax_ext/proc_macro_server.rs
+++ b/src/libsyntax_ext/proc_macro_server.rs
@@ -269,7 +269,7 @@
         };
 
         let tree = tokenstream::TokenTree::Token(span, token);
-        TokenStream::Tree(tree, if joint { Joint } else { NonJoint })
+        TokenStream::new(vec![(tree, if joint { Joint } else { NonJoint })])
     }
 }
 
diff --git a/src/libsyntax_ext/test.rs b/src/libsyntax_ext/test.rs
index a19d045..11c734b 100644
--- a/src/libsyntax_ext/test.rs
+++ b/src/libsyntax_ext/test.rs
@@ -214,20 +214,8 @@
     match attr::find_by_name(&i.attrs, "should_panic") {
         Some(attr) => {
             let ref sd = cx.parse_sess.span_diagnostic;
-            if attr.is_value_str() {
-                sd.struct_span_warn(
-                    attr.span(),
-                    "attribute must be of the form: \
-                     `#[should_panic]` or \
-                     `#[should_panic(expected = \"error message\")]`"
-                ).note("Errors in this attribute were erroneously allowed \
-                        and will become a hard error in a future release.")
-                .emit();
-                return ShouldPanic::Yes(None);
-            }
+
             match attr.meta_item_list() {
-                // Handle #[should_panic]
-                None => ShouldPanic::Yes(None),
                 // Handle #[should_panic(expected = "foo")]
                 Some(list) => {
                     let msg = list.iter()
@@ -247,6 +235,8 @@
                         ShouldPanic::Yes(msg)
                     }
                 },
+                // Handle #[should_panic] and #[should_panic = "expected"]
+                None => ShouldPanic::Yes(attr.value_str())
             }
         }
         None => ShouldPanic::No,
diff --git a/src/libsyntax_pos/symbol.rs b/src/libsyntax_pos/symbol.rs
index 76d47f4..e741b79 100644
--- a/src/libsyntax_pos/symbol.rs
+++ b/src/libsyntax_pos/symbol.rs
@@ -478,7 +478,6 @@
         self.name == keywords::Super.name() ||
         self.name == keywords::SelfLower.name() ||
         self.name == keywords::SelfUpper.name() ||
-        self.name == keywords::Extern.name() ||
         self.name == keywords::Crate.name() ||
         self.name == keywords::PathRoot.name() ||
         self.name == keywords::DollarCrate.name()
diff --git a/src/libterm/terminfo/searcher.rs b/src/libterm/terminfo/searcher.rs
index d48e189..a9e2626 100644
--- a/src/libterm/terminfo/searcher.rs
+++ b/src/libterm/terminfo/searcher.rs
@@ -66,7 +66,7 @@
 }
 
 #[test]
-#[ignore(reason = "buildbots don't have ncurses installed and I can't mock everything I need")]
+#[ignore = "buildbots don't have ncurses installed and I can't mock everything I need"]
 fn test_get_dbpath_for_term() {
     // woefully inadequate test coverage
     // note: current tests won't work with non-standard terminfo hierarchies (e.g., macOS's)
diff --git a/src/test/compile-fail-fulldeps/auxiliary/lint_group_plugin_test.rs b/src/test/compile-fail-fulldeps/auxiliary/lint_group_plugin_test.rs
index efef4ab..bca1d7a 100644
--- a/src/test/compile-fail-fulldeps/auxiliary/lint_group_plugin_test.rs
+++ b/src/test/compile-fail-fulldeps/auxiliary/lint_group_plugin_test.rs
@@ -1,13 +1,3 @@
-// Copyright 2014 The Rust Project Developers. See the COPYRIGHT
-// file at the top-level directory of this distribution and at
-// http://rust-lang.org/COPYRIGHT.
-//
-// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
-// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
-// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
-// option. This file may not be copied, modified, or distributed
-// except according to those terms.
-
 // force-host
 
 #![feature(plugin_registrar)]
diff --git a/src/test/incremental/change_name_of_static_in_fn.rs b/src/test/incremental/change_name_of_static_in_fn.rs
new file mode 100644
index 0000000..5b27b68
--- /dev/null
+++ b/src/test/incremental/change_name_of_static_in_fn.rs
@@ -0,0 +1,17 @@
+
+// revisions:rpass1 rpass2 rpass3
+
+// See issue #57692.
+
+#![allow(warnings)]
+
+fn main() {
+    #[cfg(rpass1)]
+    {
+        static map: u64 = 0;
+    }
+    #[cfg(not(rpass1))]
+    {
+        static MAP: u64 = 0;
+    }
+}
diff --git a/src/test/run-make-fulldeps/save-analysis-rfc2126/Makefile b/src/test/run-make-fulldeps/save-analysis-rfc2126/Makefile
index 2b931d8..bf98fcd 100644
--- a/src/test/run-make-fulldeps/save-analysis-rfc2126/Makefile
+++ b/src/test/run-make-fulldeps/save-analysis-rfc2126/Makefile
@@ -1,12 +1,9 @@
 -include ../tools.mk
 
-all: extern_absolute_paths.rs extern_in_paths.rs krate2
+all: extern_absolute_paths.rs krate2
 	$(RUSTC) extern_absolute_paths.rs -Zsave-analysis --edition=2018 \
 		-Z unstable-options --extern krate2
 	cat $(TMPDIR)/save-analysis/extern_absolute_paths.json | "$(PYTHON)" validate_json.py
-	$(RUSTC) extern_in_paths.rs -Zsave-analysis --edition=2018 \
-		-Z unstable-options --extern krate2
-	cat $(TMPDIR)/save-analysis/extern_in_paths.json | "$(PYTHON)" validate_json.py
 
 krate2: krate2.rs
 	$(RUSTC) $<
diff --git a/src/test/run-make-fulldeps/save-analysis-rfc2126/extern_in_paths.rs b/src/test/run-make-fulldeps/save-analysis-rfc2126/extern_in_paths.rs
deleted file mode 100644
index 299b966..0000000
--- a/src/test/run-make-fulldeps/save-analysis-rfc2126/extern_in_paths.rs
+++ /dev/null
@@ -1,7 +0,0 @@
-#![feature(extern_in_paths)]
-
-use extern::krate2;
-
-fn main() {
-    extern::krate2::hello();
-}
diff --git a/src/test/run-pass/binding/fn-arg-incomplete-pattern-drop-order.rs b/src/test/run-pass/binding/fn-arg-incomplete-pattern-drop-order.rs
new file mode 100644
index 0000000..4d5a6fb
--- /dev/null
+++ b/src/test/run-pass/binding/fn-arg-incomplete-pattern-drop-order.rs
@@ -0,0 +1,68 @@
+// Check that partially moved from function parameters are dropped after the
+// named bindings that move from them.
+
+// ignore-wasm32-bare compiled with panic=abort by default
+
+use std::{panic, cell::RefCell};
+
+struct LogDrop<'a>(i32, Context<'a>);
+
+#[derive(Copy, Clone)]
+struct Context<'a> {
+    panic_on: i32,
+    drops: &'a RefCell<Vec<i32>>,
+}
+
+impl<'a> Context<'a> {
+    fn record_drop(self, index: i32) {
+        self.drops.borrow_mut().push(index);
+        if index == self.panic_on {
+            panic!();
+        }
+    }
+}
+
+impl<'a> Drop for LogDrop<'a> {
+    fn drop(&mut self) {
+        self.1.record_drop(self.0);
+    }
+}
+
+fn bindings_in_params((_x, _): (LogDrop, LogDrop), (_, _y): (LogDrop, LogDrop)) {}
+fn bindings_with_let(a: (LogDrop, LogDrop), b: (LogDrop, LogDrop)) {
+    // Drop order in foo is the same as the following bindings.
+    // _temp2 is declared after _x to avoid a difference between `_: T` and
+    // `x: T` in function parameters.
+    let _temp1 = a;
+    let (_x, _) = _temp1;
+
+    let _temp2 = b;
+    let (_, _y) = _temp2;
+}
+
+fn test_drop_order(panic_on: i32, fun: fn((LogDrop, LogDrop), (LogDrop, LogDrop))) {
+    let context = Context {
+        panic_on,
+        drops: &RefCell::new(Vec::new()),
+    };
+    let one = LogDrop(1, context);
+    let two = LogDrop(2, context);
+    let three = LogDrop(3, context);
+    let four = LogDrop(4, context);
+
+    let res = panic::catch_unwind(panic::AssertUnwindSafe(|| {
+        fun((three, four), (two, one));
+    }));
+    if panic_on == 0 {
+        assert!(res.is_ok(), "should not have panicked");
+    } else {
+        assert!(res.is_err(), "should have panicked");
+    }
+    assert_eq!(*context.drops.borrow(), [1, 2, 3, 4], "incorrect drop order");
+}
+
+fn main() {
+    (0..=4).for_each(|i| test_drop_order(i, bindings_in_params));
+    (0..=4).for_each(|i| test_drop_order(i, bindings_with_let));
+    (0..=4).for_each(|i| test_drop_order(i, |(_x, _), (_, _y)| {}));
+}
diff --git a/src/test/run-pass/rfcs/rfc-2126-extern-absolute-paths/extern.rs b/src/test/run-pass/rfcs/rfc-2126-extern-absolute-paths/extern.rs
deleted file mode 100644
index 165a753..0000000
--- a/src/test/run-pass/rfcs/rfc-2126-extern-absolute-paths/extern.rs
+++ /dev/null
@@ -1,28 +0,0 @@
-// run-pass
-#![allow(dead_code)]
-// aux-build:xcrate.rs
-// compile-flags:--extern xcrate
-
-#![feature(extern_in_paths)]
-
-use extern::xcrate::Z;
-
-type A = extern::xcrate::S;
-type B = for<'a> extern::xcrate::Tr<'a>;
-
-fn f() {
-    use extern::xcrate;
-    use extern::xcrate as ycrate;
-    let s = xcrate::S;
-    assert_eq!(format!("{:?}", s), "S");
-    let z = ycrate::Z;
-    assert_eq!(format!("{:?}", z), "Z");
-}
-
-fn main() {
-    let s = extern::xcrate::S;
-    assert_eq!(format!("{:?}", s), "S");
-    let z = Z;
-    assert_eq!(format!("{:?}", z), "Z");
-    assert_eq!(A {}, extern::xcrate::S {});
-}
diff --git a/src/test/run-pass/simd/simd-upgraded.rs b/src/test/run-pass/simd/simd-upgraded.rs
deleted file mode 100644
index afba298..0000000
--- a/src/test/run-pass/simd/simd-upgraded.rs
+++ /dev/null
@@ -1,24 +0,0 @@
-// run-pass
-#![allow(stable_features)]
-#![allow(non_camel_case_types)]
-
-// Test that removed LLVM SIMD intrinsics continue
-// to work via the "AutoUpgrade" mechanism.
-
-#![feature(cfg_target_feature, repr_simd)]
-#![feature(platform_intrinsics, stmt_expr_attributes)]
-
-#[repr(simd)]
-#[derive(PartialEq, Debug)]
-struct i16x8(i16, i16, i16, i16, i16, i16, i16, i16);
-
-fn main() {
-    #[cfg(target_feature = "sse2")] unsafe {
-        extern "platform-intrinsic" {
-            fn x86_mm_min_epi16(x: i16x8, y: i16x8) -> i16x8;
-        }
-        assert_eq!(x86_mm_min_epi16(i16x8(0, 1, 2, 3, 4, 5, 6, 7),
-                                    i16x8(7, 6, 5, 4, 3, 2, 1, 0)),
-                                    i16x8(0, 1, 2, 3, 3, 2, 1, 0));
-    };
-}
diff --git a/src/test/run-pass/weird-exprs.rs b/src/test/run-pass/weird-exprs.rs
index 6d0c5c1..7ce7e29 100644
--- a/src/test/run-pass/weird-exprs.rs
+++ b/src/test/run-pass/weird-exprs.rs
@@ -4,7 +4,7 @@
 #![allow(unused_parens)]
 // compile-flags: -Z borrowck=compare
 
-#![recursion_limit = "128"]
+#![recursion_limit = "256"]
 
 use std::cell::Cell;
 use std::mem::swap;
diff --git a/src/test/rustdoc-ui/deny-missing-docs-crate.rs b/src/test/rustdoc-ui/deny-missing-docs-crate.rs
index 910c993..b74eba3 100644
--- a/src/test/rustdoc-ui/deny-missing-docs-crate.rs
+++ b/src/test/rustdoc-ui/deny-missing-docs-crate.rs
@@ -1,13 +1,3 @@
-// Copyright 2018 The Rust Project Developers. See the COPYRIGHT
-// file at the top-level directory of this distribution and at
-// http://rust-lang.org/COPYRIGHT.
-//
-// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
-// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
-// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
-// option. This file may not be copied, modified, or distributed
-// except according to those terms.
-
 #![deny(missing_docs)] //~ ERROR
 
 pub struct Foo; //~ ERROR
diff --git a/src/test/rustdoc-ui/deny-missing-docs-crate.stderr b/src/test/rustdoc-ui/deny-missing-docs-crate.stderr
index 7f0590e..1cfd609 100644
--- a/src/test/rustdoc-ui/deny-missing-docs-crate.stderr
+++ b/src/test/rustdoc-ui/deny-missing-docs-crate.stderr
@@ -1,5 +1,5 @@
 error: missing documentation for crate
-  --> $DIR/deny-missing-docs-crate.rs:11:1
+  --> $DIR/deny-missing-docs-crate.rs:1:1
    |
 LL | / #![deny(missing_docs)] //~ ERROR
 LL | |
@@ -7,13 +7,13 @@
    | |_______________^
    |
 note: lint level defined here
-  --> $DIR/deny-missing-docs-crate.rs:11:9
+  --> $DIR/deny-missing-docs-crate.rs:1:9
    |
 LL | #![deny(missing_docs)] //~ ERROR
    |         ^^^^^^^^^^^^
 
 error: missing documentation for a struct
-  --> $DIR/deny-missing-docs-crate.rs:13:1
+  --> $DIR/deny-missing-docs-crate.rs:3:1
    |
 LL | pub struct Foo; //~ ERROR
    | ^^^^^^^^^^^^^^^
diff --git a/src/test/rustdoc-ui/deny-missing-docs-macro.rs b/src/test/rustdoc-ui/deny-missing-docs-macro.rs
index a12fe17..b1c1253 100644
--- a/src/test/rustdoc-ui/deny-missing-docs-macro.rs
+++ b/src/test/rustdoc-ui/deny-missing-docs-macro.rs
@@ -1,13 +1,3 @@
-// Copyright 2018 The Rust Project Developers. See the COPYRIGHT
-// file at the top-level directory of this distribution and at
-// http://rust-lang.org/COPYRIGHT.
-//
-// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
-// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
-// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
-// option. This file may not be copied, modified, or distributed
-// except according to those terms.
-
 //! foo
 
 #![deny(missing_docs)]
diff --git a/src/test/rustdoc-ui/deny-missing-docs-macro.stderr b/src/test/rustdoc-ui/deny-missing-docs-macro.stderr
index 686a450..b87e60d 100644
--- a/src/test/rustdoc-ui/deny-missing-docs-macro.stderr
+++ b/src/test/rustdoc-ui/deny-missing-docs-macro.stderr
@@ -1,11 +1,11 @@
 error: missing documentation for macro
-  --> $DIR/deny-missing-docs-macro.rs:16:1
+  --> $DIR/deny-missing-docs-macro.rs:6:1
    |
 LL | macro_rules! foo { //~ ERROR
    | ^^^^^^^^^^^^^^^^
    |
 note: lint level defined here
-  --> $DIR/deny-missing-docs-macro.rs:13:9
+  --> $DIR/deny-missing-docs-macro.rs:3:9
    |
 LL | #![deny(missing_docs)]
    |         ^^^^^^^^^^^^
diff --git a/src/test/rustdoc-ui/failed-doctest-output.stdout b/src/test/rustdoc-ui/failed-doctest-output.stdout
index 9fd46e9..8af05e9 100644
--- a/src/test/rustdoc-ui/failed-doctest-output.stdout
+++ b/src/test/rustdoc-ui/failed-doctest-output.stdout
@@ -12,7 +12,7 @@
 3 | no
   | ^^ not found in this scope
 
-thread '$DIR/failed-doctest-output.rs - OtherStruct (line 17)' panicked at 'couldn't compile the test', src/librustdoc/test.rs:321:13
+thread '$DIR/failed-doctest-output.rs - OtherStruct (line 17)' panicked at 'couldn't compile the test', src/librustdoc/test.rs:354:13
 note: Run with `RUST_BACKTRACE=1` environment variable to display a backtrace.
 
 ---- $DIR/failed-doctest-output.rs - SomeStruct (line 11) stdout ----
@@ -21,7 +21,7 @@
 thread 'main' panicked at 'oh no', $DIR/failed-doctest-output.rs:3:1
 note: Run with `RUST_BACKTRACE=1` environment variable to display a backtrace.
 
-', src/librustdoc/test.rs:356:17
+', src/librustdoc/test.rs:389:17
 
 
 failures:
diff --git a/src/test/rustdoc/auxiliary/enum_primitive.rs b/src/test/rustdoc/auxiliary/enum_primitive.rs
index c265ae4..eff47e8 100644
--- a/src/test/rustdoc/auxiliary/enum_primitive.rs
+++ b/src/test/rustdoc/auxiliary/enum_primitive.rs
@@ -19,7 +19,6 @@
 // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
 // SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
-
 //! This crate exports a macro `enum_from_primitive!` that wraps an
 //! `enum` declaration and automatically adds an implementation of
 //! `num::FromPrimitive` (reexported here), to allow conversion from
@@ -52,7 +51,6 @@
 //! }
 //! ```
 
-
 pub mod num_traits {
     pub trait FromPrimitive: Sized {
         fn from_i64(n: i64) -> Option<Self>;
@@ -207,4 +205,3 @@
         enum_from_primitive_impl! { $name, $( $( $variant )+ )+ }
     };
 }
-
diff --git a/src/test/rustdoc/issue-56701.rs b/src/test/rustdoc/issue-56701.rs
new file mode 100644
index 0000000..6fb30a4
--- /dev/null
+++ b/src/test/rustdoc/issue-56701.rs
@@ -0,0 +1,34 @@
+// This shouldn't cause a stack overflow when rustdoc is run
+
+use std::ops::Deref;
+use std::ops::DerefMut;
+
+pub trait SimpleTrait {
+    type SimpleT;
+}
+
+impl<Inner: SimpleTrait, Outer: Deref<Target = Inner>> SimpleTrait for Outer {
+    type SimpleT = Inner::SimpleT;
+}
+
+pub trait AnotherTrait {
+    type AnotherT;
+}
+
+impl<T, Simple: SimpleTrait<SimpleT = Vec<T>>> AnotherTrait for Simple {
+    type AnotherT = T;
+}
+
+pub struct Unrelated<Inner, UnrelatedT: DerefMut<Target = Vec<Inner>>>(UnrelatedT);
+
+impl<Inner, UnrelatedT: DerefMut<Target = Vec<Inner>>> Deref for Unrelated<Inner, UnrelatedT> {
+    type Target = Vec<Inner>;
+
+    fn deref(&self) -> &Self::Target {
+        &self.0
+    }
+}
+
+
+pub fn main() { }
+
diff --git a/src/test/rustdoc/no-crate-filter.rs b/src/test/rustdoc/no-crate-filter.rs
index e49ce9e..c694d14 100644
--- a/src/test/rustdoc/no-crate-filter.rs
+++ b/src/test/rustdoc/no-crate-filter.rs
@@ -1,13 +1,3 @@
-// Copyright 2018 The Rust Project Developers. See the COPYRIGHT
-// file at the top-level directory of this distribution and at
-// http://rust-lang.org/COPYRIGHT.
-//
-// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
-// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
-// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
-// option. This file may not be copied, modified, or distributed
-// except according to those terms.
-
 #![crate_name = "foo"]
 
 // compile-flags: -Z unstable-options --disable-per-crate-search
diff --git a/src/test/ui/attrs-with-no-formal-in-generics/attrs-with-no-formal-in-generics-1.stderr b/src/test/ui/attrs-with-no-formal-in-generics/attrs-with-no-formal-in-generics-1.stderr
index 75c0d91..c4c0cee 100644
--- a/src/test/ui/attrs-with-no-formal-in-generics/attrs-with-no-formal-in-generics-1.stderr
+++ b/src/test/ui/attrs-with-no-formal-in-generics/attrs-with-no-formal-in-generics-1.stderr
@@ -2,7 +2,7 @@
   --> $DIR/attrs-with-no-formal-in-generics-1.rs:9:25
    |
 LL | impl<#[rustc_1] 'a, 'b, #[oops]> RefIntPair<'a, 'b> {
-   |                         ^^^^^^^
+   |                         ^^^^^^^ attributes must go before parameters
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/attrs-with-no-formal-in-generics/attrs-with-no-formal-in-generics-2.stderr b/src/test/ui/attrs-with-no-formal-in-generics/attrs-with-no-formal-in-generics-2.stderr
index 7585c6d..9099d74 100644
--- a/src/test/ui/attrs-with-no-formal-in-generics/attrs-with-no-formal-in-generics-2.stderr
+++ b/src/test/ui/attrs-with-no-formal-in-generics/attrs-with-no-formal-in-generics-2.stderr
@@ -2,7 +2,7 @@
   --> $DIR/attrs-with-no-formal-in-generics-2.rs:9:35
    |
 LL | impl<#[rustc_1] 'a, #[rustc_2] T, #[oops]> RefAny<'a, T> {}
-   |                                   ^^^^^^^
+   |                                   ^^^^^^^ attributes must go before parameters
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/attrs-with-no-formal-in-generics/attrs-with-no-formal-in-generics-3.rs b/src/test/ui/attrs-with-no-formal-in-generics/attrs-with-no-formal-in-generics-3.rs
index 343a2d7..e9f908d 100644
--- a/src/test/ui/attrs-with-no-formal-in-generics/attrs-with-no-formal-in-generics-3.rs
+++ b/src/test/ui/attrs-with-no-formal-in-generics/attrs-with-no-formal-in-generics-3.rs
@@ -5,12 +5,8 @@
 struct RefIntPair<'a, 'b>(&'a u32, &'b u32);
 
 fn hof_lt<Q>(_: Q)
-    where Q: for <#[rustc_1] 'a, 'b, #[oops]> Fn(RefIntPair<'a,'b>) -> &'b u32
+    where Q: for <#[allow(unused)] 'a, 'b, #[oops]> Fn(RefIntPair<'a,'b>) -> &'b u32
     //~^ ERROR trailing attribute after lifetime parameters
-{
+{}
 
-}
-
-fn main() {
-
-}
+fn main() {}
diff --git a/src/test/ui/attrs-with-no-formal-in-generics/attrs-with-no-formal-in-generics-3.stderr b/src/test/ui/attrs-with-no-formal-in-generics/attrs-with-no-formal-in-generics-3.stderr
index 9196051..452f0ea 100644
--- a/src/test/ui/attrs-with-no-formal-in-generics/attrs-with-no-formal-in-generics-3.stderr
+++ b/src/test/ui/attrs-with-no-formal-in-generics/attrs-with-no-formal-in-generics-3.stderr
@@ -1,8 +1,8 @@
 error: trailing attribute after lifetime parameters
-  --> $DIR/attrs-with-no-formal-in-generics-3.rs:8:38
+  --> $DIR/attrs-with-no-formal-in-generics-3.rs:8:44
    |
-LL |     where Q: for <#[rustc_1] 'a, 'b, #[oops]> Fn(RefIntPair<'a,'b>) -> &'b u32
-   |                                      ^^^^^^^
+LL |     where Q: for <#[allow(unused)] 'a, 'b, #[oops]> Fn(RefIntPair<'a,'b>) -> &'b u32
+   |                                            ^^^^^^^ attributes must go before parameters
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/cast/cast-as-bool.rs b/src/test/ui/cast/cast-as-bool.rs
index 7a0bd0e..8130f4d 100644
--- a/src/test/ui/cast/cast-as-bool.rs
+++ b/src/test/ui/cast/cast-as-bool.rs
@@ -1,4 +1,9 @@
 fn main() {
-    let u = 5 as bool;
-    //~^ ERROR cannot cast as `bool`
+    let u = 5 as bool; //~ ERROR cannot cast as `bool`
+                       //~| HELP compare with zero instead
+                       //~| SUGGESTION 5 != 0
+    let t = (1 + 2) as bool; //~ ERROR cannot cast as `bool`
+                             //~| HELP compare with zero instead
+                             //~| SUGGESTION (1 + 2) != 0
+    let v = "hello" as bool; //~ ERROR cannot cast as `bool`
 }
diff --git a/src/test/ui/cast/cast-as-bool.stderr b/src/test/ui/cast/cast-as-bool.stderr
index 086d08a..6099a41 100644
--- a/src/test/ui/cast/cast-as-bool.stderr
+++ b/src/test/ui/cast/cast-as-bool.stderr
@@ -1,11 +1,21 @@
 error[E0054]: cannot cast as `bool`
   --> $DIR/cast-as-bool.rs:2:13
    |
-LL |     let u = 5 as bool;
-   |             ^^^^^^^^^ unsupported cast
-   |
-   = help: compare with zero instead
+LL |     let u = 5 as bool; //~ ERROR cannot cast as `bool`
+   |             ^^^^^^^^^ help: compare with zero instead: `5 != 0`
 
-error: aborting due to previous error
+error[E0054]: cannot cast as `bool`
+  --> $DIR/cast-as-bool.rs:5:13
+   |
+LL |     let t = (1 + 2) as bool; //~ ERROR cannot cast as `bool`
+   |             ^^^^^^^^^^^^^^^ help: compare with zero instead: `(1 + 2) != 0`
+
+error[E0054]: cannot cast as `bool`
+  --> $DIR/cast-as-bool.rs:8:13
+   |
+LL |     let v = "hello" as bool; //~ ERROR cannot cast as `bool`
+   |             ^^^^^^^^^^^^^^^ unsupported cast
+
+error: aborting due to 3 previous errors
 
 For more information about this error, try `rustc --explain E0054`.
diff --git a/src/test/ui/cast/cast-rfc0401-2.stderr b/src/test/ui/cast/cast-rfc0401-2.stderr
index 3bf6e53..52f6af7 100644
--- a/src/test/ui/cast/cast-rfc0401-2.stderr
+++ b/src/test/ui/cast/cast-rfc0401-2.stderr
@@ -2,9 +2,7 @@
   --> $DIR/cast-rfc0401-2.rs:6:13
    |
 LL |     let _ = 3 as bool;
-   |             ^^^^^^^^^ unsupported cast
-   |
-   = help: compare with zero instead
+   |             ^^^^^^^^^ help: compare with zero instead: `3 != 0`
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/coherence/coherence-impl-trait-for-marker-trait-negative.rs b/src/test/ui/coherence/coherence-impl-trait-for-marker-trait-negative.rs
new file mode 100644
index 0000000..5ea6919
--- /dev/null
+++ b/src/test/ui/coherence/coherence-impl-trait-for-marker-trait-negative.rs
@@ -0,0 +1,29 @@
+#![feature(optin_builtin_traits)]
+
+// Test for issue #56934 - that it is impossible to redundantly
+// implement an auto-trait for a trait object type that contains it.
+
+// Negative impl variant.
+
+auto trait Marker1 {}
+auto trait Marker2 {}
+
+trait Object: Marker1 {}
+
+// A supertrait marker is illegal...
+impl !Marker1 for dyn Object + Marker2 { }   //~ ERROR E0371
+// ...and also a direct component.
+impl !Marker2 for dyn Object + Marker2 { }   //~ ERROR E0371
+
+// But implementing a marker if it is not present is OK.
+impl !Marker2 for dyn Object {} // OK
+
+// A non-principal trait-object type is orphan even in its crate.
+impl !Send for dyn Marker2 {} //~ ERROR E0117
+
+// And impl'ing a remote marker for a local trait object is forbidden
+// by one of these special orphan-like rules.
+impl !Send for dyn Object {} //~ ERROR E0321
+impl !Send for dyn Object + Marker2 {} //~ ERROR E0321
+
+fn main() { }
diff --git a/src/test/ui/coherence/coherence-impl-trait-for-marker-trait-negative.stderr b/src/test/ui/coherence/coherence-impl-trait-for-marker-trait-negative.stderr
new file mode 100644
index 0000000..c8a146c
--- /dev/null
+++ b/src/test/ui/coherence/coherence-impl-trait-for-marker-trait-negative.stderr
@@ -0,0 +1,37 @@
+error[E0371]: the object type `(dyn Object + Marker2 + 'static)` automatically implements the trait `Marker1`
+  --> $DIR/coherence-impl-trait-for-marker-trait-negative.rs:14:1
+   |
+LL | impl !Marker1 for dyn Object + Marker2 { }   //~ ERROR E0371
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `(dyn Object + Marker2 + 'static)` automatically implements trait `Marker1`
+
+error[E0371]: the object type `(dyn Object + Marker2 + 'static)` automatically implements the trait `Marker2`
+  --> $DIR/coherence-impl-trait-for-marker-trait-negative.rs:16:1
+   |
+LL | impl !Marker2 for dyn Object + Marker2 { }   //~ ERROR E0371
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `(dyn Object + Marker2 + 'static)` automatically implements trait `Marker2`
+
+error[E0117]: only traits defined in the current crate can be implemented for arbitrary types
+  --> $DIR/coherence-impl-trait-for-marker-trait-negative.rs:22:1
+   |
+LL | impl !Send for dyn Marker2 {} //~ ERROR E0117
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^ impl doesn't use types inside crate
+   |
+   = note: the impl does not reference only types defined in this crate
+   = note: define and implement a trait or new type instead
+
+error[E0321]: cross-crate traits with a default impl, like `std::marker::Send`, can only be implemented for a struct/enum type, not `(dyn Object + 'static)`
+  --> $DIR/coherence-impl-trait-for-marker-trait-negative.rs:26:1
+   |
+LL | impl !Send for dyn Object {} //~ ERROR E0321
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^ can't implement cross-crate trait with a default impl for non-struct/enum type
+
+error[E0321]: cross-crate traits with a default impl, like `std::marker::Send`, can only be implemented for a struct/enum type, not `(dyn Object + Marker2 + 'static)`
+  --> $DIR/coherence-impl-trait-for-marker-trait-negative.rs:27:1
+   |
+LL | impl !Send for dyn Object + Marker2 {} //~ ERROR E0321
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ can't implement cross-crate trait with a default impl for non-struct/enum type
+
+error: aborting due to 5 previous errors
+
+Some errors occurred: E0117, E0321, E0371.
+For more information about an error, try `rustc --explain E0117`.
diff --git a/src/test/ui/coherence/coherence-impl-trait-for-marker-trait-positive.rs b/src/test/ui/coherence/coherence-impl-trait-for-marker-trait-positive.rs
new file mode 100644
index 0000000..6b5689e
--- /dev/null
+++ b/src/test/ui/coherence/coherence-impl-trait-for-marker-trait-positive.rs
@@ -0,0 +1,29 @@
+#![feature(optin_builtin_traits)]
+
+// Test for issue #56934 - that it is impossible to redundantly
+// implement an auto-trait for a trait object type that contains it.
+
+// Positive impl variant.
+
+auto trait Marker1 {}
+auto trait Marker2 {}
+
+trait Object: Marker1 {}
+
+// A supertrait marker is illegal...
+impl Marker1 for dyn Object + Marker2 { }   //~ ERROR E0371
+// ...and also a direct component.
+impl Marker2 for dyn Object + Marker2 { }   //~ ERROR E0371
+
+// But implementing a marker if it is not present is OK.
+impl Marker2 for dyn Object {} // OK
+
+// A non-principal trait-object type is orphan even in its crate.
+unsafe impl Send for dyn Marker2 {} //~ ERROR E0117
+
+// And impl'ing a remote marker for a local trait object is forbidden
+// by one of these special orphan-like rules.
+unsafe impl Send for dyn Object {} //~ ERROR E0321
+unsafe impl Send for dyn Object + Marker2 {} //~ ERROR E0321
+
+fn main() { }
diff --git a/src/test/ui/coherence/coherence-impl-trait-for-marker-trait-positive.stderr b/src/test/ui/coherence/coherence-impl-trait-for-marker-trait-positive.stderr
new file mode 100644
index 0000000..78ca2f5
--- /dev/null
+++ b/src/test/ui/coherence/coherence-impl-trait-for-marker-trait-positive.stderr
@@ -0,0 +1,37 @@
+error[E0371]: the object type `(dyn Object + Marker2 + 'static)` automatically implements the trait `Marker1`
+  --> $DIR/coherence-impl-trait-for-marker-trait-positive.rs:14:1
+   |
+LL | impl Marker1 for dyn Object + Marker2 { }   //~ ERROR E0371
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `(dyn Object + Marker2 + 'static)` automatically implements trait `Marker1`
+
+error[E0371]: the object type `(dyn Object + Marker2 + 'static)` automatically implements the trait `Marker2`
+  --> $DIR/coherence-impl-trait-for-marker-trait-positive.rs:16:1
+   |
+LL | impl Marker2 for dyn Object + Marker2 { }   //~ ERROR E0371
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `(dyn Object + Marker2 + 'static)` automatically implements trait `Marker2`
+
+error[E0117]: only traits defined in the current crate can be implemented for arbitrary types
+  --> $DIR/coherence-impl-trait-for-marker-trait-positive.rs:22:1
+   |
+LL | unsafe impl Send for dyn Marker2 {} //~ ERROR E0117
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ impl doesn't use types inside crate
+   |
+   = note: the impl does not reference only types defined in this crate
+   = note: define and implement a trait or new type instead
+
+error[E0321]: cross-crate traits with a default impl, like `std::marker::Send`, can only be implemented for a struct/enum type, not `(dyn Object + 'static)`
+  --> $DIR/coherence-impl-trait-for-marker-trait-positive.rs:26:1
+   |
+LL | unsafe impl Send for dyn Object {} //~ ERROR E0321
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ can't implement cross-crate trait with a default impl for non-struct/enum type
+
+error[E0321]: cross-crate traits with a default impl, like `std::marker::Send`, can only be implemented for a struct/enum type, not `(dyn Object + Marker2 + 'static)`
+  --> $DIR/coherence-impl-trait-for-marker-trait-positive.rs:27:1
+   |
+LL | unsafe impl Send for dyn Object + Marker2 {} //~ ERROR E0321
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ can't implement cross-crate trait with a default impl for non-struct/enum type
+
+error: aborting due to 5 previous errors
+
+Some errors occurred: E0117, E0321, E0371.
+For more information about an error, try `rustc --explain E0117`.
diff --git a/src/test/ui/conditional-compilation/cfg-attr-syntax-validation.rs b/src/test/ui/conditional-compilation/cfg-attr-syntax-validation.rs
index c7e1b44..c5aa903 100644
--- a/src/test/ui/conditional-compilation/cfg-attr-syntax-validation.rs
+++ b/src/test/ui/conditional-compilation/cfg-attr-syntax-validation.rs
@@ -27,7 +27,8 @@
 
 macro_rules! generate_s10 {
     ($expr: expr) => {
-        #[cfg(feature = $expr)] //~ ERROR `cfg` is not a well-formed meta-item
+        #[cfg(feature = $expr)]
+        //~^ ERROR expected unsuffixed literal or identifier, found concat!("nonexistent")
         struct S10;
     }
 }
diff --git a/src/test/ui/conditional-compilation/cfg-attr-syntax-validation.stderr b/src/test/ui/conditional-compilation/cfg-attr-syntax-validation.stderr
index da06a81..bcf13ea 100644
--- a/src/test/ui/conditional-compilation/cfg-attr-syntax-validation.stderr
+++ b/src/test/ui/conditional-compilation/cfg-attr-syntax-validation.stderr
@@ -52,11 +52,11 @@
 LL | #[cfg(a = b"hi")]  //~ ERROR literal in `cfg` predicate value must be a string
    |           ^^^^^ help: consider removing the prefix: `"hi"`
 
-error: `cfg` is not a well-formed meta-item
-  --> $DIR/cfg-attr-syntax-validation.rs:30:9
+error: expected unsuffixed literal or identifier, found concat!("nonexistent")
+  --> $DIR/cfg-attr-syntax-validation.rs:30:15
    |
-LL |         #[cfg(feature = $expr)] //~ ERROR `cfg` is not a well-formed meta-item
-   |         ^^^^^^^^^^^^^^^^^^^^^^^ help: expected syntax is: `#[cfg(/* predicate */)]`
+LL |         #[cfg(feature = $expr)]
+   |               ^^^^^^^
 ...
 LL | generate_s10!(concat!("nonexistent"));
    | -------------------------------------- in this macro invocation
diff --git a/src/test/ui/derives/deriving-meta-empty-trait-list.rs b/src/test/ui/derives/deriving-meta-empty-trait-list.rs
index 98da6d2..8824841 100644
--- a/src/test/ui/derives/deriving-meta-empty-trait-list.rs
+++ b/src/test/ui/derives/deriving-meta-empty-trait-list.rs
@@ -1,9 +1,4 @@
-// run-pass
-
-#![allow(dead_code)]
-
-#[derive]   //~ WARNING empty trait list in `derive`
-struct Foo;
+// compile-pass
 
 #[derive()] //~ WARNING empty trait list in `derive`
 struct Bar;
diff --git a/src/test/ui/derives/deriving-meta-empty-trait-list.stderr b/src/test/ui/derives/deriving-meta-empty-trait-list.stderr
index dbc2387..191bb78 100644
--- a/src/test/ui/derives/deriving-meta-empty-trait-list.stderr
+++ b/src/test/ui/derives/deriving-meta-empty-trait-list.stderr
@@ -1,11 +1,5 @@
 warning: empty trait list in `derive`
-  --> $DIR/deriving-meta-empty-trait-list.rs:5:1
-   |
-LL | #[derive]   //~ WARNING empty trait list in `derive`
-   | ^^^^^^^^^
-
-warning: empty trait list in `derive`
-  --> $DIR/deriving-meta-empty-trait-list.rs:8:1
+  --> $DIR/deriving-meta-empty-trait-list.rs:3:1
    |
 LL | #[derive()] //~ WARNING empty trait list in `derive`
    | ^^^^^^^^^^^
diff --git a/src/test/ui/did_you_mean/recursion_limit.stderr b/src/test/ui/did_you_mean/recursion_limit.stderr
index 08947fd..0738c3f 100644
--- a/src/test/ui/did_you_mean/recursion_limit.stderr
+++ b/src/test/ui/did_you_mean/recursion_limit.stderr
@@ -1,11 +1,10 @@
-error[E0275]: overflow evaluating the requirement `K: std::marker::Send`
+error[E0275]: overflow evaluating the requirement `J: std::marker::Send`
   --> $DIR/recursion_limit.rs:34:5
    |
 LL |     is_send::<A>(); //~ ERROR overflow evaluating the requirement
    |     ^^^^^^^^^^^^
    |
    = help: consider adding a `#![recursion_limit="20"]` attribute to your crate
-   = note: required because it appears within the type `J`
    = note: required because it appears within the type `I`
    = note: required because it appears within the type `H`
    = note: required because it appears within the type `G`
diff --git a/src/test/ui/error-codes/E0054.stderr b/src/test/ui/error-codes/E0054.stderr
index 416029c..cce32fa 100644
--- a/src/test/ui/error-codes/E0054.stderr
+++ b/src/test/ui/error-codes/E0054.stderr
@@ -2,9 +2,7 @@
   --> $DIR/E0054.rs:3:24
    |
 LL |     let x_is_nonzero = x as bool; //~ ERROR E0054
-   |                        ^^^^^^^^^ unsupported cast
-   |
-   = help: compare with zero instead
+   |                        ^^^^^^^^^ help: compare with zero instead: `x != 0`
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/error-codes/E0055.rs b/src/test/ui/error-codes/E0055.rs
index a3ade92..b525575 100644
--- a/src/test/ui/error-codes/E0055.rs
+++ b/src/test/ui/error-codes/E0055.rs
@@ -1,4 +1,4 @@
-#![recursion_limit="2"]
+#![recursion_limit="5"]
 struct Foo;
 
 impl Foo {
@@ -7,7 +7,7 @@
 
 fn main() {
     let foo = Foo;
-    let ref_foo = &&Foo;
+    let ref_foo = &&&&&Foo;
     ref_foo.foo();
     //~^ ERROR E0055
 }
diff --git a/src/test/ui/error-codes/E0055.stderr b/src/test/ui/error-codes/E0055.stderr
index cd2bd92..d06566f 100644
--- a/src/test/ui/error-codes/E0055.stderr
+++ b/src/test/ui/error-codes/E0055.stderr
@@ -4,7 +4,7 @@
 LL |     ref_foo.foo();
    |             ^^^ deref recursion limit reached
    |
-   = help: consider adding a `#![recursion_limit="4"]` attribute to your crate
+   = help: consider adding a `#![recursion_limit="10"]` attribute to your crate
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/error-codes/E0232.rs b/src/test/ui/error-codes/E0232.rs
deleted file mode 100644
index 8e80624..0000000
--- a/src/test/ui/error-codes/E0232.rs
+++ /dev/null
@@ -1,8 +0,0 @@
-#![feature(on_unimplemented)]
-
-#[rustc_on_unimplemented]
-//~^ ERROR E0232
-trait Bar {}
-
-fn main() {
-}
diff --git a/src/test/ui/error-codes/E0232.stderr b/src/test/ui/error-codes/E0232.stderr
deleted file mode 100644
index 9e9155b..0000000
--- a/src/test/ui/error-codes/E0232.stderr
+++ /dev/null
@@ -1,11 +0,0 @@
-error[E0232]: `#[rustc_on_unimplemented]` requires a value
-  --> $DIR/E0232.rs:3:1
-   |
-LL | #[rustc_on_unimplemented]
-   | ^^^^^^^^^^^^^^^^^^^^^^^^^ value required here
-   |
-   = note: eg `#[rustc_on_unimplemented(message="foo")]`
-
-error: aborting due to previous error
-
-For more information about this error, try `rustc --explain E0232`.
diff --git a/src/test/ui/error-codes/E0275.stderr b/src/test/ui/error-codes/E0275.stderr
index 817b482..f2b0f39 100644
--- a/src/test/ui/error-codes/E0275.stderr
+++ b/src/test/ui/error-codes/E0275.stderr
@@ -1,11 +1,10 @@
-error[E0275]: overflow evaluating the requirement `Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<T>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>: std::marker::Sized`
+error[E0275]: overflow evaluating the requirement `Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<T>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>: Foo`
   --> $DIR/E0275.rs:5:1
    |
 LL | impl<T> Foo for T where Bar<T>: Foo {} //~ ERROR E0275
    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
    = help: consider adding a `#![recursion_limit="128"]` attribute to your crate
-   = note: required because of the requirements on the impl of `Foo` for `Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<T>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>`
    = note: required because of the requirements on the impl of `Foo` for `Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<T>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>`
    = note: required because of the requirements on the impl of `Foo` for `Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<T>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>`
    = note: required because of the requirements on the impl of `Foo` for `Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<T>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>`
diff --git a/src/test/ui/error-codes/E0296.rs b/src/test/ui/error-codes/E0296.rs
deleted file mode 100644
index a1a8657..0000000
--- a/src/test/ui/error-codes/E0296.rs
+++ /dev/null
@@ -1,3 +0,0 @@
-#![recursion_limit] //~ ERROR E0296
-
-fn main() {}
diff --git a/src/test/ui/error-codes/E0296.stderr b/src/test/ui/error-codes/E0296.stderr
deleted file mode 100644
index 41e9f7e..0000000
--- a/src/test/ui/error-codes/E0296.stderr
+++ /dev/null
@@ -1,9 +0,0 @@
-error[E0296]: malformed recursion limit attribute, expected #![recursion_limit="N"]
-  --> $DIR/E0296.rs:1:1
-   |
-LL | #![recursion_limit] //~ ERROR E0296
-   | ^^^^^^^^^^^^^^^^^^^
-
-error: aborting due to previous error
-
-For more information about this error, try `rustc --explain E0296`.
diff --git a/src/test/ui/error-codes/E0423.stderr b/src/test/ui/error-codes/E0423.stderr
index c422a1e..d0deb8c 100644
--- a/src/test/ui/error-codes/E0423.stderr
+++ b/src/test/ui/error-codes/E0423.stderr
@@ -29,19 +29,25 @@
   --> $DIR/E0423.rs:12:32
    |
 LL |     if let S { x: _x, y: 2 } = S { x: 1, y: 2 } { println!("Ok"); }
-   |                                ^ did you mean `(S { /* fields */ })`?
+   |                                ^---------------
+   |                                |
+   |                                help: surround the struct literal with parenthesis: `(S { x: 1, y: 2 })`
 
 error[E0423]: expected value, found struct `T`
   --> $DIR/E0423.rs:15:8
    |
 LL |     if T {} == T {} { println!("Ok"); }
-   |        ^ did you mean `(T { /* fields */ })`?
+   |        ^---
+   |        |
+   |        help: surround the struct literal with parenthesis: `(T {})`
 
 error[E0423]: expected value, found struct `std::ops::Range`
   --> $DIR/E0423.rs:21:14
    |
 LL |     for _ in std::ops::Range { start: 0, end: 10 } {}
-   |              ^^^^^^^^^^^^^^^ did you mean `(std::ops::Range { /* fields */ })`?
+   |              ^^^^^^^^^^^^^^^----------------------
+   |              |
+   |              help: surround the struct literal with parenthesis: `(std::ops::Range { start: 0, end: 10 })`
 
 error: aborting due to 7 previous errors
 
diff --git a/src/test/ui/error-codes/E0440.rs b/src/test/ui/error-codes/E0440.rs
deleted file mode 100644
index 8ac47f5..0000000
--- a/src/test/ui/error-codes/E0440.rs
+++ /dev/null
@@ -1,13 +0,0 @@
-#![feature(repr_simd)]
-#![feature(platform_intrinsics)]
-#![allow(non_camel_case_types)]
-
-#[repr(simd)]
-struct f64x2(f64, f64);
-
-extern "platform-intrinsic" {
-    fn x86_mm_movemask_pd<T>(x: f64x2) -> i32; //~ ERROR E0440
-}
-
-fn main () {
-}
diff --git a/src/test/ui/error-codes/E0440.stderr b/src/test/ui/error-codes/E0440.stderr
deleted file mode 100644
index e153fb0..0000000
--- a/src/test/ui/error-codes/E0440.stderr
+++ /dev/null
@@ -1,9 +0,0 @@
-error[E0440]: platform-specific intrinsic has wrong number of type parameters: found 1, expected 0
-  --> $DIR/E0440.rs:9:5
-   |
-LL |     fn x86_mm_movemask_pd<T>(x: f64x2) -> i32; //~ ERROR E0440
-   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-error: aborting due to previous error
-
-For more information about this error, try `rustc --explain E0440`.
diff --git a/src/test/ui/error-codes/E0441.rs b/src/test/ui/error-codes/E0441.rs
deleted file mode 100644
index 90bdbe9..0000000
--- a/src/test/ui/error-codes/E0441.rs
+++ /dev/null
@@ -1,12 +0,0 @@
-#![feature(repr_simd)]
-#![feature(platform_intrinsics)]
-#![allow(non_camel_case_types)]
-
-#[repr(simd)]
-struct i16x8(i16, i16, i16, i16, i16, i16, i16, i16);
-
-extern "platform-intrinsic" {
-    fn x86_mm_adds_ep16(x: i16x8, y: i16x8) -> i16x8; //~ ERROR E0441
-}
-
-fn main() {}
diff --git a/src/test/ui/error-codes/E0441.stderr b/src/test/ui/error-codes/E0441.stderr
deleted file mode 100644
index 73eddb2..0000000
--- a/src/test/ui/error-codes/E0441.stderr
+++ /dev/null
@@ -1,9 +0,0 @@
-error[E0441]: unrecognized platform-specific intrinsic function: `x86_mm_adds_ep16`
-  --> $DIR/E0441.rs:9:5
-   |
-LL |     fn x86_mm_adds_ep16(x: i16x8, y: i16x8) -> i16x8; //~ ERROR E0441
-   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-error: aborting due to previous error
-
-For more information about this error, try `rustc --explain E0441`.
diff --git a/src/test/ui/error-codes/E0442.rs b/src/test/ui/error-codes/E0442.rs
deleted file mode 100644
index a6eb596..0000000
--- a/src/test/ui/error-codes/E0442.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-#![feature(repr_simd)]
-#![feature(platform_intrinsics)]
-#![allow(non_camel_case_types)]
-
-#[repr(simd)]
-struct i8x16(i8, i8, i8, i8, i8, i8, i8, i8,
-             i8, i8, i8, i8, i8, i8, i8, i8);
-#[repr(simd)]
-struct i32x4(i32, i32, i32, i32);
-#[repr(simd)]
-struct i64x2(i64, i64);
-
-extern "platform-intrinsic" {
-    fn x86_mm_adds_epi16(x: i8x16, y: i32x4) -> i64x2;
-    //~^ ERROR E0442
-    //~| ERROR E0442
-    //~| ERROR E0442
-}
-
-fn main() {}
diff --git a/src/test/ui/error-codes/E0442.stderr b/src/test/ui/error-codes/E0442.stderr
deleted file mode 100644
index 017d461..0000000
--- a/src/test/ui/error-codes/E0442.stderr
+++ /dev/null
@@ -1,21 +0,0 @@
-error[E0442]: intrinsic argument 1 has wrong type: found vector with length 16, expected length 8
-  --> $DIR/E0442.rs:14:5
-   |
-LL |     fn x86_mm_adds_epi16(x: i8x16, y: i32x4) -> i64x2;
-   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-error[E0442]: intrinsic argument 2 has wrong type: found vector with length 4, expected length 8
-  --> $DIR/E0442.rs:14:5
-   |
-LL |     fn x86_mm_adds_epi16(x: i8x16, y: i32x4) -> i64x2;
-   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-error[E0442]: intrinsic return value has wrong type: found vector with length 2, expected length 8
-  --> $DIR/E0442.rs:14:5
-   |
-LL |     fn x86_mm_adds_epi16(x: i8x16, y: i32x4) -> i64x2;
-   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-error: aborting due to 3 previous errors
-
-For more information about this error, try `rustc --explain E0442`.
diff --git a/src/test/ui/error-codes/E0443.rs b/src/test/ui/error-codes/E0443.rs
deleted file mode 100644
index 4940f1d..0000000
--- a/src/test/ui/error-codes/E0443.rs
+++ /dev/null
@@ -1,14 +0,0 @@
-#![feature(repr_simd)]
-#![feature(platform_intrinsics)]
-#![allow(non_camel_case_types)]
-
-#[repr(simd)]
-struct i16x8(i16, i16, i16, i16, i16, i16, i16, i16);
-#[repr(simd)]
-struct i64x8(i64, i64, i64, i64, i64, i64, i64, i64);
-
-extern "platform-intrinsic" {
-    fn x86_mm_adds_epi16(x: i16x8, y: i16x8) -> i64x8; //~ ERROR E0443
-}
-
-fn main() {}
diff --git a/src/test/ui/error-codes/E0443.stderr b/src/test/ui/error-codes/E0443.stderr
deleted file mode 100644
index 4c2e641..0000000
--- a/src/test/ui/error-codes/E0443.stderr
+++ /dev/null
@@ -1,9 +0,0 @@
-error[E0443]: intrinsic return value has wrong type: found `i64x8`, expected `i16x8` which was used for this vector type previously in this signature
-  --> $DIR/E0443.rs:11:5
-   |
-LL |     fn x86_mm_adds_epi16(x: i16x8, y: i16x8) -> i64x8; //~ ERROR E0443
-   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-error: aborting due to previous error
-
-For more information about this error, try `rustc --explain E0443`.
diff --git a/src/test/ui/error-codes/E0444.rs b/src/test/ui/error-codes/E0444.rs
deleted file mode 100644
index 3d73339..0000000
--- a/src/test/ui/error-codes/E0444.rs
+++ /dev/null
@@ -1,12 +0,0 @@
-#![feature(repr_simd)]
-#![feature(platform_intrinsics)]
-#![allow(non_camel_case_types)]
-
-#[repr(simd)]
-struct f64x2(f64, f64);
-
-extern "platform-intrinsic" {
-    fn x86_mm_movemask_pd(x: f64x2, y: f64x2, z: f64x2) -> i32; //~ ERROR E0444
-}
-
-fn main() {}
diff --git a/src/test/ui/error-codes/E0444.stderr b/src/test/ui/error-codes/E0444.stderr
deleted file mode 100644
index 0a894f7..0000000
--- a/src/test/ui/error-codes/E0444.stderr
+++ /dev/null
@@ -1,9 +0,0 @@
-error[E0444]: platform-specific intrinsic has invalid number of arguments: found 3, expected 1
-  --> $DIR/E0444.rs:9:5
-   |
-LL |     fn x86_mm_movemask_pd(x: f64x2, y: f64x2, z: f64x2) -> i32; //~ ERROR E0444
-   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-error: aborting due to previous error
-
-For more information about this error, try `rustc --explain E0444`.
diff --git a/src/test/ui/error-codes/E0558.rs b/src/test/ui/error-codes/E0558.rs
deleted file mode 100644
index 26d16f6..0000000
--- a/src/test/ui/error-codes/E0558.rs
+++ /dev/null
@@ -1,6 +0,0 @@
-#[export_name]
-//~^ ERROR E0558
-
-pub fn something() {}
-
-fn main() {}
diff --git a/src/test/ui/error-codes/E0558.stderr b/src/test/ui/error-codes/E0558.stderr
deleted file mode 100644
index 95bd9a1..0000000
--- a/src/test/ui/error-codes/E0558.stderr
+++ /dev/null
@@ -1,9 +0,0 @@
-error[E0558]: `export_name` attribute has invalid format
-  --> $DIR/E0558.rs:1:1
-   |
-LL | #[export_name]
-   | ^^^^^^^^^^^^^^ did you mean #[export_name="*"]?
-
-error: aborting due to previous error
-
-For more information about this error, try `rustc --explain E0558`.
diff --git a/src/test/ui/error-festival.stderr b/src/test/ui/error-festival.stderr
index a600ff1..ff6504e 100644
--- a/src/test/ui/error-festival.stderr
+++ b/src/test/ui/error-festival.stderr
@@ -52,9 +52,7 @@
   --> $DIR/error-festival.rs:33:24
    |
 LL |     let x_is_nonzero = x as bool;
-   |                        ^^^^^^^^^ unsupported cast
-   |
-   = help: compare with zero instead
+   |                        ^^^^^^^^^ help: compare with zero instead: `x != 0`
 
 error[E0606]: casting `&u8` as `u32` is invalid
   --> $DIR/error-festival.rs:37:18
diff --git a/src/test/ui/feature-gate/feature-gate-static-nobundle-2.rs b/src/test/ui/feature-gate/feature-gate-static-nobundle-2.rs
new file mode 100644
index 0000000..92844f9
--- /dev/null
+++ b/src/test/ui/feature-gate/feature-gate-static-nobundle-2.rs
@@ -0,0 +1,6 @@
+//~ ERROR kind="static-nobundle" is feature gated
+// Test the behavior of rustc when non-existent library is statically linked
+
+// compile-flags: -l static-nobundle=nonexistent
+
+fn main() {}
diff --git a/src/test/ui/feature-gate/feature-gate-static-nobundle-2.stderr b/src/test/ui/feature-gate/feature-gate-static-nobundle-2.stderr
new file mode 100644
index 0000000..419c219
--- /dev/null
+++ b/src/test/ui/feature-gate/feature-gate-static-nobundle-2.stderr
@@ -0,0 +1,7 @@
+error[E0658]: kind="static-nobundle" is feature gated (see issue #37403)
+   |
+   = help: add #![feature(static_nobundle)] to the crate attributes to enable
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0658`.
diff --git a/src/test/ui/feature-gate/issue-43106-gating-of-builtin-attrs.rs b/src/test/ui/feature-gate/issue-43106-gating-of-builtin-attrs.rs
index 051bfbe..b1a8cba 100644
--- a/src/test/ui/feature-gate/issue-43106-gating-of-builtin-attrs.rs
+++ b/src/test/ui/feature-gate/issue-43106-gating-of-builtin-attrs.rs
@@ -30,75 +30,71 @@
 // inputs are handled by each, and (2.) to ease searching for related
 // occurrences in the source text.
 
-// skip-codegen
 #![warn(unused_attributes, unknown_lints)]
-#![allow(dead_code)]
 #![allow(stable_features)]
 
 // UNGATED WHITE-LISTED BUILT-IN ATTRIBUTES
 
-#![warn                        (x5400)] //~ WARN unknown lint: `x5400`
-#![allow                       (x5300)] //~ WARN unknown lint: `x5300`
-#![forbid                      (x5200)] //~ WARN unknown lint: `x5200`
-#![deny                        (x5100)] //~ WARN unknown lint: `x5100`
+#![warn(x5400)] //~ WARN unknown lint: `x5400`
+#![allow(x5300)] //~ WARN unknown lint: `x5300`
+#![forbid(x5200)] //~ WARN unknown lint: `x5200`
+#![deny(x5100)] //~ WARN unknown lint: `x5100`
 #![macro_use] // (allowed if no argument; see issue-43160-gating-of-macro_use.rs)
-#![macro_export               = "4800"] //~ WARN unused attribute
-#![plugin_registrar           = "4700"] //~ WARN unused attribute
+#![macro_export] //~ WARN unused attribute
+#![plugin_registrar] //~ WARN unused attribute
 // skipping testing of cfg
 // skipping testing of cfg_attr
-#![main                      = "x4400"] //~ WARN unused attribute
-#![start                     = "x4300"] //~ WARN unused attribute
+#![main] //~ WARN unused attribute
+#![start] //~ WARN unused attribute
 // see issue-43106-gating-of-test.rs for crate-level; but non crate-level is below at "4200"
 // see issue-43106-gating-of-bench.rs for crate-level; but non crate-level is below at "4100"
-#![repr                       = "3900"]
+#![repr()]
 //~^ WARN unused attribute
-//~| WARN `repr` attribute isn't configurable with a literal
-#![path                       = "3800"] //~ WARN unused attribute
-#![abi                        = "3700"] //~ WARN unused attribute
-#![automatically_derived      = "3600"] //~ WARN unused attribute
-#![no_mangle                  = "3500"]
-#![no_link                    = "3400"] //~ WARN unused attribute
+#![path = "3800"] //~ WARN unused attribute
+#![automatically_derived] //~ WARN unused attribute
+#![no_mangle]
+#![no_link] //~ WARN unused attribute
 // see issue-43106-gating-of-derive.rs
-#![should_panic               = "3200"] //~ WARN unused attribute
-#![ignore                     = "3100"] //~ WARN unused attribute
-#![no_implicit_prelude        = "3000"]
+#![should_panic] //~ WARN unused attribute
+#![ignore] //~ WARN unused attribute
+#![no_implicit_prelude]
 #![reexport_test_harness_main = "2900"]
 // see gated-link-args.rs
 // see issue-43106-gating-of-macro_escape.rs for crate-level; but non crate-level is below at "2700"
 // (cannot easily test gating of crate-level #[no_std]; but non crate-level is below at "2600")
-#![proc_macro_derive          = "2500"] //~ WARN unused attribute
-#![doc                        = "2400"]
-#![cold                       = "2300"]
-#![export_name                = "2200"]
+#![proc_macro_derive()] //~ WARN unused attribute
+#![doc = "2400"]
+#![cold]
+#![export_name = "2200"]
 // see issue-43106-gating-of-inline.rs
-#![link                       = "2000"]
-#![link_name                  = "1900"]
-#![link_section               = "1800"]
-#![no_builtins                = "1700"] // Yikes, dupe'd on BUILTIN_ATTRIBUTES list (see "0300")
-#![no_mangle                  = "1600"] // Yikes, dupe'd on BUILTIN_ATTRIBUTES list (see "3500")
+#![link()]
+#![link_name = "1900"]
+#![link_section = "1800"]
+#![no_builtins] // Yikes, dupe'd on BUILTIN_ATTRIBUTES list (see "0300")
+#![no_mangle] // Yikes, dupe'd on BUILTIN_ATTRIBUTES list (see "3500")
 // see issue-43106-gating-of-rustc_deprecated.rs
-#![must_use                   = "1400"]
+#![must_use]
 // see issue-43106-gating-of-stable.rs
 // see issue-43106-gating-of-unstable.rs
 // see issue-43106-gating-of-deprecated.rs
-#![windows_subsystem          = "1000"]
+#![windows_subsystem = "1000"]
 
 // UNGATED CRATE-LEVEL BUILT-IN ATTRIBUTES
 
-#![crate_name                 = "0900"]
-#![crate_type                 = "bin"] // cannot pass "0800" here
+#![crate_name = "0900"]
+#![crate_type = "bin"] // cannot pass "0800" here
 
 // For #![crate_id], see issue #43142. (I cannot bear to enshrine current behavior in a test)
 
 // FIXME(#44232) we should warn that this isn't used.
-#![feature                    ( rust1)]
+#![feature(rust1)]
 
 // For #![no_start], see issue #43144. (I cannot bear to enshrine current behavior in a test)
 
 // (cannot easily gating state of crate-level #[no_main]; but non crate-level is below at "0400")
-#![no_builtins                = "0300"]
-#![recursion_limit            = "0200"]
-#![type_length_limit          = "0100"]
+#![no_builtins]
+#![recursion_limit = "0200"]
+#![type_length_limit = "0100"]
 
 // USES OF BUILT-IN ATTRIBUTES IN OTHER ("UNUSUAL") PLACES
 
@@ -195,84 +191,84 @@
     //~^ WARN unused attribute
 }
 
-#[macro_export = "4800"]
+#[macro_export]
 //~^ WARN unused attribute
 mod macro_export {
-    mod inner { #![macro_export="4800"] }
+    mod inner { #![macro_export] }
     //~^ WARN unused attribute
 
-    #[macro_export = "4800"] fn f() { }
+    #[macro_export] fn f() { }
     //~^ WARN unused attribute
 
-    #[macro_export = "4800"] struct S;
+    #[macro_export] struct S;
     //~^ WARN unused attribute
 
-    #[macro_export = "4800"] type T = S;
+    #[macro_export] type T = S;
     //~^ WARN unused attribute
 
-    #[macro_export = "4800"] impl S { }
+    #[macro_export] impl S { }
     //~^ WARN unused attribute
 }
 
-#[plugin_registrar = "4700"]
+#[plugin_registrar]
 //~^ WARN unused attribute
 mod plugin_registrar {
-    mod inner { #![plugin_registrar="4700"] }
+    mod inner { #![plugin_registrar] }
     //~^ WARN unused attribute
 
     // for `fn f()` case, see gated-plugin_registrar.rs
 
-    #[plugin_registrar = "4700"] struct S;
+    #[plugin_registrar] struct S;
     //~^ WARN unused attribute
 
-    #[plugin_registrar = "4700"] type T = S;
+    #[plugin_registrar] type T = S;
     //~^ WARN unused attribute
 
-    #[plugin_registrar = "4700"] impl S { }
+    #[plugin_registrar] impl S { }
     //~^ WARN unused attribute
 }
 
-#[main = "4400"]
+#[main]
 //~^ WARN unused attribute
 mod main {
-    mod inner { #![main="4300"] }
+    mod inner { #![main] }
     //~^ WARN unused attribute
 
     // for `fn f()` case, see feature-gate-main.rs
 
-    #[main = "4400"] struct S;
+    #[main] struct S;
     //~^ WARN unused attribute
 
-    #[main = "4400"] type T = S;
+    #[main] type T = S;
     //~^ WARN unused attribute
 
-    #[main = "4400"] impl S { }
+    #[main] impl S { }
     //~^ WARN unused attribute
 }
 
-#[start = "4300"]
+#[start]
 //~^ WARN unused attribute
 mod start {
-    mod inner { #![start="4300"] }
+    mod inner { #![start] }
     //~^ WARN unused attribute
 
     // for `fn f()` case, see feature-gate-start.rs
 
-    #[start = "4300"] struct S;
+    #[start] struct S;
     //~^ WARN unused attribute
 
-    #[start = "4300"] type T = S;
+    #[start] type T = S;
     //~^ WARN unused attribute
 
-    #[start = "4300"] impl S { }
+    #[start] impl S { }
     //~^ WARN unused attribute
 }
 
 // At time of unit test authorship, if compiling without `--test` then
 // non-crate-level #[test] attributes seem to be ignored.
 
-#[test = "4200"]
-mod test { mod inner { #![test="4200"] }
+#[test]
+mod test { mod inner { #![test] }
 
     fn f() { }
 
@@ -286,41 +282,31 @@
 // At time of unit test authorship, if compiling without `--test` then
 // non-crate-level #[bench] attributes seem to be ignored.
 
-#[bench = "4100"]
+#[bench]
 mod bench {
-    mod inner { #![bench="4100"] }
+    mod inner { #![bench] }
 
-    #[bench = "4100"]
+    #[bench]
     struct S;
 
-    #[bench = "4100"]
+    #[bench]
     type T = S;
 
-    #[bench = "4100"]
+    #[bench]
     impl S { }
 }
 
-#[repr = "3900"]
-//~^ WARN unused attribute
-//~| WARN `repr` attribute isn't configurable with a literal
+#[repr()]
 mod repr {
-    mod inner { #![repr="3900"] }
-    //~^ WARN unused attribute
-    //~| WARN `repr` attribute isn't configurable with a literal
+    mod inner { #![repr()] }
 
-    #[repr = "3900"] fn f() { }
-    //~^ WARN unused attribute
-    //~| WARN `repr` attribute isn't configurable with a literal
+    #[repr()] fn f() { }
 
     struct S;
 
-    #[repr = "3900"] type T = S;
-    //~^ WARN unused attribute
-    //~| WARN `repr` attribute isn't configurable with a literal
+    #[repr()] type T = S;
 
-    #[repr = "3900"] impl S { }
-    //~^ WARN unused attribute
-    //~| WARN `repr` attribute isn't configurable with a literal
+    #[repr()] impl S { }
 }
 
 #[path = "3800"]
@@ -340,130 +326,111 @@
     //~^ WARN unused attribute
 }
 
-#[abi = "3700"]
-//~^ WARN unused attribute
-mod abi {
-    mod inner { #![abi="3700"] }
-    //~^ WARN unused attribute
-
-    #[abi = "3700"] fn f() { }
-    //~^ WARN unused attribute
-
-    #[abi = "3700"] struct S;
-    //~^ WARN unused attribute
-
-    #[abi = "3700"] type T = S;
-    //~^ WARN unused attribute
-
-    #[abi = "3700"] impl S { }
-    //~^ WARN unused attribute
-}
-
-#[automatically_derived = "3600"]
+#[automatically_derived]
 //~^ WARN unused attribute
 mod automatically_derived {
-    mod inner { #![automatically_derived="3600"] }
+    mod inner { #![automatically_derived] }
     //~^ WARN unused attribute
 
-    #[automatically_derived = "3600"] fn f() { }
+    #[automatically_derived] fn f() { }
     //~^ WARN unused attribute
 
-    #[automatically_derived = "3600"] struct S;
+    #[automatically_derived] struct S;
     //~^ WARN unused attribute
 
-    #[automatically_derived = "3600"] type T = S;
+    #[automatically_derived] type T = S;
     //~^ WARN unused attribute
 
-    #[automatically_derived = "3600"] impl S { }
+    #[automatically_derived] impl S { }
     //~^ WARN unused attribute
 }
 
-#[no_mangle = "3500"]
+#[no_mangle]
 mod no_mangle {
-    mod inner { #![no_mangle="3500"] }
+    mod inner { #![no_mangle] }
 
-    #[no_mangle = "3500"] fn f() { }
+    #[no_mangle] fn f() { }
 
-    #[no_mangle = "3500"] struct S;
+    #[no_mangle] struct S;
 
-    #[no_mangle = "3500"] type T = S;
+    #[no_mangle] type T = S;
 
-    #[no_mangle = "3500"] impl S { }
+    #[no_mangle] impl S { }
 }
 
-#[no_link = "3400"]
+#[no_link]
 //~^ WARN unused attribute
 mod no_link {
-    mod inner { #![no_link="3400"] }
+    mod inner { #![no_link] }
     //~^ WARN unused attribute
 
-    #[no_link = "3400"] fn f() { }
+    #[no_link] fn f() { }
     //~^ WARN unused attribute
 
-    #[no_link = "3400"] struct S;
+    #[no_link] struct S;
     //~^ WARN unused attribute
 
-    #[no_link = "3400"]type T = S;
+    #[no_link]type T = S;
     //~^ WARN unused attribute
 
-    #[no_link = "3400"] impl S { }
+    #[no_link] impl S { }
     //~^ WARN unused attribute
 }
 
-#[should_panic = "3200"]
+#[should_panic]
 //~^ WARN unused attribute
 mod should_panic {
-    mod inner { #![should_panic="3200"] }
+    mod inner { #![should_panic] }
     //~^ WARN unused attribute
 
-    #[should_panic = "3200"] fn f() { }
+    #[should_panic] fn f() { }
     //~^ WARN unused attribute
 
-    #[should_panic = "3200"] struct S;
+    #[should_panic] struct S;
     //~^ WARN unused attribute
 
-    #[should_panic = "3200"] type T = S;
+    #[should_panic] type T = S;
     //~^ WARN unused attribute
 
-    #[should_panic = "3200"] impl S { }
+    #[should_panic] impl S { }
     //~^ WARN unused attribute
 }
 
-#[ignore = "3100"]
+#[ignore]
 //~^ WARN unused attribute
 mod ignore {
-    mod inner { #![ignore="3100"] }
+    mod inner { #![ignore] }
     //~^ WARN unused attribute
 
-    #[ignore = "3100"] fn f() { }
+    #[ignore] fn f() { }
     //~^ WARN unused attribute
 
-    #[ignore = "3100"] struct S;
+    #[ignore] struct S;
     //~^ WARN unused attribute
 
-    #[ignore = "3100"] type T = S;
+    #[ignore] type T = S;
     //~^ WARN unused attribute
 
-    #[ignore = "3100"] impl S { }
+    #[ignore] impl S { }
     //~^ WARN unused attribute
 }
 
-#[no_implicit_prelude = "3000"]
+#[no_implicit_prelude]
 //~^ WARN unused attribute
 mod no_implicit_prelude {
-    mod inner { #![no_implicit_prelude="3000"] }
+    mod inner { #![no_implicit_prelude] }
     //~^ WARN unused attribute
 
-    #[no_implicit_prelude = "3000"] fn f() { }
+    #[no_implicit_prelude] fn f() { }
     //~^ WARN unused attribute
 
-    #[no_implicit_prelude = "3000"] struct S;
+    #[no_implicit_prelude] struct S;
     //~^ WARN unused attribute
 
-    #[no_implicit_prelude = "3000"] type T = S;
+    #[no_implicit_prelude] type T = S;
     //~^ WARN unused attribute
 
-    #[no_implicit_prelude = "3000"] impl S { }
+    #[no_implicit_prelude] impl S { }
     //~^ WARN unused attribute
 }
 
@@ -506,27 +473,27 @@
     //~^ WARN unused attribute
 }
 
-#[no_std = "2600"]
+#[no_std]
 //~^ WARN unused attribute
 //~| WARN crate-level attribute should be an inner attribute
 mod no_std {
-    mod inner { #![no_std="2600"] }
+    mod inner { #![no_std] }
     //~^ WARN unused attribute
     //~| WARN crate-level attribute should be in the root module
 
-    #[no_std = "2600"] fn f() { }
+    #[no_std] fn f() { }
     //~^ WARN unused attribute
     //~| WARN crate-level attribute should be an inner attribute
 
-    #[no_std = "2600"] struct S;
+    #[no_std] struct S;
     //~^ WARN unused attribute
     //~| WARN crate-level attribute should be an inner attribute
 
-    #[no_std = "2600"] type T = S;
+    #[no_std] type T = S;
     //~^ WARN unused attribute
     //~| WARN crate-level attribute should be an inner attribute
 
-    #[no_std = "2600"] impl S { }
+    #[no_std] impl S { }
     //~^ WARN unused attribute
     //~| WARN crate-level attribute should be an inner attribute
 }
@@ -548,17 +515,17 @@
     #[doc = "2400"] impl S { }
 }
 
-#[cold = "2300"]
+#[cold]
 mod cold {
-    mod inner { #![cold="2300"] }
+    mod inner { #![cold] }
 
-    #[cold = "2300"] fn f() { }
+    #[cold] fn f() { }
 
-    #[cold = "2300"] struct S;
+    #[cold] struct S;
 
-    #[cold = "2300"] type T = S;
+    #[cold] type T = S;
 
-    #[cold = "2300"] impl S { }
+    #[cold] impl S { }
 }
 
 #[export_name = "2200"]
@@ -579,17 +546,17 @@
 // out that we allow them at non-crate-level (though I do not know
 // whether they have the same effect here as at crate-level).
 
-#[link = "2000"]
+#[link()]
 mod link {
-    mod inner { #![link="2000"] }
+    mod inner { #![link()] }
 
-    #[link = "2000"] fn f() { }
+    #[link()] fn f() { }
 
-    #[link = "2000"] struct S;
+    #[link()] struct S;
 
-    #[link = "2000"] type T = S;
+    #[link()] type T = S;
 
-    #[link = "2000"] impl S { }
+    #[link()] impl S { }
 }
 
 #[link_name = "1900"]
@@ -620,30 +587,30 @@
 
 struct StructForDeprecated;
 
-#[deprecated = "1500"]
+#[deprecated]
 mod deprecated {
-    mod inner { #![deprecated="1500"] }
+    mod inner { #![deprecated] }
 
-    #[deprecated = "1500"] fn f() { }
+    #[deprecated] fn f() { }
 
-    #[deprecated = "1500"] struct S1;
+    #[deprecated] struct S1;
 
-    #[deprecated = "1500"] type T = super::StructForDeprecated;
+    #[deprecated] type T = super::StructForDeprecated;
 
-    #[deprecated = "1500"] impl super::StructForDeprecated { }
+    #[deprecated] impl super::StructForDeprecated { }
 }
 
-#[must_use = "1400"]
+#[must_use]
 mod must_use {
-    mod inner { #![must_use="1400"] }
+    mod inner { #![must_use] }
 
-    #[must_use = "1400"] fn f() { }
+    #[must_use] fn f() { }
 
-    #[must_use = "1400"] struct S;
+    #[must_use] struct S;
 
-    #[must_use = "1400"] type T = S;
+    #[must_use] type T = S;
 
-    #[must_use = "1400"] impl S { }
+    #[must_use] impl S { }
 }
 
 #[windows_subsystem = "1000"]
@@ -737,42 +704,42 @@
 }
 
 
-#[no_main = "0400"]
+#[no_main]
 //~^ WARN unused attribute
 //~| WARN crate-level attribute should be an inner attribute
 mod no_main_1 {
-    mod inner { #![no_main="0400"] }
+    mod inner { #![no_main] }
     //~^ WARN unused attribute
     //~| WARN crate-level attribute should be in the root module
 
-    #[no_main = "0400"] fn f() { }
+    #[no_main] fn f() { }
     //~^ WARN unused attribute
     //~| WARN crate-level attribute should be an inner attribute
 
-    #[no_main = "0400"] struct S;
+    #[no_main] struct S;
     //~^ WARN unused attribute
     //~| WARN crate-level attribute should be an inner attribute
 
-    #[no_main = "0400"] type T = S;
+    #[no_main] type T = S;
     //~^ WARN unused attribute
     //~| WARN crate-level attribute should be an inner attribute
 
-    #[no_main = "0400"] impl S { }
+    #[no_main] impl S { }
     //~^ WARN unused attribute
     //~| WARN crate-level attribute should be an inner attribute
 }
 
-#[no_builtins = "0300"]
+#[no_builtins]
 mod no_builtins {
-    mod inner { #![no_builtins="0200"] }
+    mod inner { #![no_builtins] }
 
-    #[no_builtins = "0300"] fn f() { }
+    #[no_builtins] fn f() { }
 
-    #[no_builtins = "0300"] struct S;
+    #[no_builtins] struct S;
 
-    #[no_builtins = "0300"] type T = S;
+    #[no_builtins] type T = S;
 
-    #[no_builtins = "0300"] impl S { }
+    #[no_builtins] impl S { }
 }
 
 #[recursion_limit="0200"]
@@ -825,12 +792,4 @@
     //~| WARN crate-level attribute should be an inner attribute
 }
 
-
-
-
-
-
-
-fn main() {
-    println!("Hello World");
-}
+fn main() {}
diff --git a/src/test/ui/feature-gate/issue-43106-gating-of-builtin-attrs.stderr b/src/test/ui/feature-gate/issue-43106-gating-of-builtin-attrs.stderr
index cb3e9bd..4d15ccb 100644
--- a/src/test/ui/feature-gate/issue-43106-gating-of-builtin-attrs.stderr
+++ b/src/test/ui/feature-gate/issue-43106-gating-of-builtin-attrs.stderr
@@ -1,1307 +1,1180 @@
 warning: unknown lint: `x5400`
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:40:33
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:38:9
    |
-LL | #![warn                        (x5400)] //~ WARN unknown lint: `x5400`
-   |                                 ^^^^^
+LL | #![warn(x5400)] //~ WARN unknown lint: `x5400`
+   |         ^^^^^
    |
 note: lint level defined here
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:34:28
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:33:28
    |
 LL | #![warn(unused_attributes, unknown_lints)]
    |                            ^^^^^^^^^^^^^
 
 warning: unknown lint: `x5300`
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:41:33
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:39:10
    |
-LL | #![allow                       (x5300)] //~ WARN unknown lint: `x5300`
-   |                                 ^^^^^
+LL | #![allow(x5300)] //~ WARN unknown lint: `x5300`
+   |          ^^^^^
 
 warning: unknown lint: `x5200`
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:42:33
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:40:11
    |
-LL | #![forbid                      (x5200)] //~ WARN unknown lint: `x5200`
-   |                                 ^^^^^
+LL | #![forbid(x5200)] //~ WARN unknown lint: `x5200`
+   |           ^^^^^
 
 warning: unknown lint: `x5100`
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:43:33
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:41:9
    |
-LL | #![deny                        (x5100)] //~ WARN unknown lint: `x5100`
-   |                                 ^^^^^
+LL | #![deny(x5100)] //~ WARN unknown lint: `x5100`
+   |         ^^^^^
 
 warning: unknown lint: `x5400`
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:105:8
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:101:8
    |
 LL | #[warn(x5400)]
    |        ^^^^^
 
 warning: unknown lint: `x5400`
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:108:25
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:104:25
    |
 LL |     mod inner { #![warn(x5400)] }
    |                         ^^^^^
 
 warning: unknown lint: `x5400`
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:111:12
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:107:12
    |
 LL |     #[warn(x5400)] fn f() { }
    |            ^^^^^
 
 warning: unknown lint: `x5400`
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:114:12
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:110:12
    |
 LL |     #[warn(x5400)] struct S;
    |            ^^^^^
 
 warning: unknown lint: `x5400`
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:117:12
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:113:12
    |
 LL |     #[warn(x5400)] type T = S;
    |            ^^^^^
 
 warning: unknown lint: `x5400`
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:120:12
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:116:12
    |
 LL |     #[warn(x5400)] impl S { }
    |            ^^^^^
 
 warning: unknown lint: `x5300`
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:124:9
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:120:9
    |
 LL | #[allow(x5300)]
    |         ^^^^^
 
 warning: unknown lint: `x5300`
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:127:26
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:123:26
    |
 LL |     mod inner { #![allow(x5300)] }
    |                          ^^^^^
 
 warning: unknown lint: `x5300`
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:130:13
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:126:13
    |
 LL |     #[allow(x5300)] fn f() { }
    |             ^^^^^
 
 warning: unknown lint: `x5300`
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:133:13
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:129:13
    |
 LL |     #[allow(x5300)] struct S;
    |             ^^^^^
 
 warning: unknown lint: `x5300`
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:136:13
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:132:13
    |
 LL |     #[allow(x5300)] type T = S;
    |             ^^^^^
 
 warning: unknown lint: `x5300`
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:139:13
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:135:13
    |
 LL |     #[allow(x5300)] impl S { }
    |             ^^^^^
 
 warning: unknown lint: `x5200`
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:143:10
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:139:10
    |
 LL | #[forbid(x5200)]
    |          ^^^^^
 
 warning: unknown lint: `x5200`
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:146:27
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:142:27
    |
 LL |     mod inner { #![forbid(x5200)] }
    |                           ^^^^^
 
 warning: unknown lint: `x5200`
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:149:14
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:145:14
    |
 LL |     #[forbid(x5200)] fn f() { }
    |              ^^^^^
 
 warning: unknown lint: `x5200`
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:152:14
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:148:14
    |
 LL |     #[forbid(x5200)] struct S;
    |              ^^^^^
 
 warning: unknown lint: `x5200`
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:155:14
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:151:14
    |
 LL |     #[forbid(x5200)] type T = S;
    |              ^^^^^
 
 warning: unknown lint: `x5200`
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:158:14
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:154:14
    |
 LL |     #[forbid(x5200)] impl S { }
    |              ^^^^^
 
 warning: unknown lint: `x5100`
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:162:8
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:158:8
    |
 LL | #[deny(x5100)]
    |        ^^^^^
 
 warning: unknown lint: `x5100`
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:165:25
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:161:25
    |
 LL |     mod inner { #![deny(x5100)] }
    |                         ^^^^^
 
 warning: unknown lint: `x5100`
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:168:12
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:164:12
    |
 LL |     #[deny(x5100)] fn f() { }
    |            ^^^^^
 
 warning: unknown lint: `x5100`
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:171:12
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:167:12
    |
 LL |     #[deny(x5100)] struct S;
    |            ^^^^^
 
 warning: unknown lint: `x5100`
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:174:12
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:170:12
    |
 LL |     #[deny(x5100)] type T = S;
    |            ^^^^^
 
 warning: unknown lint: `x5100`
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:177:12
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:173:12
    |
 LL |     #[deny(x5100)] impl S { }
    |            ^^^^^
 
 warning: macro_escape is a deprecated synonym for macro_use
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:490:1
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:457:1
    |
 LL | #[macro_escape]
    | ^^^^^^^^^^^^^^^
 
 warning: macro_escape is a deprecated synonym for macro_use
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:493:17
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:460:17
    |
 LL |     mod inner { #![macro_escape] }
    |                 ^^^^^^^^^^^^^^^^
    |
    = help: consider an outer attribute, #[macro_use] mod ...
 
-warning: `repr` attribute isn't configurable with a literal
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:307:17
-   |
-LL |     mod inner { #![repr="3900"] }
-   |                 ^^^^^^^^^^^^^^^ needs a hint
-   |
-   = note: #[warn(bad_repr)] on by default
-   = help: valid hints include `#[repr(C)]`, `#[repr(packed)]`, `#[repr(rust)]` and `#[repr(transparent)]`
-   = note: for more information, visit <https://doc.rust-lang.org/reference/type-layout.html>
-
-warning: `repr` attribute isn't configurable with a literal
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:311:5
-   |
-LL |     #[repr = "3900"] fn f() { }
-   |     ^^^^^^^^^^^^^^^^ needs a hint
-   |
-   = help: valid hints include `#[repr(C)]`, `#[repr(packed)]`, `#[repr(rust)]` and `#[repr(transparent)]`
-   = note: for more information, visit <https://doc.rust-lang.org/reference/type-layout.html>
-
-warning: `repr` attribute isn't configurable with a literal
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:317:5
-   |
-LL |     #[repr = "3900"] type T = S;
-   |     ^^^^^^^^^^^^^^^^ needs a hint
-   |
-   = help: valid hints include `#[repr(C)]`, `#[repr(packed)]`, `#[repr(rust)]` and `#[repr(transparent)]`
-   = note: for more information, visit <https://doc.rust-lang.org/reference/type-layout.html>
-
-warning: `repr` attribute isn't configurable with a literal
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:321:5
-   |
-LL |     #[repr = "3900"] impl S { }
-   |     ^^^^^^^^^^^^^^^^ needs a hint
-   |
-   = help: valid hints include `#[repr(C)]`, `#[repr(packed)]`, `#[repr(rust)]` and `#[repr(transparent)]`
-   = note: for more information, visit <https://doc.rust-lang.org/reference/type-layout.html>
-
-warning: `repr` attribute isn't configurable with a literal
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:303:1
-   |
-LL | #[repr = "3900"]
-   | ^^^^^^^^^^^^^^^^ needs a hint
-   |
-   = help: valid hints include `#[repr(C)]`, `#[repr(packed)]`, `#[repr(rust)]` and `#[repr(transparent)]`
-   = note: for more information, visit <https://doc.rust-lang.org/reference/type-layout.html>
-
-warning: `repr` attribute isn't configurable with a literal
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:53:1
-   |
-LL | #![repr                       = "3900"]
-   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ needs a hint
-   |
-   = help: valid hints include `#[repr(C)]`, `#[repr(packed)]`, `#[repr(rust)]` and `#[repr(transparent)]`
-   = note: for more information, visit <https://doc.rust-lang.org/reference/type-layout.html>
-
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:185:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:181:5
    |
 LL |     #[macro_use] fn f() { }
    |     ^^^^^^^^^^^^
    |
 note: lint level defined here
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:34:9
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:33:9
    |
 LL | #![warn(unused_attributes, unknown_lints)]
    |         ^^^^^^^^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:188:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:184:5
    |
 LL |     #[macro_use] struct S;
    |     ^^^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:191:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:187:5
    |
 LL |     #[macro_use] type T = S;
    |     ^^^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:194:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:190:5
    |
 LL |     #[macro_use] impl S { }
    |     ^^^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:201:17
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:197:17
    |
-LL |     mod inner { #![macro_export="4800"] }
-   |                 ^^^^^^^^^^^^^^^^^^^^^^^
-
-warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:204:5
-   |
-LL |     #[macro_export = "4800"] fn f() { }
-   |     ^^^^^^^^^^^^^^^^^^^^^^^^
-
-warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:207:5
-   |
-LL |     #[macro_export = "4800"] struct S;
-   |     ^^^^^^^^^^^^^^^^^^^^^^^^
-
-warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:210:5
-   |
-LL |     #[macro_export = "4800"] type T = S;
-   |     ^^^^^^^^^^^^^^^^^^^^^^^^
-
-warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:213:5
-   |
-LL |     #[macro_export = "4800"] impl S { }
-   |     ^^^^^^^^^^^^^^^^^^^^^^^^
-
-warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:198:1
-   |
-LL | #[macro_export = "4800"]
-   | ^^^^^^^^^^^^^^^^^^^^^^^^
-
-warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:220:17
-   |
-LL |     mod inner { #![plugin_registrar="4700"] }
-   |                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:225:5
-   |
-LL |     #[plugin_registrar = "4700"] struct S;
-   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:228:5
-   |
-LL |     #[plugin_registrar = "4700"] type T = S;
-   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:231:5
-   |
-LL |     #[plugin_registrar = "4700"] impl S { }
-   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:217:1
-   |
-LL | #[plugin_registrar = "4700"]
-   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:238:17
-   |
-LL |     mod inner { #![main="4300"] }
-   |                 ^^^^^^^^^^^^^^^
-
-warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:243:5
-   |
-LL |     #[main = "4400"] struct S;
-   |     ^^^^^^^^^^^^^^^^
-
-warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:246:5
-   |
-LL |     #[main = "4400"] type T = S;
-   |     ^^^^^^^^^^^^^^^^
-
-warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:249:5
-   |
-LL |     #[main = "4400"] impl S { }
-   |     ^^^^^^^^^^^^^^^^
-
-warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:235:1
-   |
-LL | #[main = "4400"]
-   | ^^^^^^^^^^^^^^^^
-
-warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:256:17
-   |
-LL |     mod inner { #![start="4300"] }
+LL |     mod inner { #![macro_export] }
    |                 ^^^^^^^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:261:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:200:5
    |
-LL |     #[start = "4300"] struct S;
-   |     ^^^^^^^^^^^^^^^^^
+LL |     #[macro_export] fn f() { }
+   |     ^^^^^^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:264:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:203:5
    |
-LL |     #[start = "4300"] type T = S;
-   |     ^^^^^^^^^^^^^^^^^
+LL |     #[macro_export] struct S;
+   |     ^^^^^^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:267:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:206:5
    |
-LL |     #[start = "4300"] impl S { }
-   |     ^^^^^^^^^^^^^^^^^
+LL |     #[macro_export] type T = S;
+   |     ^^^^^^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:253:1
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:209:5
    |
-LL | #[start = "4300"]
-   | ^^^^^^^^^^^^^^^^^
+LL |     #[macro_export] impl S { }
+   |     ^^^^^^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:307:17
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:194:1
    |
-LL |     mod inner { #![repr="3900"] }
-   |                 ^^^^^^^^^^^^^^^
+LL | #[macro_export]
+   | ^^^^^^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:311:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:216:17
    |
-LL |     #[repr = "3900"] fn f() { }
-   |     ^^^^^^^^^^^^^^^^
+LL |     mod inner { #![plugin_registrar] }
+   |                 ^^^^^^^^^^^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:317:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:221:5
    |
-LL |     #[repr = "3900"] type T = S;
-   |     ^^^^^^^^^^^^^^^^
+LL |     #[plugin_registrar] struct S;
+   |     ^^^^^^^^^^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:321:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:224:5
    |
-LL |     #[repr = "3900"] impl S { }
-   |     ^^^^^^^^^^^^^^^^
+LL |     #[plugin_registrar] type T = S;
+   |     ^^^^^^^^^^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:303:1
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:227:5
    |
-LL | #[repr = "3900"]
-   | ^^^^^^^^^^^^^^^^
+LL |     #[plugin_registrar] impl S { }
+   |     ^^^^^^^^^^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:330:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:213:1
+   |
+LL | #[plugin_registrar]
+   | ^^^^^^^^^^^^^^^^^^^
+
+warning: unused attribute
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:234:17
+   |
+LL |     mod inner { #![main] }
+   |                 ^^^^^^^^
+
+warning: unused attribute
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:239:5
+   |
+LL |     #[main] struct S;
+   |     ^^^^^^^
+
+warning: unused attribute
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:242:5
+   |
+LL |     #[main] type T = S;
+   |     ^^^^^^^
+
+warning: unused attribute
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:245:5
+   |
+LL |     #[main] impl S { }
+   |     ^^^^^^^
+
+warning: unused attribute
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:231:1
+   |
+LL | #[main]
+   | ^^^^^^^
+
+warning: unused attribute
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:252:17
+   |
+LL |     mod inner { #![start] }
+   |                 ^^^^^^^^^
+
+warning: unused attribute
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:257:5
+   |
+LL |     #[start] struct S;
+   |     ^^^^^^^^
+
+warning: unused attribute
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:260:5
+   |
+LL |     #[start] type T = S;
+   |     ^^^^^^^^
+
+warning: unused attribute
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:263:5
+   |
+LL |     #[start] impl S { }
+   |     ^^^^^^^^
+
+warning: unused attribute
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:249:1
+   |
+LL | #[start]
+   | ^^^^^^^^
+
+warning: unused attribute
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:316:5
    |
 LL |     #[path = "3800"] fn f() { }
    |     ^^^^^^^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:333:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:319:5
    |
 LL |     #[path = "3800"]  struct S;
    |     ^^^^^^^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:336:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:322:5
    |
 LL |     #[path = "3800"] type T = S;
    |     ^^^^^^^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:339:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:325:5
    |
 LL |     #[path = "3800"] impl S { }
    |     ^^^^^^^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:346:17
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:332:17
    |
-LL |     mod inner { #![abi="3700"] }
-   |                 ^^^^^^^^^^^^^^
+LL |     mod inner { #![automatically_derived] }
+   |                 ^^^^^^^^^^^^^^^^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:349:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:335:5
    |
-LL |     #[abi = "3700"] fn f() { }
-   |     ^^^^^^^^^^^^^^^
-
-warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:352:5
-   |
-LL |     #[abi = "3700"] struct S;
-   |     ^^^^^^^^^^^^^^^
-
-warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:355:5
-   |
-LL |     #[abi = "3700"] type T = S;
-   |     ^^^^^^^^^^^^^^^
-
-warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:358:5
-   |
-LL |     #[abi = "3700"] impl S { }
-   |     ^^^^^^^^^^^^^^^
-
-warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:343:1
-   |
-LL | #[abi = "3700"]
-   | ^^^^^^^^^^^^^^^
-
-warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:365:17
-   |
-LL |     mod inner { #![automatically_derived="3600"] }
-   |                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:368:5
-   |
-LL |     #[automatically_derived = "3600"] fn f() { }
-   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:371:5
-   |
-LL |     #[automatically_derived = "3600"] struct S;
-   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:374:5
-   |
-LL |     #[automatically_derived = "3600"] type T = S;
-   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:377:5
-   |
-LL |     #[automatically_derived = "3600"] impl S { }
-   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:362:1
-   |
-LL | #[automatically_derived = "3600"]
-   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:397:17
-   |
-LL |     mod inner { #![no_link="3400"] }
-   |                 ^^^^^^^^^^^^^^^^^^
-
-warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:400:5
-   |
-LL |     #[no_link = "3400"] fn f() { }
-   |     ^^^^^^^^^^^^^^^^^^^
-
-warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:403:5
-   |
-LL |     #[no_link = "3400"] struct S;
-   |     ^^^^^^^^^^^^^^^^^^^
-
-warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:406:5
-   |
-LL |     #[no_link = "3400"]type T = S;
-   |     ^^^^^^^^^^^^^^^^^^^
-
-warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:409:5
-   |
-LL |     #[no_link = "3400"] impl S { }
-   |     ^^^^^^^^^^^^^^^^^^^
-
-warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:394:1
-   |
-LL | #[no_link = "3400"]
-   | ^^^^^^^^^^^^^^^^^^^
-
-warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:416:17
-   |
-LL |     mod inner { #![should_panic="3200"] }
-   |                 ^^^^^^^^^^^^^^^^^^^^^^^
-
-warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:419:5
-   |
-LL |     #[should_panic = "3200"] fn f() { }
+LL |     #[automatically_derived] fn f() { }
    |     ^^^^^^^^^^^^^^^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:422:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:338:5
    |
-LL |     #[should_panic = "3200"] struct S;
+LL |     #[automatically_derived] struct S;
    |     ^^^^^^^^^^^^^^^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:425:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:341:5
    |
-LL |     #[should_panic = "3200"] type T = S;
+LL |     #[automatically_derived] type T = S;
    |     ^^^^^^^^^^^^^^^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:428:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:344:5
    |
-LL |     #[should_panic = "3200"] impl S { }
+LL |     #[automatically_derived] impl S { }
    |     ^^^^^^^^^^^^^^^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:413:1
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:329:1
    |
-LL | #[should_panic = "3200"]
+LL | #[automatically_derived]
    | ^^^^^^^^^^^^^^^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:435:17
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:364:17
    |
-LL |     mod inner { #![ignore="3100"] }
-   |                 ^^^^^^^^^^^^^^^^^
+LL |     mod inner { #![no_link] }
+   |                 ^^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:438:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:367:5
    |
-LL |     #[ignore = "3100"] fn f() { }
-   |     ^^^^^^^^^^^^^^^^^^
+LL |     #[no_link] fn f() { }
+   |     ^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:441:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:370:5
    |
-LL |     #[ignore = "3100"] struct S;
-   |     ^^^^^^^^^^^^^^^^^^
+LL |     #[no_link] struct S;
+   |     ^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:444:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:373:5
    |
-LL |     #[ignore = "3100"] type T = S;
-   |     ^^^^^^^^^^^^^^^^^^
+LL |     #[no_link]type T = S;
+   |     ^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:447:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:376:5
    |
-LL |     #[ignore = "3100"] impl S { }
-   |     ^^^^^^^^^^^^^^^^^^
+LL |     #[no_link] impl S { }
+   |     ^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:432:1
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:361:1
    |
-LL | #[ignore = "3100"]
-   | ^^^^^^^^^^^^^^^^^^
+LL | #[no_link]
+   | ^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:454:17
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:383:17
    |
-LL |     mod inner { #![no_implicit_prelude="3000"] }
-   |                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+LL |     mod inner { #![should_panic] }
+   |                 ^^^^^^^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:457:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:386:5
    |
-LL |     #[no_implicit_prelude = "3000"] fn f() { }
-   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+LL |     #[should_panic] fn f() { }
+   |     ^^^^^^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:460:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:389:5
    |
-LL |     #[no_implicit_prelude = "3000"] struct S;
-   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+LL |     #[should_panic] struct S;
+   |     ^^^^^^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:463:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:392:5
    |
-LL |     #[no_implicit_prelude = "3000"] type T = S;
-   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+LL |     #[should_panic] type T = S;
+   |     ^^^^^^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:466:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:395:5
    |
-LL |     #[no_implicit_prelude = "3000"] impl S { }
-   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+LL |     #[should_panic] impl S { }
+   |     ^^^^^^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:451:1
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:380:1
    |
-LL | #[no_implicit_prelude = "3000"]
-   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+LL | #[should_panic]
+   | ^^^^^^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:473:17
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:402:17
+   |
+LL |     mod inner { #![ignore] }
+   |                 ^^^^^^^^^^
+
+warning: unused attribute
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:405:5
+   |
+LL |     #[ignore] fn f() { }
+   |     ^^^^^^^^^
+
+warning: unused attribute
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:408:5
+   |
+LL |     #[ignore] struct S;
+   |     ^^^^^^^^^
+
+warning: unused attribute
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:411:5
+   |
+LL |     #[ignore] type T = S;
+   |     ^^^^^^^^^
+
+warning: unused attribute
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:414:5
+   |
+LL |     #[ignore] impl S { }
+   |     ^^^^^^^^^
+
+warning: unused attribute
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:399:1
+   |
+LL | #[ignore]
+   | ^^^^^^^^^
+
+warning: unused attribute
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:421:17
+   |
+LL |     mod inner { #![no_implicit_prelude] }
+   |                 ^^^^^^^^^^^^^^^^^^^^^^^
+
+warning: unused attribute
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:424:5
+   |
+LL |     #[no_implicit_prelude] fn f() { }
+   |     ^^^^^^^^^^^^^^^^^^^^^^
+
+warning: unused attribute
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:427:5
+   |
+LL |     #[no_implicit_prelude] struct S;
+   |     ^^^^^^^^^^^^^^^^^^^^^^
+
+warning: unused attribute
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:430:5
+   |
+LL |     #[no_implicit_prelude] type T = S;
+   |     ^^^^^^^^^^^^^^^^^^^^^^
+
+warning: unused attribute
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:433:5
+   |
+LL |     #[no_implicit_prelude] impl S { }
+   |     ^^^^^^^^^^^^^^^^^^^^^^
+
+warning: unused attribute
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:418:1
+   |
+LL | #[no_implicit_prelude]
+   | ^^^^^^^^^^^^^^^^^^^^^^
+
+warning: unused attribute
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:440:17
    |
 LL |     mod inner { #![reexport_test_harness_main="2900"] }
    |                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:476:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:443:5
    |
 LL |     #[reexport_test_harness_main = "2900"] fn f() { }
    |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:479:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:446:5
    |
 LL |     #[reexport_test_harness_main = "2900"] struct S;
    |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:482:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:449:5
    |
 LL |     #[reexport_test_harness_main = "2900"] type T = S;
    |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:485:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:452:5
    |
 LL |     #[reexport_test_harness_main = "2900"] impl S { }
    |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:470:1
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:437:1
    |
 LL | #[reexport_test_harness_main = "2900"]
    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:496:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:463:5
    |
 LL |     #[macro_escape] fn f() { }
    |     ^^^^^^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:499:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:466:5
    |
 LL |     #[macro_escape] struct S;
    |     ^^^^^^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:502:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:469:5
    |
 LL |     #[macro_escape] type T = S;
    |     ^^^^^^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:505:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:472:5
    |
 LL |     #[macro_escape] impl S { }
    |     ^^^^^^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:513:17
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:480:17
    |
-LL |     mod inner { #![no_std="2600"] }
-   |                 ^^^^^^^^^^^^^^^^^
+LL |     mod inner { #![no_std] }
+   |                 ^^^^^^^^^^
 
 warning: crate-level attribute should be in the root module
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:513:17
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:480:17
    |
-LL |     mod inner { #![no_std="2600"] }
-   |                 ^^^^^^^^^^^^^^^^^
+LL |     mod inner { #![no_std] }
+   |                 ^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:517:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:484:5
    |
-LL |     #[no_std = "2600"] fn f() { }
-   |     ^^^^^^^^^^^^^^^^^^
+LL |     #[no_std] fn f() { }
+   |     ^^^^^^^^^
 
 warning: crate-level attribute should be an inner attribute: add an exclamation mark: #![foo]
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:517:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:484:5
    |
-LL |     #[no_std = "2600"] fn f() { }
-   |     ^^^^^^^^^^^^^^^^^^
+LL |     #[no_std] fn f() { }
+   |     ^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:521:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:488:5
    |
-LL |     #[no_std = "2600"] struct S;
-   |     ^^^^^^^^^^^^^^^^^^
+LL |     #[no_std] struct S;
+   |     ^^^^^^^^^
 
 warning: crate-level attribute should be an inner attribute: add an exclamation mark: #![foo]
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:521:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:488:5
    |
-LL |     #[no_std = "2600"] struct S;
-   |     ^^^^^^^^^^^^^^^^^^
+LL |     #[no_std] struct S;
+   |     ^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:525:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:492:5
    |
-LL |     #[no_std = "2600"] type T = S;
-   |     ^^^^^^^^^^^^^^^^^^
+LL |     #[no_std] type T = S;
+   |     ^^^^^^^^^
 
 warning: crate-level attribute should be an inner attribute: add an exclamation mark: #![foo]
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:525:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:492:5
    |
-LL |     #[no_std = "2600"] type T = S;
-   |     ^^^^^^^^^^^^^^^^^^
+LL |     #[no_std] type T = S;
+   |     ^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:529:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:496:5
    |
-LL |     #[no_std = "2600"] impl S { }
-   |     ^^^^^^^^^^^^^^^^^^
+LL |     #[no_std] impl S { }
+   |     ^^^^^^^^^
 
 warning: crate-level attribute should be an inner attribute: add an exclamation mark: #![foo]
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:529:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:496:5
    |
-LL |     #[no_std = "2600"] impl S { }
-   |     ^^^^^^^^^^^^^^^^^^
+LL |     #[no_std] impl S { }
+   |     ^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:509:1
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:476:1
    |
-LL | #[no_std = "2600"]
-   | ^^^^^^^^^^^^^^^^^^
+LL | #[no_std]
+   | ^^^^^^^^^
 
 warning: crate-level attribute should be an inner attribute: add an exclamation mark: #![foo]
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:509:1
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:476:1
    |
-LL | #[no_std = "2600"]
-   | ^^^^^^^^^^^^^^^^^^
+LL | #[no_std]
+   | ^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:668:17
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:635:17
    |
 LL |     mod inner { #![crate_name="0900"] }
    |                 ^^^^^^^^^^^^^^^^^^^^^
 
 warning: crate-level attribute should be in the root module
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:668:17
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:635:17
    |
 LL |     mod inner { #![crate_name="0900"] }
    |                 ^^^^^^^^^^^^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:672:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:639:5
    |
 LL |     #[crate_name = "0900"] fn f() { }
    |     ^^^^^^^^^^^^^^^^^^^^^^
 
 warning: crate-level attribute should be an inner attribute: add an exclamation mark: #![foo]
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:672:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:639:5
    |
 LL |     #[crate_name = "0900"] fn f() { }
    |     ^^^^^^^^^^^^^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:676:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:643:5
    |
 LL |     #[crate_name = "0900"] struct S;
    |     ^^^^^^^^^^^^^^^^^^^^^^
 
 warning: crate-level attribute should be an inner attribute: add an exclamation mark: #![foo]
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:676:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:643:5
    |
 LL |     #[crate_name = "0900"] struct S;
    |     ^^^^^^^^^^^^^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:680:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:647:5
    |
 LL |     #[crate_name = "0900"] type T = S;
    |     ^^^^^^^^^^^^^^^^^^^^^^
 
 warning: crate-level attribute should be an inner attribute: add an exclamation mark: #![foo]
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:680:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:647:5
    |
 LL |     #[crate_name = "0900"] type T = S;
    |     ^^^^^^^^^^^^^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:684:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:651:5
    |
 LL |     #[crate_name = "0900"] impl S { }
    |     ^^^^^^^^^^^^^^^^^^^^^^
 
 warning: crate-level attribute should be an inner attribute: add an exclamation mark: #![foo]
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:684:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:651:5
    |
 LL |     #[crate_name = "0900"] impl S { }
    |     ^^^^^^^^^^^^^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:664:1
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:631:1
    |
 LL | #[crate_name = "0900"]
    | ^^^^^^^^^^^^^^^^^^^^^^
 
 warning: crate-level attribute should be an inner attribute: add an exclamation mark: #![foo]
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:664:1
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:631:1
    |
 LL | #[crate_name = "0900"]
    | ^^^^^^^^^^^^^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:693:17
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:660:17
    |
 LL |     mod inner { #![crate_type="0800"] }
    |                 ^^^^^^^^^^^^^^^^^^^^^
 
 warning: crate-level attribute should be in the root module
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:693:17
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:660:17
    |
 LL |     mod inner { #![crate_type="0800"] }
    |                 ^^^^^^^^^^^^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:697:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:664:5
    |
 LL |     #[crate_type = "0800"] fn f() { }
    |     ^^^^^^^^^^^^^^^^^^^^^^
 
 warning: crate-level attribute should be an inner attribute: add an exclamation mark: #![foo]
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:697:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:664:5
    |
 LL |     #[crate_type = "0800"] fn f() { }
    |     ^^^^^^^^^^^^^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:701:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:668:5
    |
 LL |     #[crate_type = "0800"] struct S;
    |     ^^^^^^^^^^^^^^^^^^^^^^
 
 warning: crate-level attribute should be an inner attribute: add an exclamation mark: #![foo]
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:701:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:668:5
    |
 LL |     #[crate_type = "0800"] struct S;
    |     ^^^^^^^^^^^^^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:705:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:672:5
    |
 LL |     #[crate_type = "0800"] type T = S;
    |     ^^^^^^^^^^^^^^^^^^^^^^
 
 warning: crate-level attribute should be an inner attribute: add an exclamation mark: #![foo]
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:705:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:672:5
    |
 LL |     #[crate_type = "0800"] type T = S;
    |     ^^^^^^^^^^^^^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:709:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:676:5
    |
 LL |     #[crate_type = "0800"] impl S { }
    |     ^^^^^^^^^^^^^^^^^^^^^^
 
 warning: crate-level attribute should be an inner attribute: add an exclamation mark: #![foo]
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:709:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:676:5
    |
 LL |     #[crate_type = "0800"] impl S { }
    |     ^^^^^^^^^^^^^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:689:1
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:656:1
    |
 LL | #[crate_type = "0800"]
    | ^^^^^^^^^^^^^^^^^^^^^^
 
 warning: crate-level attribute should be an inner attribute: add an exclamation mark: #![foo]
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:689:1
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:656:1
    |
 LL | #[crate_type = "0800"]
    | ^^^^^^^^^^^^^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:718:17
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:685:17
    |
 LL |     mod inner { #![feature(x0600)] }
    |                 ^^^^^^^^^^^^^^^^^^
 
 warning: crate-level attribute should be in the root module
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:718:17
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:685:17
    |
 LL |     mod inner { #![feature(x0600)] }
    |                 ^^^^^^^^^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:722:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:689:5
    |
 LL |     #[feature(x0600)] fn f() { }
    |     ^^^^^^^^^^^^^^^^^
 
 warning: crate-level attribute should be an inner attribute: add an exclamation mark: #![foo]
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:722:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:689:5
    |
 LL |     #[feature(x0600)] fn f() { }
    |     ^^^^^^^^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:726:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:693:5
    |
 LL |     #[feature(x0600)] struct S;
    |     ^^^^^^^^^^^^^^^^^
 
 warning: crate-level attribute should be an inner attribute: add an exclamation mark: #![foo]
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:726:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:693:5
    |
 LL |     #[feature(x0600)] struct S;
    |     ^^^^^^^^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:730:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:697:5
    |
 LL |     #[feature(x0600)] type T = S;
    |     ^^^^^^^^^^^^^^^^^
 
 warning: crate-level attribute should be an inner attribute: add an exclamation mark: #![foo]
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:730:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:697:5
    |
 LL |     #[feature(x0600)] type T = S;
    |     ^^^^^^^^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:734:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:701:5
    |
 LL |     #[feature(x0600)] impl S { }
    |     ^^^^^^^^^^^^^^^^^
 
 warning: crate-level attribute should be an inner attribute: add an exclamation mark: #![foo]
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:734:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:701:5
    |
 LL |     #[feature(x0600)] impl S { }
    |     ^^^^^^^^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:714:1
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:681:1
    |
 LL | #[feature(x0600)]
    | ^^^^^^^^^^^^^^^^^
 
 warning: crate-level attribute should be an inner attribute: add an exclamation mark: #![foo]
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:714:1
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:681:1
    |
 LL | #[feature(x0600)]
    | ^^^^^^^^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:744:17
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:711:17
    |
-LL |     mod inner { #![no_main="0400"] }
-   |                 ^^^^^^^^^^^^^^^^^^
+LL |     mod inner { #![no_main] }
+   |                 ^^^^^^^^^^^
 
 warning: crate-level attribute should be in the root module
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:744:17
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:711:17
    |
-LL |     mod inner { #![no_main="0400"] }
-   |                 ^^^^^^^^^^^^^^^^^^
+LL |     mod inner { #![no_main] }
+   |                 ^^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:748:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:715:5
    |
-LL |     #[no_main = "0400"] fn f() { }
-   |     ^^^^^^^^^^^^^^^^^^^
+LL |     #[no_main] fn f() { }
+   |     ^^^^^^^^^^
 
 warning: crate-level attribute should be an inner attribute: add an exclamation mark: #![foo]
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:748:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:715:5
    |
-LL |     #[no_main = "0400"] fn f() { }
-   |     ^^^^^^^^^^^^^^^^^^^
+LL |     #[no_main] fn f() { }
+   |     ^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:752:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:719:5
    |
-LL |     #[no_main = "0400"] struct S;
-   |     ^^^^^^^^^^^^^^^^^^^
+LL |     #[no_main] struct S;
+   |     ^^^^^^^^^^
 
 warning: crate-level attribute should be an inner attribute: add an exclamation mark: #![foo]
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:752:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:719:5
    |
-LL |     #[no_main = "0400"] struct S;
-   |     ^^^^^^^^^^^^^^^^^^^
+LL |     #[no_main] struct S;
+   |     ^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:756:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:723:5
    |
-LL |     #[no_main = "0400"] type T = S;
-   |     ^^^^^^^^^^^^^^^^^^^
+LL |     #[no_main] type T = S;
+   |     ^^^^^^^^^^
 
 warning: crate-level attribute should be an inner attribute: add an exclamation mark: #![foo]
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:756:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:723:5
    |
-LL |     #[no_main = "0400"] type T = S;
-   |     ^^^^^^^^^^^^^^^^^^^
+LL |     #[no_main] type T = S;
+   |     ^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:760:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:727:5
    |
-LL |     #[no_main = "0400"] impl S { }
-   |     ^^^^^^^^^^^^^^^^^^^
+LL |     #[no_main] impl S { }
+   |     ^^^^^^^^^^
 
 warning: crate-level attribute should be an inner attribute: add an exclamation mark: #![foo]
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:760:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:727:5
    |
-LL |     #[no_main = "0400"] impl S { }
-   |     ^^^^^^^^^^^^^^^^^^^
+LL |     #[no_main] impl S { }
+   |     ^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:740:1
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:707:1
    |
-LL | #[no_main = "0400"]
-   | ^^^^^^^^^^^^^^^^^^^
+LL | #[no_main]
+   | ^^^^^^^^^^
 
 warning: crate-level attribute should be an inner attribute: add an exclamation mark: #![foo]
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:740:1
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:707:1
    |
-LL | #[no_main = "0400"]
-   | ^^^^^^^^^^^^^^^^^^^
+LL | #[no_main]
+   | ^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:782:17
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:749:17
    |
 LL |     mod inner { #![recursion_limit="0200"] }
    |                 ^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 warning: crate-level attribute should be in the root module
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:782:17
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:749:17
    |
 LL |     mod inner { #![recursion_limit="0200"] }
    |                 ^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:786:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:753:5
    |
 LL |     #[recursion_limit="0200"] fn f() { }
    |     ^^^^^^^^^^^^^^^^^^^^^^^^^
 
 warning: crate-level attribute should be an inner attribute: add an exclamation mark: #![foo]
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:786:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:753:5
    |
 LL |     #[recursion_limit="0200"] fn f() { }
    |     ^^^^^^^^^^^^^^^^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:790:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:757:5
    |
 LL |     #[recursion_limit="0200"] struct S;
    |     ^^^^^^^^^^^^^^^^^^^^^^^^^
 
 warning: crate-level attribute should be an inner attribute: add an exclamation mark: #![foo]
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:790:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:757:5
    |
 LL |     #[recursion_limit="0200"] struct S;
    |     ^^^^^^^^^^^^^^^^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:794:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:761:5
    |
 LL |     #[recursion_limit="0200"] type T = S;
    |     ^^^^^^^^^^^^^^^^^^^^^^^^^
 
 warning: crate-level attribute should be an inner attribute: add an exclamation mark: #![foo]
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:794:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:761:5
    |
 LL |     #[recursion_limit="0200"] type T = S;
    |     ^^^^^^^^^^^^^^^^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:798:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:765:5
    |
 LL |     #[recursion_limit="0200"] impl S { }
    |     ^^^^^^^^^^^^^^^^^^^^^^^^^
 
 warning: crate-level attribute should be an inner attribute: add an exclamation mark: #![foo]
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:798:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:765:5
    |
 LL |     #[recursion_limit="0200"] impl S { }
    |     ^^^^^^^^^^^^^^^^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:778:1
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:745:1
    |
 LL | #[recursion_limit="0200"]
    | ^^^^^^^^^^^^^^^^^^^^^^^^^
 
 warning: crate-level attribute should be an inner attribute: add an exclamation mark: #![foo]
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:778:1
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:745:1
    |
 LL | #[recursion_limit="0200"]
    | ^^^^^^^^^^^^^^^^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:807:17
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:774:17
    |
 LL |     mod inner { #![type_length_limit="0100"] }
    |                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 warning: crate-level attribute should be in the root module
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:807:17
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:774:17
    |
 LL |     mod inner { #![type_length_limit="0100"] }
    |                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:811:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:778:5
    |
 LL |     #[type_length_limit="0100"] fn f() { }
    |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 warning: crate-level attribute should be an inner attribute: add an exclamation mark: #![foo]
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:811:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:778:5
    |
 LL |     #[type_length_limit="0100"] fn f() { }
    |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:815:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:782:5
    |
 LL |     #[type_length_limit="0100"] struct S;
    |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 warning: crate-level attribute should be an inner attribute: add an exclamation mark: #![foo]
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:815:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:782:5
    |
 LL |     #[type_length_limit="0100"] struct S;
    |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:819:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:786:5
    |
 LL |     #[type_length_limit="0100"] type T = S;
    |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 warning: crate-level attribute should be an inner attribute: add an exclamation mark: #![foo]
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:819:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:786:5
    |
 LL |     #[type_length_limit="0100"] type T = S;
    |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:823:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:790:5
    |
 LL |     #[type_length_limit="0100"] impl S { }
    |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 warning: crate-level attribute should be an inner attribute: add an exclamation mark: #![foo]
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:823:5
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:790:5
    |
 LL |     #[type_length_limit="0100"] impl S { }
    |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:803:1
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:770:1
    |
 LL | #[type_length_limit="0100"]
    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 warning: crate-level attribute should be an inner attribute: add an exclamation mark: #![foo]
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:803:1
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:770:1
    |
 LL | #[type_length_limit="0100"]
    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:45:1
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:43:1
    |
-LL | #![macro_export               = "4800"] //~ WARN unused attribute
-   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+LL | #![macro_export] //~ WARN unused attribute
+   | ^^^^^^^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:46:1
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:44:1
    |
-LL | #![plugin_registrar           = "4700"] //~ WARN unused attribute
-   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+LL | #![plugin_registrar] //~ WARN unused attribute
+   | ^^^^^^^^^^^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:49:1
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:47:1
    |
-LL | #![main                      = "x4400"] //~ WARN unused attribute
-   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+LL | #![main] //~ WARN unused attribute
+   | ^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:50:1
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:48:1
    |
-LL | #![start                     = "x4300"] //~ WARN unused attribute
-   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+LL | #![start] //~ WARN unused attribute
+   | ^^^^^^^^^
+
+warning: unused attribute
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:51:1
+   |
+LL | #![repr()]
+   | ^^^^^^^^^^
 
 warning: unused attribute
   --> $DIR/issue-43106-gating-of-builtin-attrs.rs:53:1
    |
-LL | #![repr                       = "3900"]
-   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+LL | #![path = "3800"] //~ WARN unused attribute
+   | ^^^^^^^^^^^^^^^^^
+
+warning: unused attribute
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:54:1
+   |
+LL | #![automatically_derived] //~ WARN unused attribute
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^
 
 warning: unused attribute
   --> $DIR/issue-43106-gating-of-builtin-attrs.rs:56:1
    |
-LL | #![path                       = "3800"] //~ WARN unused attribute
-   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:57:1
-   |
-LL | #![abi                        = "3700"] //~ WARN unused attribute
-   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+LL | #![no_link] //~ WARN unused attribute
+   | ^^^^^^^^^^^
 
 warning: unused attribute
   --> $DIR/issue-43106-gating-of-builtin-attrs.rs:58:1
    |
-LL | #![automatically_derived      = "3600"] //~ WARN unused attribute
-   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+LL | #![should_panic] //~ WARN unused attribute
+   | ^^^^^^^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:60:1
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:59:1
    |
-LL | #![no_link                    = "3400"] //~ WARN unused attribute
-   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+LL | #![ignore] //~ WARN unused attribute
+   | ^^^^^^^^^^
 
 warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:62:1
+  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:65:1
    |
-LL | #![should_panic               = "3200"] //~ WARN unused attribute
-   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:63:1
-   |
-LL | #![ignore                     = "3100"] //~ WARN unused attribute
-   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-warning: unused attribute
-  --> $DIR/issue-43106-gating-of-builtin-attrs.rs:69:1
-   |
-LL | #![proc_macro_derive          = "2500"] //~ WARN unused attribute
-   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+LL | #![proc_macro_derive()] //~ WARN unused attribute
+   | ^^^^^^^^^^^^^^^^^^^^^^^
 
 error: invalid windows subsystem `1000`, only `windows` and `console` are allowed
 
diff --git a/src/test/ui/feature-gate/issue-43106-gating-of-deprecated.rs b/src/test/ui/feature-gate/issue-43106-gating-of-deprecated.rs
index 32f30ce..360d570 100644
--- a/src/test/ui/feature-gate/issue-43106-gating-of-deprecated.rs
+++ b/src/test/ui/feature-gate/issue-43106-gating-of-deprecated.rs
@@ -7,15 +7,7 @@
 
 // compile-pass
 // skip-codegen
-#![allow(dead_code)]
-#![deprecated           = "1100"]
 
-// Since we expect for the mix of attributes used here to compile
-// successfully, and we are just testing for the expected warnings of
-// various (mis)uses of attributes, we use the `rustc_error` attribute
-// on the `fn main()`.
+#![deprecated]
 
-
-fn main() {
-    println!("Hello World");
-}
+fn main() {}
diff --git a/src/test/ui/feature-gate/issue-43106-gating-of-inline.rs b/src/test/ui/feature-gate/issue-43106-gating-of-inline.rs
index 7c17cd1..bb9e6d4 100644
--- a/src/test/ui/feature-gate/issue-43106-gating-of-inline.rs
+++ b/src/test/ui/feature-gate/issue-43106-gating-of-inline.rs
@@ -6,23 +6,25 @@
 // issue-43106-gating-of-builtin-attrs.rs)
 
 // Crate-level is accepted, though it is almost certainly unused?
-#![inline                     = "2100"]
+#![inline]
 
-#[inline = "2100"]
+#[inline]
 //~^ ERROR attribute should be applied to function or closure
 mod inline {
-    mod inner { #![inline="2100"] }
+    mod inner { #![inline] }
     //~^ ERROR attribute should be applied to function or closure
 
     #[inline = "2100"] fn f() { }
+    //~^ WARN attribute must be of the form
+    //~| WARN this was previously accepted
 
-    #[inline = "2100"] struct S;
+    #[inline] struct S;
     //~^ ERROR attribute should be applied to function or closure
 
-    #[inline = "2100"] type T = S;
+    #[inline] type T = S;
     //~^ ERROR attribute should be applied to function or closure
 
-    #[inline = "2100"] impl S { }
+    #[inline] impl S { }
     //~^ ERROR attribute should be applied to function or closure
 }
 
diff --git a/src/test/ui/feature-gate/issue-43106-gating-of-inline.stderr b/src/test/ui/feature-gate/issue-43106-gating-of-inline.stderr
index 7eb0b5c..71e8f11 100644
--- a/src/test/ui/feature-gate/issue-43106-gating-of-inline.stderr
+++ b/src/test/ui/feature-gate/issue-43106-gating-of-inline.stderr
@@ -1,11 +1,21 @@
+warning: attribute must be of the form `#[inline]` or `#[inline(always|never)]`
+  --> $DIR/issue-43106-gating-of-inline.rs:17:5
+   |
+LL |     #[inline = "2100"] fn f() { }
+   |     ^^^^^^^^^^^^^^^^^^
+   |
+   = note: #[warn(ill_formed_attribute_input)] on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #57571 <https://github.com/rust-lang/rust/issues/57571>
+
 error[E0518]: attribute should be applied to function or closure
   --> $DIR/issue-43106-gating-of-inline.rs:11:1
    |
-LL |   #[inline = "2100"]
-   |   ^^^^^^^^^^^^^^^^^^
+LL |   #[inline]
+   |   ^^^^^^^^^
 LL |   //~^ ERROR attribute should be applied to function or closure
 LL | / mod inline {
-LL | |     mod inner { #![inline="2100"] }
+LL | |     mod inner { #![inline] }
 LL | |     //~^ ERROR attribute should be applied to function or closure
 LL | |
 ...  |
@@ -16,26 +26,26 @@
 error[E0518]: attribute should be applied to function or closure
   --> $DIR/issue-43106-gating-of-inline.rs:14:17
    |
-LL |     mod inner { #![inline="2100"] }
-   |     ------------^^^^^^^^^^^^^^^^^-- not a function or closure
+LL |     mod inner { #![inline] }
+   |     ------------^^^^^^^^^^-- not a function or closure
 
 error[E0518]: attribute should be applied to function or closure
-  --> $DIR/issue-43106-gating-of-inline.rs:19:5
+  --> $DIR/issue-43106-gating-of-inline.rs:21:5
    |
-LL |     #[inline = "2100"] struct S;
-   |     ^^^^^^^^^^^^^^^^^^ --------- not a function or closure
+LL |     #[inline] struct S;
+   |     ^^^^^^^^^ --------- not a function or closure
 
 error[E0518]: attribute should be applied to function or closure
-  --> $DIR/issue-43106-gating-of-inline.rs:22:5
+  --> $DIR/issue-43106-gating-of-inline.rs:24:5
    |
-LL |     #[inline = "2100"] type T = S;
-   |     ^^^^^^^^^^^^^^^^^^ ----------- not a function or closure
+LL |     #[inline] type T = S;
+   |     ^^^^^^^^^ ----------- not a function or closure
 
 error[E0518]: attribute should be applied to function or closure
-  --> $DIR/issue-43106-gating-of-inline.rs:25:5
+  --> $DIR/issue-43106-gating-of-inline.rs:27:5
    |
-LL |     #[inline = "2100"] impl S { }
-   |     ^^^^^^^^^^^^^^^^^^ ---------- not a function or closure
+LL |     #[inline] impl S { }
+   |     ^^^^^^^^^ ---------- not a function or closure
 
 error: aborting due to 5 previous errors
 
diff --git a/src/test/ui/feature-gate/issue-43106-gating-of-macro_use.rs b/src/test/ui/feature-gate/issue-43106-gating-of-macro_use.rs
index bb54c00..725f2e0 100644
--- a/src/test/ui/feature-gate/issue-43106-gating-of-macro_use.rs
+++ b/src/test/ui/feature-gate/issue-43106-gating-of-macro_use.rs
@@ -3,21 +3,23 @@
 // corresponds to cases where the attribute is currently unused, so we
 // get that warning; see issue-43106-gating-of-builtin-attrs.rs
 
-#![macro_use                  = "4900"] //~ ERROR arguments to macro_use are not allowed here
+#![macro_use(my_macro)]
+//~^ ERROR arguments to macro_use are not allowed here
 
-#[macro_use = "2700"]
+#[macro_use(my_macro)]
 //~^ ERROR arguments to macro_use are not allowed here
 mod macro_escape {
-    mod inner { #![macro_use="2700"] }
+    mod inner { #![macro_use(my_macro)] }
     //~^ ERROR arguments to macro_use are not allowed here
 
-    #[macro_use = "2700"] fn f() { }
-
     #[macro_use = "2700"] struct S;
+    //~^ ERROR attribute must be of the form
 
-    #[macro_use = "2700"] type T = S;
+    #[macro_use] fn f() { }
 
-    #[macro_use = "2700"] impl S { }
+    #[macro_use] type T = S;
+
+    #[macro_use] impl S { }
 }
 
 fn main() { }
diff --git a/src/test/ui/feature-gate/issue-43106-gating-of-macro_use.stderr b/src/test/ui/feature-gate/issue-43106-gating-of-macro_use.stderr
index fb0e3b4..8074528 100644
--- a/src/test/ui/feature-gate/issue-43106-gating-of-macro_use.stderr
+++ b/src/test/ui/feature-gate/issue-43106-gating-of-macro_use.stderr
@@ -1,20 +1,26 @@
 error: arguments to macro_use are not allowed here
   --> $DIR/issue-43106-gating-of-macro_use.rs:6:1
    |
-LL | #![macro_use                  = "4900"] //~ ERROR arguments to macro_use are not allowed here
-   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+LL | #![macro_use(my_macro)]
+   | ^^^^^^^^^^^^^^^^^^^^^^^
 
 error: arguments to macro_use are not allowed here
-  --> $DIR/issue-43106-gating-of-macro_use.rs:8:1
+  --> $DIR/issue-43106-gating-of-macro_use.rs:9:1
    |
-LL | #[macro_use = "2700"]
-   | ^^^^^^^^^^^^^^^^^^^^^
+LL | #[macro_use(my_macro)]
+   | ^^^^^^^^^^^^^^^^^^^^^^
 
 error: arguments to macro_use are not allowed here
-  --> $DIR/issue-43106-gating-of-macro_use.rs:11:17
+  --> $DIR/issue-43106-gating-of-macro_use.rs:12:17
    |
-LL |     mod inner { #![macro_use="2700"] }
-   |                 ^^^^^^^^^^^^^^^^^^^^
+LL |     mod inner { #![macro_use(my_macro)] }
+   |                 ^^^^^^^^^^^^^^^^^^^^^^^
 
-error: aborting due to 3 previous errors
+error: attribute must be of the form `#[macro_use]` or `#[macro_use(name1, name2, ...)]`
+  --> $DIR/issue-43106-gating-of-macro_use.rs:15:5
+   |
+LL |     #[macro_use = "2700"] struct S;
+   |     ^^^^^^^^^^^^^^^^^^^^^
+
+error: aborting due to 4 previous errors
 
diff --git a/src/test/ui/feature-gate/issue-43106-gating-of-proc_macro_derive.rs b/src/test/ui/feature-gate/issue-43106-gating-of-proc_macro_derive.rs
index e2d0c26..a94ffd6 100644
--- a/src/test/ui/feature-gate/issue-43106-gating-of-proc_macro_derive.rs
+++ b/src/test/ui/feature-gate/issue-43106-gating-of-proc_macro_derive.rs
@@ -7,27 +7,27 @@
 // signal errors, making it incompatible with the "warnings only"
 // nature of issue-43106-gating-of-builtin-attrs.rs
 
-#[proc_macro_derive = "2500"]
+#[proc_macro_derive()]
 //~^ ERROR the `#[proc_macro_derive]` attribute may only be used on bare functions
 mod proc_macro_derive1 {
-    mod inner { #![proc_macro_derive="2500"] }
+    mod inner { #![proc_macro_derive()] }
     // (no error issued here if there was one on outer module)
 }
 
 mod proc_macro_derive2 {
-    mod inner { #![proc_macro_derive="2500"] }
+    mod inner { #![proc_macro_derive()] }
     //~^ ERROR the `#[proc_macro_derive]` attribute may only be used on bare functions
 
-    #[proc_macro_derive = "2500"] fn f() { }
+    #[proc_macro_derive()] fn f() { }
     //~^ ERROR the `#[proc_macro_derive]` attribute is only usable with crates of the `proc-macro`
 
-    #[proc_macro_derive = "2500"] struct S;
+    #[proc_macro_derive()] struct S;
     //~^ ERROR the `#[proc_macro_derive]` attribute may only be used on bare functions
 
-    #[proc_macro_derive = "2500"] type T = S;
+    #[proc_macro_derive()] type T = S;
     //~^ ERROR the `#[proc_macro_derive]` attribute may only be used on bare functions
 
-    #[proc_macro_derive = "2500"] impl S { }
+    #[proc_macro_derive()] impl S { }
     //~^ ERROR the `#[proc_macro_derive]` attribute may only be used on bare functions
 }
 
diff --git a/src/test/ui/feature-gate/issue-43106-gating-of-proc_macro_derive.stderr b/src/test/ui/feature-gate/issue-43106-gating-of-proc_macro_derive.stderr
index aa841c3..e202b47 100644
--- a/src/test/ui/feature-gate/issue-43106-gating-of-proc_macro_derive.stderr
+++ b/src/test/ui/feature-gate/issue-43106-gating-of-proc_macro_derive.stderr
@@ -1,38 +1,38 @@
 error: the `#[proc_macro_derive]` attribute may only be used on bare functions
   --> $DIR/issue-43106-gating-of-proc_macro_derive.rs:10:1
    |
-LL | #[proc_macro_derive = "2500"]
-   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+LL | #[proc_macro_derive()]
+   | ^^^^^^^^^^^^^^^^^^^^^^
 
 error: the `#[proc_macro_derive]` attribute may only be used on bare functions
   --> $DIR/issue-43106-gating-of-proc_macro_derive.rs:18:17
    |
-LL |     mod inner { #![proc_macro_derive="2500"] }
-   |                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+LL |     mod inner { #![proc_macro_derive()] }
+   |                 ^^^^^^^^^^^^^^^^^^^^^^^
 
 error: the `#[proc_macro_derive]` attribute is only usable with crates of the `proc-macro` crate type
   --> $DIR/issue-43106-gating-of-proc_macro_derive.rs:21:5
    |
-LL |     #[proc_macro_derive = "2500"] fn f() { }
-   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+LL |     #[proc_macro_derive()] fn f() { }
+   |     ^^^^^^^^^^^^^^^^^^^^^^
 
 error: the `#[proc_macro_derive]` attribute may only be used on bare functions
   --> $DIR/issue-43106-gating-of-proc_macro_derive.rs:24:5
    |
-LL |     #[proc_macro_derive = "2500"] struct S;
-   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+LL |     #[proc_macro_derive()] struct S;
+   |     ^^^^^^^^^^^^^^^^^^^^^^
 
 error: the `#[proc_macro_derive]` attribute may only be used on bare functions
   --> $DIR/issue-43106-gating-of-proc_macro_derive.rs:27:5
    |
-LL |     #[proc_macro_derive = "2500"] type T = S;
-   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+LL |     #[proc_macro_derive()] type T = S;
+   |     ^^^^^^^^^^^^^^^^^^^^^^
 
 error: the `#[proc_macro_derive]` attribute may only be used on bare functions
   --> $DIR/issue-43106-gating-of-proc_macro_derive.rs:30:5
    |
-LL |     #[proc_macro_derive = "2500"] impl S { }
-   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+LL |     #[proc_macro_derive()] impl S { }
+   |     ^^^^^^^^^^^^^^^^^^^^^^
 
 error: aborting due to 6 previous errors
 
diff --git a/src/test/ui/feature-gate/issue-43106-gating-of-rustc_deprecated.rs b/src/test/ui/feature-gate/issue-43106-gating-of-rustc_deprecated.rs
index b2fd6a7..60873f9 100644
--- a/src/test/ui/feature-gate/issue-43106-gating-of-rustc_deprecated.rs
+++ b/src/test/ui/feature-gate/issue-43106-gating-of-rustc_deprecated.rs
@@ -4,25 +4,25 @@
 // this test incompatible with the "warnings only" nature of
 // issue-43106-gating-of-builtin-attrs.rs
 
-#![rustc_deprecated           = "1500"]
+#![rustc_deprecated()]
 //~^ ERROR stability attributes may not be used outside of the standard library
 
-#[rustc_deprecated = "1500"]
+#[rustc_deprecated()]
 //~^ ERROR stability attributes may not be used outside of the standard library
 mod rustc_deprecated {
-    mod inner { #![rustc_deprecated="1500"] }
+    mod inner { #![rustc_deprecated()] }
     //~^ ERROR stability attributes may not be used outside of the standard library
 
-    #[rustc_deprecated = "1500"] fn f() { }
+    #[rustc_deprecated()] fn f() { }
     //~^ ERROR stability attributes may not be used outside of the standard library
 
-    #[rustc_deprecated = "1500"] struct S;
+    #[rustc_deprecated()] struct S;
     //~^ ERROR stability attributes may not be used outside of the standard library
 
-    #[rustc_deprecated = "1500"] type T = S;
+    #[rustc_deprecated()] type T = S;
     //~^ ERROR stability attributes may not be used outside of the standard library
 
-    #[rustc_deprecated = "1500"] impl S { }
+    #[rustc_deprecated()] impl S { }
     //~^ ERROR stability attributes may not be used outside of the standard library
 }
 
diff --git a/src/test/ui/feature-gate/issue-43106-gating-of-rustc_deprecated.stderr b/src/test/ui/feature-gate/issue-43106-gating-of-rustc_deprecated.stderr
index af056bc1..4eead36 100644
--- a/src/test/ui/feature-gate/issue-43106-gating-of-rustc_deprecated.stderr
+++ b/src/test/ui/feature-gate/issue-43106-gating-of-rustc_deprecated.stderr
@@ -1,44 +1,44 @@
 error: stability attributes may not be used outside of the standard library
   --> $DIR/issue-43106-gating-of-rustc_deprecated.rs:7:1
    |
-LL | #![rustc_deprecated           = "1500"]
-   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+LL | #![rustc_deprecated()]
+   | ^^^^^^^^^^^^^^^^^^^^^^
 
 error: stability attributes may not be used outside of the standard library
   --> $DIR/issue-43106-gating-of-rustc_deprecated.rs:10:1
    |
-LL | #[rustc_deprecated = "1500"]
-   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+LL | #[rustc_deprecated()]
+   | ^^^^^^^^^^^^^^^^^^^^^
 
 error: stability attributes may not be used outside of the standard library
   --> $DIR/issue-43106-gating-of-rustc_deprecated.rs:13:17
    |
-LL |     mod inner { #![rustc_deprecated="1500"] }
-   |                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^
+LL |     mod inner { #![rustc_deprecated()] }
+   |                 ^^^^^^^^^^^^^^^^^^^^^^
 
 error: stability attributes may not be used outside of the standard library
   --> $DIR/issue-43106-gating-of-rustc_deprecated.rs:16:5
    |
-LL |     #[rustc_deprecated = "1500"] fn f() { }
-   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+LL |     #[rustc_deprecated()] fn f() { }
+   |     ^^^^^^^^^^^^^^^^^^^^^
 
 error: stability attributes may not be used outside of the standard library
   --> $DIR/issue-43106-gating-of-rustc_deprecated.rs:19:5
    |
-LL |     #[rustc_deprecated = "1500"] struct S;
-   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+LL |     #[rustc_deprecated()] struct S;
+   |     ^^^^^^^^^^^^^^^^^^^^^
 
 error: stability attributes may not be used outside of the standard library
   --> $DIR/issue-43106-gating-of-rustc_deprecated.rs:22:5
    |
-LL |     #[rustc_deprecated = "1500"] type T = S;
-   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+LL |     #[rustc_deprecated()] type T = S;
+   |     ^^^^^^^^^^^^^^^^^^^^^
 
 error: stability attributes may not be used outside of the standard library
   --> $DIR/issue-43106-gating-of-rustc_deprecated.rs:25:5
    |
-LL |     #[rustc_deprecated = "1500"] impl S { }
-   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+LL |     #[rustc_deprecated()] impl S { }
+   |     ^^^^^^^^^^^^^^^^^^^^^
 
 error: aborting due to 7 previous errors
 
diff --git a/src/test/ui/feature-gate/issue-43106-gating-of-stable.rs b/src/test/ui/feature-gate/issue-43106-gating-of-stable.rs
index 7d9501a..e3ac274 100644
--- a/src/test/ui/feature-gate/issue-43106-gating-of-stable.rs
+++ b/src/test/ui/feature-gate/issue-43106-gating-of-stable.rs
@@ -4,25 +4,25 @@
 // this test incompatible with the "warnings only" nature of
 // issue-43106-gating-of-builtin-attrs.rs
 
-#![stable                     = "1300"]
+#![stable()]
 //~^ ERROR stability attributes may not be used outside of the standard library
 
-#[stable = "1300"]
+#[stable()]
 //~^ ERROR stability attributes may not be used outside of the standard library
 mod stable {
-    mod inner { #![stable="1300"] }
+    mod inner { #![stable()] }
     //~^ ERROR stability attributes may not be used outside of the standard library
 
-    #[stable = "1300"] fn f() { }
+    #[stable()] fn f() { }
     //~^ ERROR stability attributes may not be used outside of the standard library
 
-    #[stable = "1300"] struct S;
+    #[stable()] struct S;
     //~^ ERROR stability attributes may not be used outside of the standard library
 
-    #[stable = "1300"] type T = S;
+    #[stable()] type T = S;
     //~^ ERROR stability attributes may not be used outside of the standard library
 
-    #[stable = "1300"] impl S { }
+    #[stable()] impl S { }
     //~^ ERROR stability attributes may not be used outside of the standard library
 }
 
diff --git a/src/test/ui/feature-gate/issue-43106-gating-of-stable.stderr b/src/test/ui/feature-gate/issue-43106-gating-of-stable.stderr
index 56066e8..03410ea 100644
--- a/src/test/ui/feature-gate/issue-43106-gating-of-stable.stderr
+++ b/src/test/ui/feature-gate/issue-43106-gating-of-stable.stderr
@@ -1,44 +1,44 @@
 error: stability attributes may not be used outside of the standard library
   --> $DIR/issue-43106-gating-of-stable.rs:7:1
    |
-LL | #![stable                     = "1300"]
-   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+LL | #![stable()]
+   | ^^^^^^^^^^^^
 
 error: stability attributes may not be used outside of the standard library
   --> $DIR/issue-43106-gating-of-stable.rs:10:1
    |
-LL | #[stable = "1300"]
-   | ^^^^^^^^^^^^^^^^^^
+LL | #[stable()]
+   | ^^^^^^^^^^^
 
 error: stability attributes may not be used outside of the standard library
   --> $DIR/issue-43106-gating-of-stable.rs:13:17
    |
-LL |     mod inner { #![stable="1300"] }
-   |                 ^^^^^^^^^^^^^^^^^
+LL |     mod inner { #![stable()] }
+   |                 ^^^^^^^^^^^^
 
 error: stability attributes may not be used outside of the standard library
   --> $DIR/issue-43106-gating-of-stable.rs:16:5
    |
-LL |     #[stable = "1300"] fn f() { }
-   |     ^^^^^^^^^^^^^^^^^^
+LL |     #[stable()] fn f() { }
+   |     ^^^^^^^^^^^
 
 error: stability attributes may not be used outside of the standard library
   --> $DIR/issue-43106-gating-of-stable.rs:19:5
    |
-LL |     #[stable = "1300"] struct S;
-   |     ^^^^^^^^^^^^^^^^^^
+LL |     #[stable()] struct S;
+   |     ^^^^^^^^^^^
 
 error: stability attributes may not be used outside of the standard library
   --> $DIR/issue-43106-gating-of-stable.rs:22:5
    |
-LL |     #[stable = "1300"] type T = S;
-   |     ^^^^^^^^^^^^^^^^^^
+LL |     #[stable()] type T = S;
+   |     ^^^^^^^^^^^
 
 error: stability attributes may not be used outside of the standard library
   --> $DIR/issue-43106-gating-of-stable.rs:25:5
    |
-LL |     #[stable = "1300"] impl S { }
-   |     ^^^^^^^^^^^^^^^^^^
+LL |     #[stable()] impl S { }
+   |     ^^^^^^^^^^^
 
 error: aborting due to 7 previous errors
 
diff --git a/src/test/ui/feature-gate/issue-43106-gating-of-unstable.rs b/src/test/ui/feature-gate/issue-43106-gating-of-unstable.rs
index 8be55f0..8d519c3 100644
--- a/src/test/ui/feature-gate/issue-43106-gating-of-unstable.rs
+++ b/src/test/ui/feature-gate/issue-43106-gating-of-unstable.rs
@@ -4,25 +4,25 @@
 // this test incompatible with the "warnings only" nature of
 // issue-43106-gating-of-builtin-attrs.rs
 
-#![unstable                   = "1200"]
+#![unstable()]
 //~^ ERROR stability attributes may not be used outside of the standard library
 
-#[unstable = "1200"]
+#[unstable()]
 //~^ ERROR stability attributes may not be used outside of the standard library
 mod unstable {
-    mod inner { #![unstable="1200"] }
+    mod inner { #![unstable()] }
     //~^ ERROR stability attributes may not be used outside of the standard library
 
-    #[unstable = "1200"] fn f() { }
+    #[unstable()] fn f() { }
     //~^ ERROR stability attributes may not be used outside of the standard library
 
-    #[unstable = "1200"] struct S;
+    #[unstable()] struct S;
     //~^ ERROR stability attributes may not be used outside of the standard library
 
-    #[unstable = "1200"] type T = S;
+    #[unstable()] type T = S;
     //~^ ERROR stability attributes may not be used outside of the standard library
 
-    #[unstable = "1200"] impl S { }
+    #[unstable()] impl S { }
     //~^ ERROR stability attributes may not be used outside of the standard library
 }
 
diff --git a/src/test/ui/feature-gate/issue-43106-gating-of-unstable.stderr b/src/test/ui/feature-gate/issue-43106-gating-of-unstable.stderr
index ee8b9d4..5952b38 100644
--- a/src/test/ui/feature-gate/issue-43106-gating-of-unstable.stderr
+++ b/src/test/ui/feature-gate/issue-43106-gating-of-unstable.stderr
@@ -1,44 +1,44 @@
 error: stability attributes may not be used outside of the standard library
   --> $DIR/issue-43106-gating-of-unstable.rs:7:1
    |
-LL | #![unstable                   = "1200"]
-   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+LL | #![unstable()]
+   | ^^^^^^^^^^^^^^
 
 error: stability attributes may not be used outside of the standard library
   --> $DIR/issue-43106-gating-of-unstable.rs:10:1
    |
-LL | #[unstable = "1200"]
-   | ^^^^^^^^^^^^^^^^^^^^
+LL | #[unstable()]
+   | ^^^^^^^^^^^^^
 
 error: stability attributes may not be used outside of the standard library
   --> $DIR/issue-43106-gating-of-unstable.rs:13:17
    |
-LL |     mod inner { #![unstable="1200"] }
-   |                 ^^^^^^^^^^^^^^^^^^^
+LL |     mod inner { #![unstable()] }
+   |                 ^^^^^^^^^^^^^^
 
 error: stability attributes may not be used outside of the standard library
   --> $DIR/issue-43106-gating-of-unstable.rs:16:5
    |
-LL |     #[unstable = "1200"] fn f() { }
-   |     ^^^^^^^^^^^^^^^^^^^^
+LL |     #[unstable()] fn f() { }
+   |     ^^^^^^^^^^^^^
 
 error: stability attributes may not be used outside of the standard library
   --> $DIR/issue-43106-gating-of-unstable.rs:19:5
    |
-LL |     #[unstable = "1200"] struct S;
-   |     ^^^^^^^^^^^^^^^^^^^^
+LL |     #[unstable()] struct S;
+   |     ^^^^^^^^^^^^^
 
 error: stability attributes may not be used outside of the standard library
   --> $DIR/issue-43106-gating-of-unstable.rs:22:5
    |
-LL |     #[unstable = "1200"] type T = S;
-   |     ^^^^^^^^^^^^^^^^^^^^
+LL |     #[unstable()] type T = S;
+   |     ^^^^^^^^^^^^^
 
 error: stability attributes may not be used outside of the standard library
   --> $DIR/issue-43106-gating-of-unstable.rs:25:5
    |
-LL |     #[unstable = "1200"] impl S { }
-   |     ^^^^^^^^^^^^^^^^^^^^
+LL |     #[unstable()] impl S { }
+   |     ^^^^^^^^^^^^^
 
 error: aborting due to 7 previous errors
 
diff --git a/src/test/ui/feature-gates/feature-gate-extern_in_paths.rs b/src/test/ui/feature-gates/feature-gate-extern_in_paths.rs
deleted file mode 100644
index 2d23d13..0000000
--- a/src/test/ui/feature-gates/feature-gate-extern_in_paths.rs
+++ /dev/null
@@ -1,5 +0,0 @@
-struct S;
-
-fn main() {
-    let _ = extern::std::vec::Vec::new(); //~ ERROR `extern` in paths is experimental
-}
diff --git a/src/test/ui/feature-gates/feature-gate-extern_in_paths.stderr b/src/test/ui/feature-gates/feature-gate-extern_in_paths.stderr
deleted file mode 100644
index 6b5963b..0000000
--- a/src/test/ui/feature-gates/feature-gate-extern_in_paths.stderr
+++ /dev/null
@@ -1,11 +0,0 @@
-error[E0658]: `extern` in paths is experimental (see issue #55600)
-  --> $DIR/feature-gate-extern_in_paths.rs:4:13
-   |
-LL |     let _ = extern::std::vec::Vec::new(); //~ ERROR `extern` in paths is experimental
-   |             ^^^^^^
-   |
-   = help: add #![feature(extern_in_paths)] to the crate attributes to enable
-
-error: aborting due to previous error
-
-For more information about this error, try `rustc --explain E0658`.
diff --git a/src/test/ui/feature-gates/feature-gate-type_alias_enum_variants.rs b/src/test/ui/feature-gates/feature-gate-type_alias_enum_variants.rs
index 8997c18..c7d3304 100644
--- a/src/test/ui/feature-gates/feature-gate-type_alias_enum_variants.rs
+++ b/src/test/ui/feature-gates/feature-gate-type_alias_enum_variants.rs
@@ -1,13 +1,3 @@
-// Copyright 2018 The Rust Project Developers. See the COPYRIGHT
-// file at the top-level directory of this distribution and at
-// http://rust-lang.org/COPYRIGHT.
-//
-// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
-// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
-// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
-// option. This file may not be copied, modified, or distributed
-// except according to those terms.
-
 enum Foo {
     Bar(i32),
     Baz { i: i32 },
diff --git a/src/test/ui/feature-gates/feature-gate-type_alias_enum_variants.stderr b/src/test/ui/feature-gates/feature-gate-type_alias_enum_variants.stderr
index cba643e..43535af 100644
--- a/src/test/ui/feature-gates/feature-gate-type_alias_enum_variants.stderr
+++ b/src/test/ui/feature-gates/feature-gate-type_alias_enum_variants.stderr
@@ -1,5 +1,5 @@
 error: enum variants on type aliases are experimental
-  --> $DIR/feature-gate-type_alias_enum_variants.rs:19:13
+  --> $DIR/feature-gate-type_alias_enum_variants.rs:9:13
    |
 LL |     let t = Alias::Bar(0);
    |             ^^^^^^^^^^
@@ -7,7 +7,7 @@
    = help: add `#![feature(type_alias_enum_variants)]` to the crate attributes to enable
 
 error: enum variants on type aliases are experimental
-  --> $DIR/feature-gate-type_alias_enum_variants.rs:21:13
+  --> $DIR/feature-gate-type_alias_enum_variants.rs:11:13
    |
 LL |     let t = Alias::Baz { i: 0 };
    |             ^^^^^^^^^^
@@ -15,7 +15,7 @@
    = help: add `#![feature(type_alias_enum_variants)]` to the crate attributes to enable
 
 error: enum variants on type aliases are experimental
-  --> $DIR/feature-gate-type_alias_enum_variants.rs:24:9
+  --> $DIR/feature-gate-type_alias_enum_variants.rs:14:9
    |
 LL |         Alias::Bar(_i) => {}
    |         ^^^^^^^^^^^^^^
@@ -23,7 +23,7 @@
    = help: add `#![feature(type_alias_enum_variants)]` to the crate attributes to enable
 
 error: enum variants on type aliases are experimental
-  --> $DIR/feature-gate-type_alias_enum_variants.rs:26:9
+  --> $DIR/feature-gate-type_alias_enum_variants.rs:16:9
    |
 LL |         Alias::Baz { i: _i } => {}
    |         ^^^^^^^^^^
diff --git a/src/test/ui/feature-gates/feature-gate-unwind-attributes.rs b/src/test/ui/feature-gates/feature-gate-unwind-attributes.rs
index 6dda2c5..e0cb9c8 100644
--- a/src/test/ui/feature-gates/feature-gate-unwind-attributes.rs
+++ b/src/test/ui/feature-gates/feature-gate-unwind-attributes.rs
@@ -8,7 +8,7 @@
     fn extern_fn();
 // CHECK-NOT: Function Attrs: nounwind
 // CHECK: declare void @unwinding_extern_fn
-    #[unwind] //~ ERROR #[unwind] is experimental
+    #[unwind(allowed)] //~ ERROR #[unwind] is experimental
     fn unwinding_extern_fn();
 }
 
diff --git a/src/test/ui/feature-gates/feature-gate-unwind-attributes.stderr b/src/test/ui/feature-gates/feature-gate-unwind-attributes.stderr
index e558712..918d40d 100644
--- a/src/test/ui/feature-gates/feature-gate-unwind-attributes.stderr
+++ b/src/test/ui/feature-gates/feature-gate-unwind-attributes.stderr
@@ -1,8 +1,8 @@
 error[E0658]: #[unwind] is experimental
   --> $DIR/feature-gate-unwind-attributes.rs:11:5
    |
-LL |     #[unwind] //~ ERROR #[unwind] is experimental
-   |     ^^^^^^^^^
+LL |     #[unwind(allowed)] //~ ERROR #[unwind] is experimental
+   |     ^^^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(unwind_attributes)] to the crate attributes to enable
 
diff --git a/src/test/ui/fully-qualified-type/fully-qualified-type-name2.stderr b/src/test/ui/fully-qualified-type/fully-qualified-type-name2.stderr
index 9a33d29..47bb5e4 100644
--- a/src/test/ui/fully-qualified-type/fully-qualified-type-name2.stderr
+++ b/src/test/ui/fully-qualified-type/fully-qualified-type-name2.stderr
@@ -1,6 +1,8 @@
 error[E0308]: mismatched types
   --> $DIR/fully-qualified-type-name2.rs:12:12
    |
+LL | fn bar(x: x::Foo) -> y::Foo {
+   |                      ------ expected `y::Foo` because of return type
 LL |     return x;
    |            ^ expected enum `y::Foo`, found enum `x::Foo`
    |
diff --git a/src/test/ui/fully-qualified-type/fully-qualified-type-name4.stderr b/src/test/ui/fully-qualified-type/fully-qualified-type-name4.stderr
index f03aaa6..b341879 100644
--- a/src/test/ui/fully-qualified-type/fully-qualified-type-name4.stderr
+++ b/src/test/ui/fully-qualified-type/fully-qualified-type-name4.stderr
@@ -1,6 +1,8 @@
 error[E0308]: mismatched types
   --> $DIR/fully-qualified-type-name4.rs:6:12
    |
+LL | fn bar(x: usize) -> Option<usize> {
+   |                     ------------- expected `std::option::Option<usize>` because of return type
 LL |     return x;
    |            ^ expected enum `std::option::Option`, found usize
    |
diff --git a/src/test/ui/gated-bad-feature.rs b/src/test/ui/gated-bad-feature.rs
index 0782fe4..fb4cc94 100644
--- a/src/test/ui/gated-bad-feature.rs
+++ b/src/test/ui/gated-bad-feature.rs
@@ -6,8 +6,8 @@
 //~^^^ ERROR: malformed feature
 //~^^^ ERROR: malformed feature
 
-#![feature] //~ ERROR: malformed feature
-#![feature = "foo"] //~ ERROR: malformed feature
+#![feature] //~ ERROR: attribute must be of the form
+#![feature = "foo"] //~ ERROR: attribute must be of the form
 
 #![feature(test_removed_feature)] //~ ERROR: feature has been removed
 
diff --git a/src/test/ui/gated-bad-feature.stderr b/src/test/ui/gated-bad-feature.stderr
index a8c35dd..141c516 100644
--- a/src/test/ui/gated-bad-feature.stderr
+++ b/src/test/ui/gated-bad-feature.stderr
@@ -10,25 +10,25 @@
 LL |     foo = "baz"
    |     ^^^^^^^^^^^
 
-error[E0555]: malformed feature attribute, expected #![feature(...)]
-  --> $DIR/gated-bad-feature.rs:9:1
-   |
-LL | #![feature] //~ ERROR: malformed feature
-   | ^^^^^^^^^^^
-
-error[E0555]: malformed feature attribute, expected #![feature(...)]
-  --> $DIR/gated-bad-feature.rs:10:1
-   |
-LL | #![feature = "foo"] //~ ERROR: malformed feature
-   | ^^^^^^^^^^^^^^^^^^^
-
 error[E0557]: feature has been removed
   --> $DIR/gated-bad-feature.rs:12:12
    |
 LL | #![feature(test_removed_feature)] //~ ERROR: feature has been removed
    |            ^^^^^^^^^^^^^^^^^^^^
 
+error: attribute must be of the form `#[feature(name1, name1, ...)]`
+  --> $DIR/gated-bad-feature.rs:9:1
+   |
+LL | #![feature] //~ ERROR: attribute must be of the form
+   | ^^^^^^^^^^^
+
+error: attribute must be of the form `#[feature(name1, name1, ...)]`
+  --> $DIR/gated-bad-feature.rs:10:1
+   |
+LL | #![feature = "foo"] //~ ERROR: attribute must be of the form
+   | ^^^^^^^^^^^^^^^^^^^
+
 error: aborting due to 5 previous errors
 
-Some errors occurred: E0555, E0556, E0557.
-For more information about an error, try `rustc --explain E0555`.
+Some errors occurred: E0556, E0557.
+For more information about an error, try `rustc --explain E0556`.
diff --git a/src/test/ui/huge-enum.rs b/src/test/ui/huge-enum.rs
index 18ef457..71c8fd5 100644
--- a/src/test/ui/huge-enum.rs
+++ b/src/test/ui/huge-enum.rs
@@ -1,7 +1,5 @@
-// error-pattern: Option
-// normalize-stderr-test "<\[u32; \d+\]>" -> "<[u32; N]>"
-
-// FIXME: work properly with higher limits
+// normalize-stderr-test "std::option::Option<\[u32; \d+\]>" -> "TYPE"
+// normalize-stderr-test "\[u32; \d+\]" -> "TYPE"
 
 #[cfg(target_pointer_width = "32")]
 fn main() {
diff --git a/src/test/ui/huge-enum.stderr b/src/test/ui/huge-enum.stderr
index b7cf255..67cae3d 100644
--- a/src/test/ui/huge-enum.stderr
+++ b/src/test/ui/huge-enum.stderr
@@ -1,4 +1,4 @@
-error: the type `std::option::Option<[u32; N]>` is too big for the current architecture
+error: the type `TYPE` is too big for the current architecture
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/imports/issue-57539.rs b/src/test/ui/imports/issue-57539.rs
new file mode 100644
index 0000000..90b74eb
--- /dev/null
+++ b/src/test/ui/imports/issue-57539.rs
@@ -0,0 +1,8 @@
+// edition:2018
+
+mod core {
+    use core; //~ ERROR `core` is ambiguous
+    use crate::*;
+}
+
+fn main() {}
diff --git a/src/test/ui/imports/issue-57539.stderr b/src/test/ui/imports/issue-57539.stderr
new file mode 100644
index 0000000..3f745fd
--- /dev/null
+++ b/src/test/ui/imports/issue-57539.stderr
@@ -0,0 +1,18 @@
+error[E0659]: `core` is ambiguous (name vs any other name during import resolution)
+  --> $DIR/issue-57539.rs:4:9
+   |
+LL |     use core; //~ ERROR `core` is ambiguous
+   |         ^^^^ ambiguous name
+   |
+   = note: `core` could refer to a built-in extern crate
+   = help: use `::core` to refer to this extern crate unambiguously
+note: `core` could also refer to the module imported here
+  --> $DIR/issue-57539.rs:5:9
+   |
+LL |     use crate::*;
+   |         ^^^^^^^^
+   = help: use `self::core` to refer to this module unambiguously
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0659`.
diff --git a/src/test/ui/intrinsic-invalid-number-of-arguments.rs b/src/test/ui/intrinsic-invalid-number-of-arguments.rs
deleted file mode 100644
index 7823e7d..0000000
--- a/src/test/ui/intrinsic-invalid-number-of-arguments.rs
+++ /dev/null
@@ -1,15 +0,0 @@
-// Test number of arguments in platform-specific intrinsic function
-// This is the error E0444
-
-#![feature(repr_simd, platform_intrinsics)]
-#![allow(non_camel_case_types)]
-
-#[repr(simd)]
-struct f64x2(f64, f64);
-
-extern "platform-intrinsic" {
-    fn x86_mm_movemask_pd(x: f64x2, y: f64x2, z: f64x2) -> i32; //~ platform-specific intrinsic
-}
-
-pub fn main() {
-}
diff --git a/src/test/ui/intrinsic-invalid-number-of-arguments.stderr b/src/test/ui/intrinsic-invalid-number-of-arguments.stderr
deleted file mode 100644
index e2874d5..0000000
--- a/src/test/ui/intrinsic-invalid-number-of-arguments.stderr
+++ /dev/null
@@ -1,9 +0,0 @@
-error[E0444]: platform-specific intrinsic has invalid number of arguments: found 3, expected 1
-  --> $DIR/intrinsic-invalid-number-of-arguments.rs:11:5
-   |
-LL |     fn x86_mm_movemask_pd(x: f64x2, y: f64x2, z: f64x2) -> i32; //~ platform-specific intrinsic
-   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-error: aborting due to previous error
-
-For more information about this error, try `rustc --explain E0444`.
diff --git a/src/test/ui/invalid_crate_type_syntax.rs b/src/test/ui/invalid_crate_type_syntax.rs
index eae4fad..8157ccd 100644
--- a/src/test/ui/invalid_crate_type_syntax.rs
+++ b/src/test/ui/invalid_crate_type_syntax.rs
@@ -1,5 +1,5 @@
 // regression test for issue 16974
-#![crate_type(lib)]  //~ ERROR `crate_type` requires a value
+#![crate_type(lib)]  //~ ERROR attribute must be of the form
 
 fn my_lib_fn() {}
 
diff --git a/src/test/ui/invalid_crate_type_syntax.stderr b/src/test/ui/invalid_crate_type_syntax.stderr
index 8494f71..8d6948b 100644
--- a/src/test/ui/invalid_crate_type_syntax.stderr
+++ b/src/test/ui/invalid_crate_type_syntax.stderr
@@ -1,10 +1,8 @@
-error: `crate_type` requires a value
+error: attribute must be of the form `#[crate_type = "bin|lib|..."]`
   --> $DIR/invalid_crate_type_syntax.rs:2:1
    |
-LL | #![crate_type(lib)]  //~ ERROR `crate_type` requires a value
+LL | #![crate_type(lib)]  //~ ERROR attribute must be of the form
    | ^^^^^^^^^^^^^^^^^^^
-   |
-   = note: for example: `#![crate_type="lib"]`
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/issue-53787-inline-assembler-macro.rs b/src/test/ui/issue-53787-inline-assembler-macro.rs
new file mode 100644
index 0000000..937bce1
--- /dev/null
+++ b/src/test/ui/issue-53787-inline-assembler-macro.rs
@@ -0,0 +1,23 @@
+// Regression test for Issue #53787: Fix ICE when creating a label in inline assembler with macros.
+
+#![feature(asm)]
+
+macro_rules! fake_jump {
+    ($id:expr) => {
+        unsafe {
+            asm!(
+            "
+            jmp $0
+            lea eax, [ebx]
+            xor eax, 0xDEADBEEF
+            retn
+            $0:
+            "::"0"($id)::"volatile", "intel");
+        }
+    };
+}
+
+fn main() {
+    fake_jump!("FirstFunc"); //~ ERROR invalid value for constraint in inline assembly
+    println!("Hello, world!");
+}
diff --git a/src/test/ui/issue-53787-inline-assembler-macro.stderr b/src/test/ui/issue-53787-inline-assembler-macro.stderr
new file mode 100644
index 0000000..69f380b
--- /dev/null
+++ b/src/test/ui/issue-53787-inline-assembler-macro.stderr
@@ -0,0 +1,9 @@
+error[E0669]: invalid value for constraint in inline assembly
+  --> $DIR/issue-53787-inline-assembler-macro.rs:21:16
+   |
+LL |     fake_jump!("FirstFunc"); //~ ERROR invalid value for constraint in inline assembly
+   |                ^^^^^^^^^^^
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0669`.
diff --git a/src/test/ui/issues/issue-20413.stderr b/src/test/ui/issues/issue-20413.stderr
index 20e5758..1c353fe 100644
--- a/src/test/ui/issues/issue-20413.stderr
+++ b/src/test/ui/issues/issue-20413.stderr
@@ -6,7 +6,7 @@
    |
    = help: consider removing `T` or using a marker such as `std::marker::PhantomData`
 
-error[E0275]: overflow evaluating the requirement `NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<T>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>: std::marker::Sized`
+error[E0275]: overflow evaluating the requirement `NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<T>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>: Foo`
   --> $DIR/issue-20413.rs:8:1
    |
 LL | / impl<T> Foo for T where NoData<T>: Foo {
@@ -18,7 +18,6 @@
    | |_^
    |
    = help: consider adding a `#![recursion_limit="128"]` attribute to your crate
-   = note: required because of the requirements on the impl of `Foo` for `NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<T>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>`
    = note: required because of the requirements on the impl of `Foo` for `NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<T>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>`
    = note: required because of the requirements on the impl of `Foo` for `NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<T>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>`
    = note: required because of the requirements on the impl of `Foo` for `NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<T>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>`
diff --git a/src/test/ui/issues/issue-43988.rs b/src/test/ui/issues/issue-43988.rs
index b2a2035..74667d7 100644
--- a/src/test/ui/issues/issue-43988.rs
+++ b/src/test/ui/issues/issue-43988.rs
@@ -24,8 +24,7 @@
     #[repr]
     let _y = "123";
     //~^^ ERROR attribute should not be applied to a statement
-    //~| WARN `repr` attribute must have a hint
-
+    //~| ERROR attribute must be of the form
 
     fn foo() {}
 
@@ -35,5 +34,5 @@
 
     let _z = #[repr] 1;
     //~^ ERROR attribute should not be applied to an expression
-    //~| WARN `repr` attribute must have a hint
+    //~| ERROR attribute must be of the form
 }
diff --git a/src/test/ui/issues/issue-43988.stderr b/src/test/ui/issues/issue-43988.stderr
index 811816d..6fe41a3 100644
--- a/src/test/ui/issues/issue-43988.stderr
+++ b/src/test/ui/issues/issue-43988.stderr
@@ -1,21 +1,14 @@
-warning: `repr` attribute must have a hint
+error: attribute must be of the form `#[repr(C, packed, ...)]`
   --> $DIR/issue-43988.rs:24:5
    |
 LL |     #[repr]
-   |     ^^^^^^^ needs a hint
-   |
-   = note: #[warn(bad_repr)] on by default
-   = help: valid hints include `#[repr(C)]`, `#[repr(packed)]`, `#[repr(rust)]` and `#[repr(transparent)]`
-   = note: for more information, visit <https://doc.rust-lang.org/reference/type-layout.html>
+   |     ^^^^^^^
 
-warning: `repr` attribute must have a hint
-  --> $DIR/issue-43988.rs:36:14
+error: attribute must be of the form `#[repr(C, packed, ...)]`
+  --> $DIR/issue-43988.rs:35:14
    |
 LL |     let _z = #[repr] 1;
-   |              ^^^^^^^ needs a hint
-   |
-   = help: valid hints include `#[repr(C)]`, `#[repr(packed)]`, `#[repr(rust)]` and `#[repr(transparent)]`
-   = note: for more information, visit <https://doc.rust-lang.org/reference/type-layout.html>
+   |              ^^^^^^^
 
 error[E0518]: attribute should be applied to function or closure
   --> $DIR/issue-43988.rs:5:5
@@ -60,7 +53,7 @@
    |     --------------- not a struct, enum or union
 
 error[E0518]: attribute should be applied to function or closure
-  --> $DIR/issue-43988.rs:32:5
+  --> $DIR/issue-43988.rs:31:5
    |
 LL |     #[inline(ABC)]
    |     ^^^^^^^^^^^^^^
@@ -68,12 +61,12 @@
    |     ----- not a function or closure
 
 error[E0517]: attribute should not be applied to an expression
-  --> $DIR/issue-43988.rs:36:14
+  --> $DIR/issue-43988.rs:35:14
    |
 LL |     let _z = #[repr] 1;
    |              ^^^^^^^ - not defining a struct, enum or union
 
-error: aborting due to 7 previous errors
+error: aborting due to 9 previous errors
 
 Some errors occurred: E0517, E0518.
 For more information about an error, try `rustc --explain E0517`.
diff --git a/src/test/ui/issues/issue-46186.rs b/src/test/ui/issues/issue-46186.rs
index de7d13a..9dfd61f 100644
--- a/src/test/ui/issues/issue-46186.rs
+++ b/src/test/ui/issues/issue-46186.rs
@@ -1,5 +1,6 @@
 struct Struct {
     a: usize,
-}; //~ ERROR expected item, found `;`
+};
+//~^ ERROR expected item, found `;`
 
 fn main() {}
diff --git a/src/test/ui/issues/issue-46186.stderr b/src/test/ui/issues/issue-46186.stderr
index 11a1fc0..eb0dbb8 100644
--- a/src/test/ui/issues/issue-46186.stderr
+++ b/src/test/ui/issues/issue-46186.stderr
@@ -1,8 +1,8 @@
 error: expected item, found `;`
   --> $DIR/issue-46186.rs:3:2
    |
-LL | }; //~ ERROR expected item, found `;`
-   |  ^ help: consider removing this semicolon
+LL | };
+   |  ^ help: remove this semicolon
    |
    = help: braced struct declarations are not followed by a semicolon
 
diff --git a/src/test/ui/issues/issue-49040.rs b/src/test/ui/issues/issue-49040.rs
index 7c8d3d0..a5f05d2 100644
--- a/src/test/ui/issues/issue-49040.rs
+++ b/src/test/ui/issues/issue-49040.rs
@@ -1,2 +1,2 @@
 #![allow(unused_variables)]; //~ ERROR expected item, found `;`
-fn main() {}
+fn foo() {}
diff --git a/src/test/ui/issues/issue-49040.stderr b/src/test/ui/issues/issue-49040.stderr
index eec88f0..12e78e2 100644
--- a/src/test/ui/issues/issue-49040.stderr
+++ b/src/test/ui/issues/issue-49040.stderr
@@ -2,7 +2,12 @@
   --> $DIR/issue-49040.rs:1:28
    |
 LL | #![allow(unused_variables)]; //~ ERROR expected item, found `;`
-   |                            ^ help: consider removing this semicolon
+   |                            ^ help: remove this semicolon
 
-error: aborting due to previous error
+error[E0601]: `main` function not found in crate `issue_49040`
+   |
+   = note: consider adding a `main` function to `$DIR/issue-49040.rs`
 
+error: aborting due to 2 previous errors
+
+For more information about this error, try `rustc --explain E0601`.
diff --git a/src/test/ui/issues/issue-5067.rs b/src/test/ui/issues/issue-5067.rs
index 526a683..616fd09 100644
--- a/src/test/ui/issues/issue-5067.rs
+++ b/src/test/ui/issues/issue-5067.rs
@@ -1,37 +1,59 @@
 #![allow(unused_macros)]
 
+// Tests that repetition matchers cannot match the empty token tree (since that would be
+// ambiguous).
+
+// edition:2018
+
 macro_rules! foo {
     ( $()* ) => {};
     //~^ ERROR repetition matches empty token tree
     ( $()+ ) => {};
     //~^ ERROR repetition matches empty token tree
-
+    ( $()? ) => {};
+    //~^ ERROR repetition matches empty token tree
     ( $(),* ) => {}; // PASS
     ( $(),+ ) => {}; // PASS
-
+    // `?` cannot have a separator...
     ( [$()*] ) => {};
     //~^ ERROR repetition matches empty token tree
     ( [$()+] ) => {};
     //~^ ERROR repetition matches empty token tree
-
+    ( [$()?] ) => {};
+    //~^ ERROR repetition matches empty token tree
     ( [$(),*] ) => {}; // PASS
     ( [$(),+] ) => {}; // PASS
-
+    // `?` cannot have a separator...
     ( $($()* $(),* $(a)* $(a),* )* ) => {};
     //~^ ERROR repetition matches empty token tree
     ( $($()* $(),* $(a)* $(a),* )+ ) => {};
     //~^ ERROR repetition matches empty token tree
-
+    ( $($()* $(),* $(a)* $(a),* )? ) => {};
+    //~^ ERROR repetition matches empty token tree
+    ( $($()? $(),* $(a)? $(a),* )* ) => {};
+    //~^ ERROR repetition matches empty token tree
+    ( $($()? $(),* $(a)? $(a),* )+ ) => {};
+    //~^ ERROR repetition matches empty token tree
+    ( $($()? $(),* $(a)? $(a),* )? ) => {};
+    //~^ ERROR repetition matches empty token tree
     ( $(a     $(),* $(a)* $(a),* )* ) => {}; // PASS
     ( $($(a)+ $(),* $(a)* $(a),* )+ ) => {}; // PASS
+    ( $($(a)+ $(),* $(a)* $(a),* )? ) => {}; // PASS
+
+    ( $(a     $(),* $(a)? $(a),* )* ) => {}; // PASS
+    ( $($(a)+ $(),* $(a)? $(a),* )+ ) => {}; // PASS
+    ( $($(a)+ $(),* $(a)? $(a),* )? ) => {}; // PASS
 
     ( $(a $()+)* ) => {};
     //~^ ERROR repetition matches empty token tree
     ( $(a $()*)+ ) => {};
     //~^ ERROR repetition matches empty token tree
+    ( $(a $()+)? ) => {};
+    //~^ ERROR repetition matches empty token tree
+    ( $(a $()?)+ ) => {};
+    //~^ ERROR repetition matches empty token tree
 }
 
-
 // --- Original Issue --- //
 
 macro_rules! make_vec {
@@ -43,11 +65,10 @@
     let _ = make_vec![a 1, a 2, a 3];
 }
 
-
 // --- Minified Issue --- //
 
 macro_rules! m {
-    ( $()* ) => {}
+    ( $()* ) => {};
     //~^ ERROR repetition matches empty token tree
 }
 
diff --git a/src/test/ui/issues/issue-5067.stderr b/src/test/ui/issues/issue-5067.stderr
index 433b7c8..7ffc607 100644
--- a/src/test/ui/issues/issue-5067.stderr
+++ b/src/test/ui/issues/issue-5067.stderr
@@ -1,62 +1,110 @@
 error: repetition matches empty token tree
-  --> $DIR/issue-5067.rs:4:8
+  --> $DIR/issue-5067.rs:9:8
    |
 LL |     ( $()* ) => {};
    |        ^^
 
 error: repetition matches empty token tree
-  --> $DIR/issue-5067.rs:6:8
+  --> $DIR/issue-5067.rs:11:8
    |
 LL |     ( $()+ ) => {};
    |        ^^
 
 error: repetition matches empty token tree
-  --> $DIR/issue-5067.rs:12:9
+  --> $DIR/issue-5067.rs:13:8
+   |
+LL |     ( $()? ) => {};
+   |        ^^
+
+error: repetition matches empty token tree
+  --> $DIR/issue-5067.rs:18:9
    |
 LL |     ( [$()*] ) => {};
    |         ^^
 
 error: repetition matches empty token tree
-  --> $DIR/issue-5067.rs:14:9
+  --> $DIR/issue-5067.rs:20:9
    |
 LL |     ( [$()+] ) => {};
    |         ^^
 
 error: repetition matches empty token tree
-  --> $DIR/issue-5067.rs:20:8
+  --> $DIR/issue-5067.rs:22:9
+   |
+LL |     ( [$()?] ) => {};
+   |         ^^
+
+error: repetition matches empty token tree
+  --> $DIR/issue-5067.rs:27:8
    |
 LL |     ( $($()* $(),* $(a)* $(a),* )* ) => {};
    |        ^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 error: repetition matches empty token tree
-  --> $DIR/issue-5067.rs:22:8
+  --> $DIR/issue-5067.rs:29:8
    |
 LL |     ( $($()* $(),* $(a)* $(a),* )+ ) => {};
    |        ^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 error: repetition matches empty token tree
-  --> $DIR/issue-5067.rs:28:12
+  --> $DIR/issue-5067.rs:31:8
+   |
+LL |     ( $($()* $(),* $(a)* $(a),* )? ) => {};
+   |        ^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+error: repetition matches empty token tree
+  --> $DIR/issue-5067.rs:33:8
+   |
+LL |     ( $($()? $(),* $(a)? $(a),* )* ) => {};
+   |        ^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+error: repetition matches empty token tree
+  --> $DIR/issue-5067.rs:35:8
+   |
+LL |     ( $($()? $(),* $(a)? $(a),* )+ ) => {};
+   |        ^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+error: repetition matches empty token tree
+  --> $DIR/issue-5067.rs:37:8
+   |
+LL |     ( $($()? $(),* $(a)? $(a),* )? ) => {};
+   |        ^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+error: repetition matches empty token tree
+  --> $DIR/issue-5067.rs:47:12
    |
 LL |     ( $(a $()+)* ) => {};
    |            ^^
 
 error: repetition matches empty token tree
-  --> $DIR/issue-5067.rs:30:12
+  --> $DIR/issue-5067.rs:49:12
    |
 LL |     ( $(a $()*)+ ) => {};
    |            ^^
 
 error: repetition matches empty token tree
-  --> $DIR/issue-5067.rs:38:18
+  --> $DIR/issue-5067.rs:51:12
+   |
+LL |     ( $(a $()+)? ) => {};
+   |            ^^
+
+error: repetition matches empty token tree
+  --> $DIR/issue-5067.rs:53:12
+   |
+LL |     ( $(a $()?)+ ) => {};
+   |            ^^
+
+error: repetition matches empty token tree
+  --> $DIR/issue-5067.rs:60:18
    |
 LL |     (a $e1:expr $($(, a $e2:expr)*)*) => ([$e1 $($(, $e2)*)*]);
    |                  ^^^^^^^^^^^^^^^^^^
 
 error: repetition matches empty token tree
-  --> $DIR/issue-5067.rs:50:8
+  --> $DIR/issue-5067.rs:71:8
    |
-LL |     ( $()* ) => {}
+LL |     ( $()* ) => {};
    |        ^^
 
-error: aborting due to 10 previous errors
+error: aborting due to 18 previous errors
 
diff --git a/src/test/ui/issues/issue-56488.rs b/src/test/ui/issues/issue-56488.rs
new file mode 100644
index 0000000..e2f3996
--- /dev/null
+++ b/src/test/ui/issues/issue-56488.rs
@@ -0,0 +1,13 @@
+// run-pass
+
+#![feature(trait_alias)]
+
+mod alpha {
+    pub trait A {}
+    pub trait C = A;
+}
+
+#[allow(unused_imports)]
+use alpha::C;
+
+fn main() {}
diff --git a/src/test/ui/issues/issue-57597.rs b/src/test/ui/issues/issue-57597.rs
new file mode 100644
index 0000000..ebeb3fe
--- /dev/null
+++ b/src/test/ui/issues/issue-57597.rs
@@ -0,0 +1,80 @@
+// Regression test for #57597.
+//
+// Make sure that nested matchers work correctly rather than causing an infinite loop or crash.
+
+// edition:2018
+
+macro_rules! foo1 {
+    ($($($i:ident)?)+) => {};
+    //~^ ERROR repetition matches empty token tree
+}
+
+macro_rules! foo2 {
+    ($($($i:ident)?)*) => {};
+    //~^ ERROR repetition matches empty token tree
+}
+
+macro_rules! foo3 {
+    ($($($i:ident)?)?) => {};
+    //~^ ERROR repetition matches empty token tree
+}
+
+macro_rules! foo4 {
+    ($($($($i:ident)?)?)?) => {};
+    //~^ ERROR repetition matches empty token tree
+}
+
+macro_rules! foo5 {
+    ($($($($i:ident)*)?)?) => {};
+    //~^ ERROR repetition matches empty token tree
+}
+
+macro_rules! foo6 {
+    ($($($($i:ident)?)*)?) => {};
+    //~^ ERROR repetition matches empty token tree
+}
+
+macro_rules! foo7 {
+    ($($($($i:ident)?)?)*) => {};
+    //~^ ERROR repetition matches empty token tree
+}
+
+macro_rules! foo8 {
+    ($($($($i:ident)*)*)?) => {};
+    //~^ ERROR repetition matches empty token tree
+}
+
+macro_rules! foo9 {
+    ($($($($i:ident)?)*)*) => {};
+    //~^ ERROR repetition matches empty token tree
+}
+
+macro_rules! foo10 {
+    ($($($($i:ident)?)*)+) => {};
+    //~^ ERROR repetition matches empty token tree
+}
+
+macro_rules! foo11 {
+    ($($($($i:ident)+)?)*) => {};
+    //~^ ERROR repetition matches empty token tree
+}
+
+macro_rules! foo12 {
+    ($($($($i:ident)+)*)?) => {};
+    //~^ ERROR repetition matches empty token tree
+}
+
+fn main() {
+    foo1!();
+    foo2!();
+    foo3!();
+    foo4!();
+    foo5!();
+    foo6!();
+    foo7!();
+    foo8!();
+    foo9!();
+    foo10!();
+    foo11!();
+    foo12!();
+}
diff --git a/src/test/ui/issues/issue-57597.stderr b/src/test/ui/issues/issue-57597.stderr
new file mode 100644
index 0000000..0a02ac8
--- /dev/null
+++ b/src/test/ui/issues/issue-57597.stderr
@@ -0,0 +1,74 @@
+error: repetition matches empty token tree
+  --> $DIR/issue-57597.rs:8:7
+   |
+LL |     ($($($i:ident)?)+) => {};
+   |       ^^^^^^^^^^^^^^
+
+error: repetition matches empty token tree
+  --> $DIR/issue-57597.rs:13:7
+   |
+LL |     ($($($i:ident)?)*) => {};
+   |       ^^^^^^^^^^^^^^
+
+error: repetition matches empty token tree
+  --> $DIR/issue-57597.rs:18:7
+   |
+LL |     ($($($i:ident)?)?) => {};
+   |       ^^^^^^^^^^^^^^
+
+error: repetition matches empty token tree
+  --> $DIR/issue-57597.rs:23:7
+   |
+LL |     ($($($($i:ident)?)?)?) => {};
+   |       ^^^^^^^^^^^^^^^^^^
+
+error: repetition matches empty token tree
+  --> $DIR/issue-57597.rs:28:7
+   |
+LL |     ($($($($i:ident)*)?)?) => {};
+   |       ^^^^^^^^^^^^^^^^^^
+
+error: repetition matches empty token tree
+  --> $DIR/issue-57597.rs:33:7
+   |
+LL |     ($($($($i:ident)?)*)?) => {};
+   |       ^^^^^^^^^^^^^^^^^^
+
+error: repetition matches empty token tree
+  --> $DIR/issue-57597.rs:38:7
+   |
+LL |     ($($($($i:ident)?)?)*) => {};
+   |       ^^^^^^^^^^^^^^^^^^
+
+error: repetition matches empty token tree
+  --> $DIR/issue-57597.rs:43:7
+   |
+LL |     ($($($($i:ident)*)*)?) => {};
+   |       ^^^^^^^^^^^^^^^^^^
+
+error: repetition matches empty token tree
+  --> $DIR/issue-57597.rs:48:7
+   |
+LL |     ($($($($i:ident)?)*)*) => {};
+   |       ^^^^^^^^^^^^^^^^^^
+
+error: repetition matches empty token tree
+  --> $DIR/issue-57597.rs:53:7
+   |
+LL |     ($($($($i:ident)?)*)+) => {};
+   |       ^^^^^^^^^^^^^^^^^^
+
+error: repetition matches empty token tree
+  --> $DIR/issue-57597.rs:58:7
+   |
+LL |     ($($($($i:ident)+)?)*) => {};
+   |       ^^^^^^^^^^^^^^^^^^
+
+error: repetition matches empty token tree
+  --> $DIR/issue-57597.rs:63:7
+   |
+LL |     ($($($($i:ident)+)*)?) => {};
+   |       ^^^^^^^^^^^^^^^^^^
+
+error: aborting due to 12 previous errors
+
diff --git a/src/test/ui/keyword/extern/keyword-extern-as-identifier-expr.rs b/src/test/ui/keyword/extern/keyword-extern-as-identifier-expr.rs
new file mode 100644
index 0000000..b738eb4
--- /dev/null
+++ b/src/test/ui/keyword/extern/keyword-extern-as-identifier-expr.rs
@@ -0,0 +1,3 @@
+fn main() {
+    let s = extern::foo::Bar; //~ ERROR expected expression, found keyword `extern`
+}
diff --git a/src/test/ui/keyword/extern/keyword-extern-as-identifier-expr.stderr b/src/test/ui/keyword/extern/keyword-extern-as-identifier-expr.stderr
new file mode 100644
index 0000000..150fc88
--- /dev/null
+++ b/src/test/ui/keyword/extern/keyword-extern-as-identifier-expr.stderr
@@ -0,0 +1,8 @@
+error: expected expression, found keyword `extern`
+  --> $DIR/keyword-extern-as-identifier-expr.rs:2:13
+   |
+LL |     let s = extern::foo::Bar; //~ ERROR expected expression, found keyword `extern`
+   |             ^^^^^^ expected expression
+
+error: aborting due to previous error
+
diff --git a/src/test/ui/keyword/extern/keyword-extern-as-identifier-pat.rs b/src/test/ui/keyword/extern/keyword-extern-as-identifier-pat.rs
new file mode 100644
index 0000000..f9b6bad
--- /dev/null
+++ b/src/test/ui/keyword/extern/keyword-extern-as-identifier-pat.rs
@@ -0,0 +1,3 @@
+fn main() {
+    let extern = 0; //~ ERROR expected pattern, found keyword `extern`
+}
diff --git a/src/test/ui/keyword/extern/keyword-extern-as-identifier-pat.stderr b/src/test/ui/keyword/extern/keyword-extern-as-identifier-pat.stderr
new file mode 100644
index 0000000..426b4ee
--- /dev/null
+++ b/src/test/ui/keyword/extern/keyword-extern-as-identifier-pat.stderr
@@ -0,0 +1,8 @@
+error: expected pattern, found keyword `extern`
+  --> $DIR/keyword-extern-as-identifier-pat.rs:2:9
+   |
+LL |     let extern = 0; //~ ERROR expected pattern, found keyword `extern`
+   |         ^^^^^^ expected pattern
+
+error: aborting due to previous error
+
diff --git a/src/test/ui/keyword/extern/keyword-extern-as-identifier-type.rs b/src/test/ui/keyword/extern/keyword-extern-as-identifier-type.rs
new file mode 100644
index 0000000..3845a9a
--- /dev/null
+++ b/src/test/ui/keyword/extern/keyword-extern-as-identifier-type.rs
@@ -0,0 +1,3 @@
+type A = extern::foo::bar; //~ ERROR expected `fn`, found `::`
+
+fn main() {}
diff --git a/src/test/ui/keyword/extern/keyword-extern-as-identifier-type.stderr b/src/test/ui/keyword/extern/keyword-extern-as-identifier-type.stderr
new file mode 100644
index 0000000..97b641f
--- /dev/null
+++ b/src/test/ui/keyword/extern/keyword-extern-as-identifier-type.stderr
@@ -0,0 +1,8 @@
+error: expected `fn`, found `::`
+  --> $DIR/keyword-extern-as-identifier-type.rs:1:16
+   |
+LL | type A = extern::foo::bar; //~ ERROR expected `fn`, found `::`
+   |                ^^ expected `fn` here
+
+error: aborting due to previous error
+
diff --git a/src/test/ui/keyword/extern/keyword-extern-as-identifier-use.rs b/src/test/ui/keyword/extern/keyword-extern-as-identifier-use.rs
new file mode 100644
index 0000000..b07de3e
--- /dev/null
+++ b/src/test/ui/keyword/extern/keyword-extern-as-identifier-use.rs
@@ -0,0 +1,3 @@
+use extern::foo; //~ ERROR expected identifier, found keyword `extern`
+
+fn main() {}
diff --git a/src/test/ui/keyword/extern/keyword-extern-as-identifier-use.stderr b/src/test/ui/keyword/extern/keyword-extern-as-identifier-use.stderr
new file mode 100644
index 0000000..31b575a
--- /dev/null
+++ b/src/test/ui/keyword/extern/keyword-extern-as-identifier-use.stderr
@@ -0,0 +1,12 @@
+error: expected identifier, found keyword `extern`
+  --> $DIR/keyword-extern-as-identifier-use.rs:1:5
+   |
+LL | use extern::foo; //~ ERROR expected identifier, found keyword `extern`
+   |     ^^^^^^ expected identifier, found keyword
+help: you can escape reserved keywords to use them as identifiers
+   |
+LL | use r#extern::foo; //~ ERROR expected identifier, found keyword `extern`
+   |     ^^^^^^^^
+
+error: aborting due to previous error
+
diff --git a/src/test/ui/keyword/keyword-extern-as-identifier.rs b/src/test/ui/keyword/keyword-extern-as-identifier.rs
deleted file mode 100644
index 6775290..0000000
--- a/src/test/ui/keyword/keyword-extern-as-identifier.rs
+++ /dev/null
@@ -1,5 +0,0 @@
-#![feature(extern_in_paths)]
-
-fn main() {
-    let extern = 0; //~ ERROR cannot find unit struct/variant or constant `extern` in this scope
-}
diff --git a/src/test/ui/keyword/keyword-extern-as-identifier.stderr b/src/test/ui/keyword/keyword-extern-as-identifier.stderr
deleted file mode 100644
index ef2a4b3..0000000
--- a/src/test/ui/keyword/keyword-extern-as-identifier.stderr
+++ /dev/null
@@ -1,9 +0,0 @@
-error[E0531]: cannot find unit struct/variant or constant `extern` in this scope
-  --> $DIR/keyword-extern-as-identifier.rs:4:9
-   |
-LL |     let extern = 0; //~ ERROR cannot find unit struct/variant or constant `extern` in this scope
-   |         ^^^^^^ not found in this scope
-
-error: aborting due to previous error
-
-For more information about this error, try `rustc --explain E0531`.
diff --git a/src/test/ui/lifetime-before-type-params.rs b/src/test/ui/lifetime-before-type-params.rs
new file mode 100644
index 0000000..9b905d4
--- /dev/null
+++ b/src/test/ui/lifetime-before-type-params.rs
@@ -0,0 +1,9 @@
+#![allow(unused)]
+fn first<T, 'a, 'b>() {}
+//~^ ERROR lifetime parameters must be declared prior to type parameters
+fn second<'a, T, 'b>() {}
+//~^ ERROR lifetime parameters must be declared prior to type parameters
+fn third<T, U, 'a>() {}
+//~^ ERROR lifetime parameters must be declared prior to type parameters
+fn fourth<'a, T, 'b, U, 'c, V>() {}
+//~^ ERROR lifetime parameters must be declared prior to type parameters
diff --git a/src/test/ui/lifetime-before-type-params.stderr b/src/test/ui/lifetime-before-type-params.stderr
new file mode 100644
index 0000000..7ac8dff
--- /dev/null
+++ b/src/test/ui/lifetime-before-type-params.stderr
@@ -0,0 +1,47 @@
+error: lifetime parameters must be declared prior to type parameters
+  --> $DIR/lifetime-before-type-params.rs:2:13
+   |
+LL | fn first<T, 'a, 'b>() {}
+   |             ^^  ^^
+help: move the lifetime parameter prior to the first type parameter
+   |
+LL | fn first<'a, 'b, T>() {}
+   |          ^^^ ^^^ --
+
+error: lifetime parameters must be declared prior to type parameters
+  --> $DIR/lifetime-before-type-params.rs:4:18
+   |
+LL | fn second<'a, T, 'b>() {}
+   |                  ^^
+help: move the lifetime parameter prior to the first type parameter
+   |
+LL | fn second<'a, 'b, T>() {}
+   |               ^^^ --
+
+error: lifetime parameters must be declared prior to type parameters
+  --> $DIR/lifetime-before-type-params.rs:6:16
+   |
+LL | fn third<T, U, 'a>() {}
+   |                ^^
+help: move the lifetime parameter prior to the first type parameter
+   |
+LL | fn third<'a, T, U>() {}
+   |          ^^^    --
+
+error: lifetime parameters must be declared prior to type parameters
+  --> $DIR/lifetime-before-type-params.rs:8:18
+   |
+LL | fn fourth<'a, T, 'b, U, 'c, V>() {}
+   |                  ^^     ^^
+help: move the lifetime parameter prior to the first type parameter
+   |
+LL | fn fourth<'a, 'b, 'c, T, U, V>() {}
+   |               ^^^ ^^^ -- --
+
+error[E0601]: `main` function not found in crate `lifetime_before_type_params`
+   |
+   = note: consider adding a `main` function to `$DIR/lifetime-before-type-params.rs`
+
+error: aborting due to 5 previous errors
+
+For more information about this error, try `rustc --explain E0601`.
diff --git a/src/test/ui/lint/lint-forbid-internal-unsafe.rs b/src/test/ui/lint/lint-forbid-internal-unsafe.rs
new file mode 100644
index 0000000..b08fbf6
--- /dev/null
+++ b/src/test/ui/lint/lint-forbid-internal-unsafe.rs
@@ -0,0 +1,16 @@
+#![forbid(unsafe_code)]
+#![feature(allow_internal_unsafe)]
+
+#[allow_internal_unsafe]
+//~^ ERROR: `allow_internal_unsafe` allows defining
+macro_rules! evil {
+    ($e:expr) => {
+        unsafe {
+            $e
+        }
+    }
+}
+
+fn main() {
+    println!("{}", evil!(*(0 as *const u8)));
+}
diff --git a/src/test/ui/lint/lint-forbid-internal-unsafe.stderr b/src/test/ui/lint/lint-forbid-internal-unsafe.stderr
new file mode 100644
index 0000000..59dab11
--- /dev/null
+++ b/src/test/ui/lint/lint-forbid-internal-unsafe.stderr
@@ -0,0 +1,14 @@
+error: `allow_internal_unsafe` allows defining macros using unsafe without triggering the `unsafe_code` lint at their call site
+  --> $DIR/lint-forbid-internal-unsafe.rs:4:1
+   |
+LL | #[allow_internal_unsafe]
+   | ^^^^^^^^^^^^^^^^^^^^^^^^
+   |
+note: lint level defined here
+  --> $DIR/lint-forbid-internal-unsafe.rs:1:11
+   |
+LL | #![forbid(unsafe_code)]
+   |           ^^^^^^^^^^^
+
+error: aborting due to previous error
+
diff --git a/src/test/ui/lint/lint-incoherent-auto-trait-objects.rs b/src/test/ui/lint/lint-incoherent-auto-trait-objects.rs
new file mode 100644
index 0000000..0d18965
--- /dev/null
+++ b/src/test/ui/lint/lint-incoherent-auto-trait-objects.rs
@@ -0,0 +1,21 @@
+// ignore-tidy-linelength
+
+trait Foo {}
+
+impl Foo for dyn Send {}
+
+impl Foo for dyn Send + Send {}
+//~^ ERROR conflicting implementations
+//~| hard error
+
+impl Foo for dyn Send + Sync {}
+
+impl Foo for dyn Sync + Send {}
+//~^ ERROR conflicting implementations
+//~| hard error
+
+impl Foo for dyn Send + Sync + Send {}
+//~^ ERROR conflicting implementations
+//~| hard error
+
+fn main() {}
diff --git a/src/test/ui/lint/lint-incoherent-auto-trait-objects.stderr b/src/test/ui/lint/lint-incoherent-auto-trait-objects.stderr
new file mode 100644
index 0000000..928c92e
--- /dev/null
+++ b/src/test/ui/lint/lint-incoherent-auto-trait-objects.stderr
@@ -0,0 +1,39 @@
+error: conflicting implementations of trait `Foo` for type `(dyn std::marker::Send + 'static)`: (E0119)
+  --> $DIR/lint-incoherent-auto-trait-objects.rs:7:1
+   |
+LL | impl Foo for dyn Send {}
+   | --------------------- first implementation here
+LL | 
+LL | impl Foo for dyn Send + Send {}
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `(dyn std::marker::Send + 'static)`
+   |
+   = note: #[deny(order_dependent_trait_objects)] on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #56484 <https://github.com/rust-lang/rust/issues/56484>
+
+error: conflicting implementations of trait `Foo` for type `(dyn std::marker::Send + std::marker::Sync + 'static)`: (E0119)
+  --> $DIR/lint-incoherent-auto-trait-objects.rs:13:1
+   |
+LL | impl Foo for dyn Send + Sync {}
+   | ---------------------------- first implementation here
+LL | 
+LL | impl Foo for dyn Sync + Send {}
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `(dyn std::marker::Send + std::marker::Sync + 'static)`
+   |
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #56484 <https://github.com/rust-lang/rust/issues/56484>
+
+error: conflicting implementations of trait `Foo` for type `(dyn std::marker::Send + std::marker::Sync + 'static)`: (E0119)
+  --> $DIR/lint-incoherent-auto-trait-objects.rs:17:1
+   |
+LL | impl Foo for dyn Sync + Send {}
+   | ---------------------------- first implementation here
+...
+LL | impl Foo for dyn Send + Sync + Send {}
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `(dyn std::marker::Send + std::marker::Sync + 'static)`
+   |
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #56484 <https://github.com/rust-lang/rust/issues/56484>
+
+error: aborting due to 3 previous errors
+
diff --git a/src/test/ui/lint/lint-malformed.rs b/src/test/ui/lint/lint-malformed.rs
index e923249..c97a432 100644
--- a/src/test/ui/lint/lint-malformed.rs
+++ b/src/test/ui/lint/lint-malformed.rs
@@ -1,4 +1,4 @@
-#![deny = "foo"] //~ ERROR malformed lint attribute
+#![deny = "foo"] //~ ERROR attribute must be of the form
 #![allow(bar = "baz")] //~ ERROR malformed lint attribute
 
 fn main() { }
diff --git a/src/test/ui/lint/lint-malformed.stderr b/src/test/ui/lint/lint-malformed.stderr
index 554b025..98a7cec 100644
--- a/src/test/ui/lint/lint-malformed.stderr
+++ b/src/test/ui/lint/lint-malformed.stderr
@@ -1,15 +1,15 @@
 error[E0452]: malformed lint attribute
-  --> $DIR/lint-malformed.rs:1:1
-   |
-LL | #![deny = "foo"] //~ ERROR malformed lint attribute
-   | ^^^^^^^^^^^^^^^^
-
-error[E0452]: malformed lint attribute
   --> $DIR/lint-malformed.rs:2:10
    |
 LL | #![allow(bar = "baz")] //~ ERROR malformed lint attribute
    |          ^^^^^^^^^^^
 
+error: attribute must be of the form `#[deny(lint1, lint2, ..., /*opt*/ reason = "...")]`
+  --> $DIR/lint-malformed.rs:1:1
+   |
+LL | #![deny = "foo"] //~ ERROR attribute must be of the form
+   | ^^^^^^^^^^^^^^^^
+
 error: aborting due to 2 previous errors
 
 For more information about this error, try `rustc --explain E0452`.
diff --git a/src/test/ui/liveness/liveness-dead.rs b/src/test/ui/liveness/liveness-dead.rs
index 7d420af..004663c 100644
--- a/src/test/ui/liveness/liveness-dead.rs
+++ b/src/test/ui/liveness/liveness-dead.rs
@@ -27,4 +27,13 @@
     x = 4; //~ ERROR: value assigned to `x` is never read
 }
 
+// #22630
+fn f6() {
+    let mut done = false;
+    while !done {
+        done = true; // no error
+        continue;
+    }
+}
+
 fn main() {}
diff --git a/src/test/ui/liveness/liveness-forgot-ret.stderr b/src/test/ui/liveness/liveness-forgot-ret.stderr
index bbcbbdb..a970b80 100644
--- a/src/test/ui/liveness/liveness-forgot-ret.stderr
+++ b/src/test/ui/liveness/liveness-forgot-ret.stderr
@@ -2,7 +2,7 @@
   --> $DIR/liveness-forgot-ret.rs:3:19
    |
 LL | fn f(a: isize) -> isize { if god_exists(a) { return 5; }; }
-   |    -              ^^^^^ expected isize, found ()    - expected because of this statement
+   |    -              ^^^^^ expected isize, found ()
    |    |
    |    this function's body doesn't return
    |
diff --git a/src/test/ui/macros/meta-item-absolute-path.rs b/src/test/ui/macros/meta-item-absolute-path.rs
new file mode 100644
index 0000000..14d23be
--- /dev/null
+++ b/src/test/ui/macros/meta-item-absolute-path.rs
@@ -0,0 +1,4 @@
+#[derive(::Absolute)] //~ ERROR failed to resolve
+struct S;
+
+fn main() {}
diff --git a/src/test/ui/macros/meta-item-absolute-path.stderr b/src/test/ui/macros/meta-item-absolute-path.stderr
new file mode 100644
index 0000000..31b0a27
--- /dev/null
+++ b/src/test/ui/macros/meta-item-absolute-path.stderr
@@ -0,0 +1,9 @@
+error[E0433]: failed to resolve: maybe a missing `extern crate Absolute;`?
+  --> $DIR/meta-item-absolute-path.rs:1:12
+   |
+LL | #[derive(::Absolute)] //~ ERROR failed to resolve
+   |            ^^^^^^^^ maybe a missing `extern crate Absolute;`?
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0433`.
diff --git a/src/test/ui/malformed/malformed-derive-entry.rs b/src/test/ui/malformed/malformed-derive-entry.rs
index 2c8ebc4..74d2210 100644
--- a/src/test/ui/malformed/malformed-derive-entry.rs
+++ b/src/test/ui/malformed/malformed-derive-entry.rs
@@ -11,7 +11,7 @@
 struct Test3;
 
 #[derive]
-//~^ WARNING empty trait list
+//~^ ERROR attribute must be of the form
 struct Test4;
 
 fn main() {}
diff --git a/src/test/ui/malformed/malformed-derive-entry.stderr b/src/test/ui/malformed/malformed-derive-entry.stderr
index b347422..f546f74 100644
--- a/src/test/ui/malformed/malformed-derive-entry.stderr
+++ b/src/test/ui/malformed/malformed-derive-entry.stderr
@@ -16,11 +16,11 @@
 LL | #[derive()]
    | ^^^^^^^^^^^
 
-warning: empty trait list in `derive`
+error: attribute must be of the form `#[derive(Trait1, Trait2, ...)]`
   --> $DIR/malformed-derive-entry.rs:13:1
    |
 LL | #[derive]
    | ^^^^^^^^^
 
-error: aborting due to 2 previous errors
+error: aborting due to 3 previous errors
 
diff --git a/src/test/ui/malformed/malformed-plugin-1.rs b/src/test/ui/malformed/malformed-plugin-1.rs
index c5a251d..16e7a95 100644
--- a/src/test/ui/malformed/malformed-plugin-1.rs
+++ b/src/test/ui/malformed/malformed-plugin-1.rs
@@ -1,4 +1,4 @@
 #![feature(plugin)]
-#![plugin] //~ ERROR malformed plugin attribute
+#![plugin] //~ ERROR attribute must be of the form
 
 fn main() {}
diff --git a/src/test/ui/malformed/malformed-plugin-1.stderr b/src/test/ui/malformed/malformed-plugin-1.stderr
index 4124fd6..f42e66e 100644
--- a/src/test/ui/malformed/malformed-plugin-1.stderr
+++ b/src/test/ui/malformed/malformed-plugin-1.stderr
@@ -1,9 +1,8 @@
-error[E0498]: malformed plugin attribute
+error: attribute must be of the form `#[plugin(name|name(args))]`
   --> $DIR/malformed-plugin-1.rs:2:1
    |
-LL | #![plugin] //~ ERROR malformed plugin attribute
+LL | #![plugin] //~ ERROR attribute must be of the form
    | ^^^^^^^^^^
 
 error: aborting due to previous error
 
-For more information about this error, try `rustc --explain E0498`.
diff --git a/src/test/ui/malformed/malformed-plugin-2.rs b/src/test/ui/malformed/malformed-plugin-2.rs
index 96a3138..70a1d7f 100644
--- a/src/test/ui/malformed/malformed-plugin-2.rs
+++ b/src/test/ui/malformed/malformed-plugin-2.rs
@@ -1,4 +1,4 @@
 #![feature(plugin)]
-#![plugin="bleh"] //~ ERROR malformed plugin attribute
+#![plugin="bleh"] //~ ERROR attribute must be of the form
 
 fn main() {}
diff --git a/src/test/ui/malformed/malformed-plugin-2.stderr b/src/test/ui/malformed/malformed-plugin-2.stderr
index 308db46..923cbc1 100644
--- a/src/test/ui/malformed/malformed-plugin-2.stderr
+++ b/src/test/ui/malformed/malformed-plugin-2.stderr
@@ -1,9 +1,8 @@
-error[E0498]: malformed plugin attribute
+error: attribute must be of the form `#[plugin(name|name(args))]`
   --> $DIR/malformed-plugin-2.rs:2:1
    |
-LL | #![plugin="bleh"] //~ ERROR malformed plugin attribute
+LL | #![plugin="bleh"] //~ ERROR attribute must be of the form
    | ^^^^^^^^^^^^^^^^^
 
 error: aborting due to previous error
 
-For more information about this error, try `rustc --explain E0498`.
diff --git a/src/test/ui/malformed/malformed-regressions.rs b/src/test/ui/malformed/malformed-regressions.rs
new file mode 100644
index 0000000..b5c9924
--- /dev/null
+++ b/src/test/ui/malformed/malformed-regressions.rs
@@ -0,0 +1,8 @@
+// compile-pass
+
+#[doc] //~ WARN attribute must be of the form
+#[ignore()] //~ WARN attribute must be of the form
+#[inline = ""] //~ WARN attribute must be of the form
+#[link] //~ WARN attribute must be of the form
+#[link = ""] //~ WARN attribute must be of the form
+fn main() {}
diff --git a/src/test/ui/malformed/malformed-regressions.stderr b/src/test/ui/malformed/malformed-regressions.stderr
new file mode 100644
index 0000000..a3b2bda
--- /dev/null
+++ b/src/test/ui/malformed/malformed-regressions.stderr
@@ -0,0 +1,48 @@
+warning: attribute must be of the form `#[doc(hidden|inline|...)]` or `#[doc = "string"]`
+  --> $DIR/malformed-regressions.rs:3:1
+   |
+LL | #[doc] //~ WARN attribute must be of the form
+   | ^^^^^^
+   |
+   = note: #[warn(ill_formed_attribute_input)] on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #57571 <https://github.com/rust-lang/rust/issues/57571>
+
+warning: attribute must be of the form `#[ignore]` or `#[ignore = "reason"]`
+  --> $DIR/malformed-regressions.rs:4:1
+   |
+LL | #[ignore()] //~ WARN attribute must be of the form
+   | ^^^^^^^^^^^
+   |
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #57571 <https://github.com/rust-lang/rust/issues/57571>
+
+warning: attribute must be of the form `#[inline]` or `#[inline(always|never)]`
+  --> $DIR/malformed-regressions.rs:5:1
+   |
+LL | #[inline = ""] //~ WARN attribute must be of the form
+   | ^^^^^^^^^^^^^^
+   |
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #57571 <https://github.com/rust-lang/rust/issues/57571>
+
+warning: attribute must be of the form `#[link(name = "...", /*opt*/ kind = "dylib|static|...",
+                                             /*opt*/ cfg = "...")]`
+  --> $DIR/malformed-regressions.rs:6:1
+   |
+LL | #[link] //~ WARN attribute must be of the form
+   | ^^^^^^^
+   |
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #57571 <https://github.com/rust-lang/rust/issues/57571>
+
+warning: attribute must be of the form `#[link(name = "...", /*opt*/ kind = "dylib|static|...",
+                                             /*opt*/ cfg = "...")]`
+  --> $DIR/malformed-regressions.rs:7:1
+   |
+LL | #[link = ""] //~ WARN attribute must be of the form
+   | ^^^^^^^^^^^^
+   |
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #57571 <https://github.com/rust-lang/rust/issues/57571>
+
diff --git a/src/test/ui/malformed/malformed-special-attrs.rs b/src/test/ui/malformed/malformed-special-attrs.rs
new file mode 100644
index 0000000..f91c6be
--- /dev/null
+++ b/src/test/ui/malformed/malformed-special-attrs.rs
@@ -0,0 +1,13 @@
+#[cfg_attr] //~ ERROR expected `(`, found `<eof>`
+struct S1;
+
+#[cfg_attr = ""] //~ ERROR expected `(`, found `=`
+struct S2;
+
+#[derive] //~ ERROR attribute must be of the form
+struct S3;
+
+#[derive = ""] //~ ERROR attribute must be of the form
+struct S4;
+
+fn main() {}
diff --git a/src/test/ui/malformed/malformed-special-attrs.stderr b/src/test/ui/malformed/malformed-special-attrs.stderr
new file mode 100644
index 0000000..1653aa1
--- /dev/null
+++ b/src/test/ui/malformed/malformed-special-attrs.stderr
@@ -0,0 +1,25 @@
+error: expected `(`, found `<eof>`
+
+error: expected `(`, found `=`
+  --> $DIR/malformed-special-attrs.rs:4:12
+   |
+LL | #[cfg_attr] //~ ERROR expected `(`, found `<eof>`
+   | - expected `(`
+...
+LL | #[cfg_attr = ""] //~ ERROR expected `(`, found `=`
+   |            ^ unexpected token
+
+error: attribute must be of the form `#[derive(Trait1, Trait2, ...)]`
+  --> $DIR/malformed-special-attrs.rs:7:1
+   |
+LL | #[derive] //~ ERROR attribute must be of the form
+   | ^^^^^^^^^
+
+error: attribute must be of the form `#[derive(Trait1, Trait2, ...)]`
+  --> $DIR/malformed-special-attrs.rs:10:1
+   |
+LL | #[derive = ""] //~ ERROR attribute must be of the form
+   | ^^^^^^^^^^^^^^
+
+error: aborting due to 4 previous errors
+
diff --git a/src/test/ui/marker_trait_attr/marker-attribute-with-values.rs b/src/test/ui/marker_trait_attr/marker-attribute-with-values.rs
index 4756bb1..ea356d5 100644
--- a/src/test/ui/marker_trait_attr/marker-attribute-with-values.rs
+++ b/src/test/ui/marker_trait_attr/marker-attribute-with-values.rs
@@ -3,14 +3,14 @@
 
 #[marker(always)]
 trait Marker1 {}
-//~^^ ERROR attribute should be empty
+//~^^ ERROR attribute must be of the form
 
 #[marker("never")]
 trait Marker2 {}
-//~^^ ERROR attribute should be empty
+//~^^ ERROR attribute must be of the form
 
 #[marker(key = value)]
 trait Marker3 {}
-//~^^ ERROR attribute should be empty
+//~^^ ERROR expected unsuffixed literal or identifier, found value
 
 fn main() {}
diff --git a/src/test/ui/marker_trait_attr/marker-attribute-with-values.stderr b/src/test/ui/marker_trait_attr/marker-attribute-with-values.stderr
index e7c1e90..c683b39 100644
--- a/src/test/ui/marker_trait_attr/marker-attribute-with-values.stderr
+++ b/src/test/ui/marker_trait_attr/marker-attribute-with-values.stderr
@@ -1,20 +1,20 @@
-error: attribute should be empty
+error: attribute must be of the form `#[marker]`
   --> $DIR/marker-attribute-with-values.rs:4:1
    |
 LL | #[marker(always)]
    | ^^^^^^^^^^^^^^^^^
 
-error: attribute should be empty
+error: attribute must be of the form `#[marker]`
   --> $DIR/marker-attribute-with-values.rs:8:1
    |
 LL | #[marker("never")]
    | ^^^^^^^^^^^^^^^^^^
 
-error: attribute should be empty
-  --> $DIR/marker-attribute-with-values.rs:12:1
+error: expected unsuffixed literal or identifier, found value
+  --> $DIR/marker-attribute-with-values.rs:12:10
    |
 LL | #[marker(key = value)]
-   | ^^^^^^^^^^^^^^^^^^^^^^
+   |          ^^^
 
 error: aborting due to 3 previous errors
 
diff --git a/src/test/ui/mismatched_types/cast-rfc0401.stderr b/src/test/ui/mismatched_types/cast-rfc0401.stderr
index fbe5e6d..76091f2 100644
--- a/src/test/ui/mismatched_types/cast-rfc0401.stderr
+++ b/src/test/ui/mismatched_types/cast-rfc0401.stderr
@@ -90,17 +90,13 @@
   --> $DIR/cast-rfc0401.rs:39:13
    |
 LL |     let _ = 3_i32 as bool; //~ ERROR cannot cast
-   |             ^^^^^^^^^^^^^ unsupported cast
-   |
-   = help: compare with zero instead
+   |             ^^^^^^^^^^^^^ help: compare with zero instead: `3_i32 != 0`
 
 error[E0054]: cannot cast as `bool`
   --> $DIR/cast-rfc0401.rs:40:13
    |
 LL |     let _ = E::A as bool; //~ ERROR cannot cast
    |             ^^^^^^^^^^^^ unsupported cast
-   |
-   = help: compare with zero instead
 
 error[E0604]: only `u8` can be cast as `char`, not `u32`
   --> $DIR/cast-rfc0401.rs:41:13
diff --git a/src/test/ui/nll/closure-requirements/escape-argument-callee.stderr b/src/test/ui/nll/closure-requirements/escape-argument-callee.stderr
index 66f8791..8e40707 100644
--- a/src/test/ui/nll/closure-requirements/escape-argument-callee.stderr
+++ b/src/test/ui/nll/closure-requirements/escape-argument-callee.stderr
@@ -9,7 +9,7 @@
                for<'r, 's, 't0> extern "rust-call" fn((&ReLateBound(DebruijnIndex(0), BrNamed(crate0:DefIndex(0:0), 'r)) mut &ReLateBound(DebruijnIndex(0), BrNamed(crate0:DefIndex(0:0), 's)) i32, &ReLateBound(DebruijnIndex(0), BrNamed(crate0:DefIndex(0:0), 't0)) i32))
            ]
 
-error: unsatisfied lifetime constraints
+error: lifetime may not live long enough
   --> $DIR/escape-argument-callee.rs:26:45
    |
 LL |         let mut closure = expect_sig(|p, y| *p = y);
diff --git a/src/test/ui/nll/closure-requirements/propagate-approximated-fail-no-postdom.stderr b/src/test/ui/nll/closure-requirements/propagate-approximated-fail-no-postdom.stderr
index 5594271..55e4573 100644
--- a/src/test/ui/nll/closure-requirements/propagate-approximated-fail-no-postdom.stderr
+++ b/src/test/ui/nll/closure-requirements/propagate-approximated-fail-no-postdom.stderr
@@ -16,7 +16,7 @@
    = note: late-bound region is '_#5r
    = note: late-bound region is '_#6r
 
-error: unsatisfied lifetime constraints
+error: lifetime may not live long enough
   --> $DIR/propagate-approximated-fail-no-postdom.rs:46:13
    |
 LL |         |_outlives1, _outlives2, _outlives3, x, y| {
diff --git a/src/test/ui/nll/closure-requirements/propagate-approximated-ref.rs b/src/test/ui/nll/closure-requirements/propagate-approximated-ref.rs
index 7296bba..1c409a1 100644
--- a/src/test/ui/nll/closure-requirements/propagate-approximated-ref.rs
+++ b/src/test/ui/nll/closure-requirements/propagate-approximated-ref.rs
@@ -41,10 +41,9 @@
 #[rustc_regions]
 fn supply<'a, 'b>(cell_a: Cell<&'a u32>, cell_b: Cell<&'b u32>) {
     establish_relationships(&cell_a, &cell_b, |_outlives1, _outlives2, x, y| {
-
         // Only works if 'x: 'y:
         demand_y(x, y, x.get())
-        //~^ ERROR unsatisfied lifetime constraints
+        //~^ ERROR lifetime may not live long enough
     });
 }
 
diff --git a/src/test/ui/nll/closure-requirements/propagate-approximated-ref.stderr b/src/test/ui/nll/closure-requirements/propagate-approximated-ref.stderr
index a827b85..5863b9b 100644
--- a/src/test/ui/nll/closure-requirements/propagate-approximated-ref.stderr
+++ b/src/test/ui/nll/closure-requirements/propagate-approximated-ref.stderr
@@ -3,10 +3,9 @@
    |
 LL |       establish_relationships(&cell_a, &cell_b, |_outlives1, _outlives2, x, y| {
    |  _______________________________________________^
-LL | |
 LL | |         // Only works if 'x: 'y:
 LL | |         demand_y(x, y, x.get())
-LL | |         //~^ ERROR unsatisfied lifetime constraints
+LL | |         //~^ ERROR lifetime may not live long enough
 LL | |     });
    | |_____^
    |
@@ -24,17 +23,17 @@
    |
 LL | / fn supply<'a, 'b>(cell_a: Cell<&'a u32>, cell_b: Cell<&'b u32>) {
 LL | |     establish_relationships(&cell_a, &cell_b, |_outlives1, _outlives2, x, y| {
-LL | |
 LL | |         // Only works if 'x: 'y:
-...  |
+LL | |         demand_y(x, y, x.get())
+LL | |         //~^ ERROR lifetime may not live long enough
 LL | |     });
 LL | | }
    | |_^
    |
    = note: defining type: DefId(0/0:6 ~ propagate_approximated_ref[317d]::supply[0]) with substs []
 
-error: unsatisfied lifetime constraints
-  --> $DIR/propagate-approximated-ref.rs:46:9
+error: lifetime may not live long enough
+  --> $DIR/propagate-approximated-ref.rs:45:9
    |
 LL | fn supply<'a, 'b>(cell_a: Cell<&'a u32>, cell_b: Cell<&'b u32>) {
    |           --  -- lifetime `'b` defined here
diff --git a/src/test/ui/nll/closure-requirements/propagate-approximated-val.rs b/src/test/ui/nll/closure-requirements/propagate-approximated-val.rs
index eb6159c..233a5dc 100644
--- a/src/test/ui/nll/closure-requirements/propagate-approximated-val.rs
+++ b/src/test/ui/nll/closure-requirements/propagate-approximated-val.rs
@@ -34,10 +34,9 @@
 #[rustc_regions]
 fn test<'a, 'b>(cell_a: Cell<&'a u32>, cell_b: Cell<&'b u32>) {
     establish_relationships(cell_a, cell_b, |outlives1, outlives2, x, y| {
-
         // Only works if 'x: 'y:
         demand_y(outlives1, outlives2, x.get())
-        //~^ ERROR unsatisfied lifetime constraints
+        //~^ ERROR lifetime may not live long enough
     });
 }
 
diff --git a/src/test/ui/nll/closure-requirements/propagate-approximated-val.stderr b/src/test/ui/nll/closure-requirements/propagate-approximated-val.stderr
index 1f9d1d7..b6d9d85 100644
--- a/src/test/ui/nll/closure-requirements/propagate-approximated-val.stderr
+++ b/src/test/ui/nll/closure-requirements/propagate-approximated-val.stderr
@@ -3,10 +3,9 @@
    |
 LL |       establish_relationships(cell_a, cell_b, |outlives1, outlives2, x, y| {
    |  _____________________________________________^
-LL | |
 LL | |         // Only works if 'x: 'y:
 LL | |         demand_y(outlives1, outlives2, x.get())
-LL | |         //~^ ERROR unsatisfied lifetime constraints
+LL | |         //~^ ERROR lifetime may not live long enough
 LL | |     });
    | |_____^
    |
@@ -24,17 +23,17 @@
    |
 LL | / fn test<'a, 'b>(cell_a: Cell<&'a u32>, cell_b: Cell<&'b u32>) {
 LL | |     establish_relationships(cell_a, cell_b, |outlives1, outlives2, x, y| {
-LL | |
 LL | |         // Only works if 'x: 'y:
-...  |
+LL | |         demand_y(outlives1, outlives2, x.get())
+LL | |         //~^ ERROR lifetime may not live long enough
 LL | |     });
 LL | | }
    | |_^
    |
    = note: defining type: DefId(0/0:6 ~ propagate_approximated_val[317d]::test[0]) with substs []
 
-error: unsatisfied lifetime constraints
-  --> $DIR/propagate-approximated-val.rs:39:9
+error: lifetime may not live long enough
+  --> $DIR/propagate-approximated-val.rs:38:9
    |
 LL | fn test<'a, 'b>(cell_a: Cell<&'a u32>, cell_b: Cell<&'b u32>) {
    |         --  -- lifetime `'b` defined here
diff --git a/src/test/ui/nll/closure-requirements/propagate-fail-to-approximate-longer-no-bounds.stderr b/src/test/ui/nll/closure-requirements/propagate-fail-to-approximate-longer-no-bounds.stderr
index 1a8988f..93eb93b 100644
--- a/src/test/ui/nll/closure-requirements/propagate-fail-to-approximate-longer-no-bounds.stderr
+++ b/src/test/ui/nll/closure-requirements/propagate-fail-to-approximate-longer-no-bounds.stderr
@@ -16,7 +16,7 @@
    = note: late-bound region is '_#2r
    = note: late-bound region is '_#3r
 
-error: unsatisfied lifetime constraints
+error: lifetime may not live long enough
   --> $DIR/propagate-fail-to-approximate-longer-no-bounds.rs:37:9
    |
 LL |     establish_relationships(&cell_a, &cell_b, |_outlives, x, y| {
diff --git a/src/test/ui/nll/closure-requirements/propagate-fail-to-approximate-longer-wrong-bounds.stderr b/src/test/ui/nll/closure-requirements/propagate-fail-to-approximate-longer-wrong-bounds.stderr
index d0492bd..c7809de 100644
--- a/src/test/ui/nll/closure-requirements/propagate-fail-to-approximate-longer-wrong-bounds.stderr
+++ b/src/test/ui/nll/closure-requirements/propagate-fail-to-approximate-longer-wrong-bounds.stderr
@@ -16,7 +16,7 @@
    = note: late-bound region is '_#3r
    = note: late-bound region is '_#4r
 
-error: unsatisfied lifetime constraints
+error: lifetime may not live long enough
   --> $DIR/propagate-fail-to-approximate-longer-wrong-bounds.rs:41:9
    |
 LL |     establish_relationships(&cell_a, &cell_b, |_outlives1, _outlives2, x, y| {
diff --git a/src/test/ui/nll/closure-requirements/region-lbr-named-does-not-outlive-static.stderr b/src/test/ui/nll/closure-requirements/region-lbr-named-does-not-outlive-static.stderr
index 0bc0592..d0a24a2 100644
--- a/src/test/ui/nll/closure-requirements/region-lbr-named-does-not-outlive-static.stderr
+++ b/src/test/ui/nll/closure-requirements/region-lbr-named-does-not-outlive-static.stderr
@@ -1,4 +1,4 @@
-error: unsatisfied lifetime constraints
+error: lifetime may not live long enough
   --> $DIR/region-lbr-named-does-not-outlive-static.rs:9:5
    |
 LL | fn foo<'a>(x: &'a u32) -> &'static u32 {
diff --git a/src/test/ui/nll/closure-requirements/region-lbr1-does-not-outlive-ebr2.rs b/src/test/ui/nll/closure-requirements/region-lbr1-does-not-outlive-ebr2.rs
index 1be27ae..4d864c6 100644
--- a/src/test/ui/nll/closure-requirements/region-lbr1-does-not-outlive-ebr2.rs
+++ b/src/test/ui/nll/closure-requirements/region-lbr1-does-not-outlive-ebr2.rs
@@ -7,7 +7,7 @@
 
 fn foo<'a, 'b>(x: &'a u32, y: &'b u32) -> &'b u32 {
     &*x
-        //~^ ERROR unsatisfied lifetime constraints
+    //~^ ERROR lifetime may not live long enough
 }
 
-fn main() { }
+fn main() {}
diff --git a/src/test/ui/nll/closure-requirements/region-lbr1-does-not-outlive-ebr2.stderr b/src/test/ui/nll/closure-requirements/region-lbr1-does-not-outlive-ebr2.stderr
index 2332332..6dc98a9 100644
--- a/src/test/ui/nll/closure-requirements/region-lbr1-does-not-outlive-ebr2.stderr
+++ b/src/test/ui/nll/closure-requirements/region-lbr1-does-not-outlive-ebr2.stderr
@@ -1,4 +1,4 @@
-error: unsatisfied lifetime constraints
+error: lifetime may not live long enough
   --> $DIR/region-lbr1-does-not-outlive-ebr2.rs:9:5
    |
 LL | fn foo<'a, 'b>(x: &'a u32, y: &'b u32) -> &'b u32 {
diff --git a/src/test/ui/nll/closure-requirements/return-wrong-bound-region.stderr b/src/test/ui/nll/closure-requirements/return-wrong-bound-region.stderr
index 26243f9..4a035d0 100644
--- a/src/test/ui/nll/closure-requirements/return-wrong-bound-region.stderr
+++ b/src/test/ui/nll/closure-requirements/return-wrong-bound-region.stderr
@@ -9,7 +9,7 @@
                for<'r, 's> extern "rust-call" fn((&ReLateBound(DebruijnIndex(0), BrNamed(crate0:DefIndex(0:0), 'r)) i32, &ReLateBound(DebruijnIndex(0), BrNamed(crate0:DefIndex(0:0), 's)) i32)) -> &ReLateBound(DebruijnIndex(0), BrNamed(crate0:DefIndex(0:0), 'r)) i32
            ]
 
-error: unsatisfied lifetime constraints
+error: lifetime may not live long enough
   --> $DIR/return-wrong-bound-region.rs:11:23
    |
 LL |     expect_sig(|a, b| b); // ought to return `a`
diff --git a/src/test/ui/nll/issue-48238.stderr b/src/test/ui/nll/issue-48238.stderr
index 913effa..7cb5eb7 100644
--- a/src/test/ui/nll/issue-48238.stderr
+++ b/src/test/ui/nll/issue-48238.stderr
@@ -1,4 +1,4 @@
-error: unsatisfied lifetime constraints
+error: lifetime may not live long enough
   --> $DIR/issue-48238.rs:11:13
    |
 LL |     move || use_val(&orig); //~ ERROR
diff --git a/src/test/ui/nll/issue-50716.stderr b/src/test/ui/nll/issue-50716.stderr
index fa893df..229bb17 100644
--- a/src/test/ui/nll/issue-50716.stderr
+++ b/src/test/ui/nll/issue-50716.stderr
@@ -1,4 +1,4 @@
-error: unsatisfied lifetime constraints
+error: lifetime may not live long enough
   --> $DIR/issue-50716.rs:16:14
    |
 LL | fn foo<'a, T: 'static>(s: Box<<&'a T as A>::X>)
diff --git a/src/test/ui/nll/issue-52113.rs b/src/test/ui/nll/issue-52113.rs
index 8428e55..795f4f4 100644
--- a/src/test/ui/nll/issue-52113.rs
+++ b/src/test/ui/nll/issue-52113.rs
@@ -3,8 +3,8 @@
 #![allow(warnings)]
 #![feature(nll)]
 
-trait Bazinga { }
-impl<F> Bazinga for F { }
+trait Bazinga {}
+impl<F> Bazinga for F {}
 
 fn produce1<'a>(data: &'a u32) -> impl Bazinga + 'a {
     let x = move || {
@@ -21,7 +21,6 @@
     x
 }
 
-
 fn produce3<'a, 'b: 'a>(data: &'a mut Vec<&'a u32>, value: &'b u32) -> impl Bazinga + 'a {
     let x = move || {
         let value: &'a u32 = value;
@@ -35,7 +34,7 @@
         let value: &'a u32 = value;
         data.push(value);
     };
-    x   //~ ERROR unsatisfied lifetime constraints
+    x //~ ERROR lifetime may not live long enough
 }
 
-fn main() { }
+fn main() {}
diff --git a/src/test/ui/nll/issue-52113.stderr b/src/test/ui/nll/issue-52113.stderr
index 873612d..ceae161 100644
--- a/src/test/ui/nll/issue-52113.stderr
+++ b/src/test/ui/nll/issue-52113.stderr
@@ -1,12 +1,12 @@
-error: unsatisfied lifetime constraints
-  --> $DIR/issue-52113.rs:38:5
+error: lifetime may not live long enough
+  --> $DIR/issue-52113.rs:37:5
    |
 LL | fn produce_err<'a, 'b: 'a>(data: &'b mut Vec<&'b u32>, value: &'a u32) -> impl Bazinga + 'b {
    |                --  -- lifetime `'b` defined here
    |                |
    |                lifetime `'a` defined here
 ...
-LL |     x   //~ ERROR unsatisfied lifetime constraints
+LL |     x //~ ERROR lifetime may not live long enough
    |     ^ returning this value requires that `'a` must outlive `'b`
 
 error: aborting due to previous error
diff --git a/src/test/ui/nll/issue-52742.rs b/src/test/ui/nll/issue-52742.rs
index d8251cb..150e67f 100644
--- a/src/test/ui/nll/issue-52742.rs
+++ b/src/test/ui/nll/issue-52742.rs
@@ -7,14 +7,14 @@
 }
 
 struct Bar<'b> {
-    z: &'b u32
+    z: &'b u32,
 }
 
 impl Foo<'_, '_> {
     fn take_bar(&mut self, b: Bar<'_>) {
         self.y = b.z
-        //~^ ERROR unsatisfied lifetime constraints
+        //~^ ERROR lifetime may not live long enough
     }
 }
 
-fn main() { }
+fn main() {}
diff --git a/src/test/ui/nll/issue-52742.stderr b/src/test/ui/nll/issue-52742.stderr
index f733702..6b25296 100644
--- a/src/test/ui/nll/issue-52742.stderr
+++ b/src/test/ui/nll/issue-52742.stderr
@@ -1,4 +1,4 @@
-error: unsatisfied lifetime constraints
+error: lifetime may not live long enough
   --> $DIR/issue-52742.rs:15:9
    |
 LL |     fn take_bar(&mut self, b: Bar<'_>) {
diff --git a/src/test/ui/nll/issue-55394.rs b/src/test/ui/nll/issue-55394.rs
index 4a83c33..deb1034 100644
--- a/src/test/ui/nll/issue-55394.rs
+++ b/src/test/ui/nll/issue-55394.rs
@@ -8,7 +8,7 @@
 
 impl Foo<'_> {
     fn new(bar: &mut Bar) -> Self {
-        Foo { bar } //~ ERROR unsatisfied lifetime constraints
+        Foo { bar } //~ERROR lifetime may not live long enough
     }
 }
 
diff --git a/src/test/ui/nll/issue-55394.stderr b/src/test/ui/nll/issue-55394.stderr
index a4c5160..bcdd782 100644
--- a/src/test/ui/nll/issue-55394.stderr
+++ b/src/test/ui/nll/issue-55394.stderr
@@ -1,11 +1,11 @@
-error: unsatisfied lifetime constraints
+error: lifetime may not live long enough
   --> $DIR/issue-55394.rs:11:9
    |
 LL |     fn new(bar: &mut Bar) -> Self {
    |                 -            ---- return type is Foo<'2>
    |                 |
    |                 let's call the lifetime of this reference `'1`
-LL |         Foo { bar } //~ ERROR unsatisfied lifetime constraints
+LL |         Foo { bar } //~ERROR lifetime may not live long enough
    |         ^^^^^^^^^^^ returning this value requires that `'1` must outlive `'2`
 
 error: aborting due to previous error
diff --git a/src/test/ui/nll/issue-55401.stderr b/src/test/ui/nll/issue-55401.stderr
index 9e50db7..952b544 100644
--- a/src/test/ui/nll/issue-55401.stderr
+++ b/src/test/ui/nll/issue-55401.stderr
@@ -1,4 +1,4 @@
-error: unsatisfied lifetime constraints
+error: lifetime may not live long enough
   --> $DIR/issue-55401.rs:5:5
    |
 LL | fn static_to_a_to_static_through_ref_in_tuple<'a>(x: &'a u32) -> &'static u32 {
diff --git a/src/test/ui/nll/mir_check_cast_closure.rs b/src/test/ui/nll/mir_check_cast_closure.rs
index 5298e84..0619ff3 100644
--- a/src/test/ui/nll/mir_check_cast_closure.rs
+++ b/src/test/ui/nll/mir_check_cast_closure.rs
@@ -5,7 +5,7 @@
 fn bar<'a, 'b>() -> fn(&'a u32, &'b u32) -> &'a u32 {
     let g: fn(_, _) -> _ = |_x, y| y;
     g
-    //~^ ERROR unsatisfied lifetime constraints
+    //~^ ERROR lifetime may not live long enough
 }
 
 fn main() {}
diff --git a/src/test/ui/nll/mir_check_cast_closure.stderr b/src/test/ui/nll/mir_check_cast_closure.stderr
index b883533..e14cb07 100644
--- a/src/test/ui/nll/mir_check_cast_closure.stderr
+++ b/src/test/ui/nll/mir_check_cast_closure.stderr
@@ -1,4 +1,4 @@
-error: unsatisfied lifetime constraints
+error: lifetime may not live long enough
   --> $DIR/mir_check_cast_closure.rs:7:5
    |
 LL | fn bar<'a, 'b>() -> fn(&'a u32, &'b u32) -> &'a u32 {
diff --git a/src/test/ui/nll/mir_check_cast_reify.rs b/src/test/ui/nll/mir_check_cast_reify.rs
index b0ad8e3..be12e31 100644
--- a/src/test/ui/nll/mir_check_cast_reify.rs
+++ b/src/test/ui/nll/mir_check_cast_reify.rs
@@ -35,7 +35,7 @@
     // as part of checking the `ReifyFnPointer`.
     let f: fn(_) -> _ = foo;
     f(x)
-    //~^ ERROR unsatisfied lifetime constraints
+    //~^ ERROR lifetime may not live long enough
 }
 
 fn main() {}
diff --git a/src/test/ui/nll/mir_check_cast_reify.stderr b/src/test/ui/nll/mir_check_cast_reify.stderr
index 2585486..4e8eec3 100644
--- a/src/test/ui/nll/mir_check_cast_reify.stderr
+++ b/src/test/ui/nll/mir_check_cast_reify.stderr
@@ -1,4 +1,4 @@
-error: unsatisfied lifetime constraints
+error: lifetime may not live long enough
   --> $DIR/mir_check_cast_reify.rs:37:5
    |
 LL | fn bar<'a>(x: &'a u32) -> &'static u32 {
diff --git a/src/test/ui/nll/mir_check_cast_unsafe_fn.rs b/src/test/ui/nll/mir_check_cast_unsafe_fn.rs
index 29fbf46..9df9c05 100644
--- a/src/test/ui/nll/mir_check_cast_unsafe_fn.rs
+++ b/src/test/ui/nll/mir_check_cast_unsafe_fn.rs
@@ -7,7 +7,7 @@
     // in `g`. These are related via the `UnsafeFnPointer` cast.
     let g: unsafe fn(_) -> _ = f;
     unsafe { g(input) }
-    //~^ ERROR unsatisfied lifetime constraints
+    //~^ ERROR lifetime may not live long enough
 }
 
 fn main() {}
diff --git a/src/test/ui/nll/mir_check_cast_unsafe_fn.stderr b/src/test/ui/nll/mir_check_cast_unsafe_fn.stderr
index e7b945a..5295985 100644
--- a/src/test/ui/nll/mir_check_cast_unsafe_fn.stderr
+++ b/src/test/ui/nll/mir_check_cast_unsafe_fn.stderr
@@ -1,4 +1,4 @@
-error: unsatisfied lifetime constraints
+error: lifetime may not live long enough
   --> $DIR/mir_check_cast_unsafe_fn.rs:9:14
    |
 LL | fn bar<'a>(input: &'a u32, f: fn(&'a u32) -> &'a u32) -> &'static u32 {
diff --git a/src/test/ui/nll/mir_check_cast_unsize.rs b/src/test/ui/nll/mir_check_cast_unsize.rs
index e98d5e1..d15c4e4 100644
--- a/src/test/ui/nll/mir_check_cast_unsize.rs
+++ b/src/test/ui/nll/mir_check_cast_unsize.rs
@@ -6,7 +6,7 @@
 
 fn bar<'a>(x: &'a u32) -> &'static dyn Debug {
     x
-    //~^ ERROR unsatisfied lifetime constraints
+    //~^ ERROR lifetime may not live long enough
 }
 
 fn main() {}
diff --git a/src/test/ui/nll/mir_check_cast_unsize.stderr b/src/test/ui/nll/mir_check_cast_unsize.stderr
index 189bb2d..364d6c1 100644
--- a/src/test/ui/nll/mir_check_cast_unsize.stderr
+++ b/src/test/ui/nll/mir_check_cast_unsize.stderr
@@ -1,4 +1,4 @@
-error: unsatisfied lifetime constraints
+error: lifetime may not live long enough
   --> $DIR/mir_check_cast_unsize.rs:8:5
    |
 LL | fn bar<'a>(x: &'a u32) -> &'static dyn Debug {
diff --git a/src/test/ui/nll/ty-outlives/projection-one-region-closure.stderr b/src/test/ui/nll/ty-outlives/projection-one-region-closure.stderr
index f2bfdae..e8283d1 100644
--- a/src/test/ui/nll/ty-outlives/projection-one-region-closure.stderr
+++ b/src/test/ui/nll/ty-outlives/projection-one-region-closure.stderr
@@ -40,7 +40,7 @@
    |
    = help: consider adding an explicit lifetime bound `T: ReFree(DefId(0/0:8 ~ projection_one_region_closure[317d]::no_relationships_late[0]), BrNamed(crate0:DefIndex(1:16), 'a))`...
 
-error: unsatisfied lifetime constraints
+error: lifetime may not live long enough
   --> $DIR/projection-one-region-closure.rs:45:39
    |
 LL | fn no_relationships_late<'a, 'b, T>(cell: Cell<&'a ()>, t: T)
@@ -94,7 +94,7 @@
    |
    = help: consider adding an explicit lifetime bound `T: ReEarlyBound(0, 'a)`...
 
-error: unsatisfied lifetime constraints
+error: lifetime may not live long enough
   --> $DIR/projection-one-region-closure.rs:56:39
    |
 LL | fn no_relationships_early<'a, 'b, T>(cell: Cell<&'a ()>, t: T)
diff --git a/src/test/ui/nll/ty-outlives/projection-one-region-trait-bound-closure.stderr b/src/test/ui/nll/ty-outlives/projection-one-region-trait-bound-closure.stderr
index fc59100..78a8c80 100644
--- a/src/test/ui/nll/ty-outlives/projection-one-region-trait-bound-closure.stderr
+++ b/src/test/ui/nll/ty-outlives/projection-one-region-trait-bound-closure.stderr
@@ -31,7 +31,7 @@
                T
            ]
 
-error: unsatisfied lifetime constraints
+error: lifetime may not live long enough
   --> $DIR/projection-one-region-trait-bound-closure.rs:37:39
    |
 LL | fn no_relationships_late<'a, 'b, T>(cell: Cell<&'a ()>, t: T)
@@ -76,7 +76,7 @@
                T
            ]
 
-error: unsatisfied lifetime constraints
+error: lifetime may not live long enough
   --> $DIR/projection-one-region-trait-bound-closure.rs:47:39
    |
 LL | fn no_relationships_early<'a, 'b, T>(cell: Cell<&'a ()>, t: T)
diff --git a/src/test/ui/nll/ty-outlives/projection-two-region-trait-bound-closure.rs b/src/test/ui/nll/ty-outlives/projection-two-region-trait-bound-closure.rs
index 25877e6..20edfb3 100644
--- a/src/test/ui/nll/ty-outlives/projection-two-region-trait-bound-closure.rs
+++ b/src/test/ui/nll/ty-outlives/projection-two-region-trait-bound-closure.rs
@@ -85,7 +85,7 @@
     T: Anything<'b, 'b>,
 {
     with_signature(cell, t, |cell, t| require(cell, t));
-    //~^ ERROR unsatisfied lifetime constraints
+    //~^ ERROR lifetime may not live long enough
 }
 
 #[rustc_regions]
diff --git a/src/test/ui/nll/ty-outlives/projection-two-region-trait-bound-closure.stderr b/src/test/ui/nll/ty-outlives/projection-two-region-trait-bound-closure.stderr
index c2b54b6..d8725dc 100644
--- a/src/test/ui/nll/ty-outlives/projection-two-region-trait-bound-closure.stderr
+++ b/src/test/ui/nll/ty-outlives/projection-two-region-trait-bound-closure.stderr
@@ -217,7 +217,7 @@
 LL | |     T: Anything<'b, 'b>,
 LL | | {
 LL | |     with_signature(cell, t, |cell, t| require(cell, t));
-LL | |     //~^ ERROR unsatisfied lifetime constraints
+LL | |     //~^ ERROR lifetime may not live long enough
 LL | | }
    | |_^
    |
@@ -226,7 +226,7 @@
                T
            ]
 
-error: unsatisfied lifetime constraints
+error: lifetime may not live long enough
   --> $DIR/projection-two-region-trait-bound-closure.rs:87:29
    |
 LL | fn two_regions<'a, 'b, T>(cell: Cell<&'a ()>, t: T)
diff --git a/src/test/ui/nll/type-alias-free-regions.stderr b/src/test/ui/nll/type-alias-free-regions.stderr
index 6b3bb60..bcd141b 100644
--- a/src/test/ui/nll/type-alias-free-regions.stderr
+++ b/src/test/ui/nll/type-alias-free-regions.stderr
@@ -1,4 +1,4 @@
-error: unsatisfied lifetime constraints
+error: lifetime may not live long enough
   --> $DIR/type-alias-free-regions.rs:19:9
    |
 LL | impl<'a> FromBox<'a> for C<'a> {
@@ -8,7 +8,7 @@
 LL |         C { f: b } //~ ERROR
    |         ^^^^^^^^^^ returning this value requires that `'1` must outlive `'a`
 
-error: unsatisfied lifetime constraints
+error: lifetime may not live long enough
   --> $DIR/type-alias-free-regions.rs:29:9
    |
 LL | impl<'a> FromTuple<'a> for C<'a> {
diff --git a/src/test/ui/nll/user-annotations/closure-substs.rs b/src/test/ui/nll/user-annotations/closure-substs.rs
index 9dc84aa..cafdd92 100644
--- a/src/test/ui/nll/user-annotations/closure-substs.rs
+++ b/src/test/ui/nll/user-annotations/closure-substs.rs
@@ -5,21 +5,21 @@
 fn foo<'a>() {
     // Here `x` is free in the closure sig:
     |x: &'a i32| -> &'static i32 {
-        return x; //~ ERROR unsatisfied lifetime constraints
+        return x; //~ ERROR lifetime may not live long enough
     };
 }
 
 fn foo1() {
     // Here `x` is bound in the closure sig:
     |x: &i32| -> &'static i32 {
-        return x; //~ ERROR unsatisfied lifetime constraints
+        return x; //~ ERROR lifetime may not live long enough
     };
 }
 
 fn bar<'a>() {
     // Here `x` is free in the closure sig:
     |x: &'a i32, b: fn(&'static i32)| {
-        b(x); //~ ERROR unsatisfied lifetime constraints
+        b(x); //~ ERROR lifetime may not live long enough
     };
 }
 
@@ -30,4 +30,4 @@
     };
 }
 
-fn main() { }
+fn main() {}
diff --git a/src/test/ui/nll/user-annotations/closure-substs.stderr b/src/test/ui/nll/user-annotations/closure-substs.stderr
index ffc6e5a..a46ab61 100644
--- a/src/test/ui/nll/user-annotations/closure-substs.stderr
+++ b/src/test/ui/nll/user-annotations/closure-substs.stderr
@@ -1,27 +1,27 @@
-error: unsatisfied lifetime constraints
+error: lifetime may not live long enough
   --> $DIR/closure-substs.rs:8:16
    |
 LL | fn foo<'a>() {
    |        -- lifetime `'a` defined here
 ...
-LL |         return x; //~ ERROR unsatisfied lifetime constraints
+LL |         return x; //~ ERROR lifetime may not live long enough
    |                ^ returning this value requires that `'a` must outlive `'static`
 
-error: unsatisfied lifetime constraints
+error: lifetime may not live long enough
   --> $DIR/closure-substs.rs:15:16
    |
 LL |     |x: &i32| -> &'static i32 {
    |         - let's call the lifetime of this reference `'1`
-LL |         return x; //~ ERROR unsatisfied lifetime constraints
+LL |         return x; //~ ERROR lifetime may not live long enough
    |                ^ returning this value requires that `'1` must outlive `'static`
 
-error: unsatisfied lifetime constraints
+error: lifetime may not live long enough
   --> $DIR/closure-substs.rs:22:9
    |
 LL | fn bar<'a>() {
    |        -- lifetime `'a` defined here
 ...
-LL |         b(x); //~ ERROR unsatisfied lifetime constraints
+LL |         b(x); //~ ERROR lifetime may not live long enough
    |         ^^^^ argument requires that `'a` must outlive `'static`
 
 error[E0521]: borrowed data escapes outside of closure
diff --git a/src/test/ui/nll/user-annotations/constant-in-expr-inherent-1.stderr b/src/test/ui/nll/user-annotations/constant-in-expr-inherent-1.stderr
index 94fbe01..541a711 100644
--- a/src/test/ui/nll/user-annotations/constant-in-expr-inherent-1.stderr
+++ b/src/test/ui/nll/user-annotations/constant-in-expr-inherent-1.stderr
@@ -1,4 +1,4 @@
-error: unsatisfied lifetime constraints
+error: lifetime may not live long enough
   --> $DIR/constant-in-expr-inherent-1.rs:10:5
    |
 LL | fn foo<'a>(_: &'a u32) -> &'static u32 {
diff --git a/src/test/ui/nll/user-annotations/constant-in-expr-normalize.stderr b/src/test/ui/nll/user-annotations/constant-in-expr-normalize.stderr
index 7aeb276..5b97c12 100644
--- a/src/test/ui/nll/user-annotations/constant-in-expr-normalize.stderr
+++ b/src/test/ui/nll/user-annotations/constant-in-expr-normalize.stderr
@@ -1,4 +1,4 @@
-error: unsatisfied lifetime constraints
+error: lifetime may not live long enough
   --> $DIR/constant-in-expr-normalize.rs:20:5
    |
 LL | fn foo<'a>(_: &'a u32) -> &'static u32 {
diff --git a/src/test/ui/nll/user-annotations/constant-in-expr-trait-item-1.stderr b/src/test/ui/nll/user-annotations/constant-in-expr-trait-item-1.stderr
index fee9abc..10e48b5 100644
--- a/src/test/ui/nll/user-annotations/constant-in-expr-trait-item-1.stderr
+++ b/src/test/ui/nll/user-annotations/constant-in-expr-trait-item-1.stderr
@@ -1,4 +1,4 @@
-error: unsatisfied lifetime constraints
+error: lifetime may not live long enough
   --> $DIR/constant-in-expr-trait-item-1.rs:12:5
    |
 LL | fn foo<'a>(_: &'a u32) -> &'static u32 {
diff --git a/src/test/ui/nll/user-annotations/constant-in-expr-trait-item-2.stderr b/src/test/ui/nll/user-annotations/constant-in-expr-trait-item-2.stderr
index 047aad9..5bfa32e 100644
--- a/src/test/ui/nll/user-annotations/constant-in-expr-trait-item-2.stderr
+++ b/src/test/ui/nll/user-annotations/constant-in-expr-trait-item-2.stderr
@@ -1,4 +1,4 @@
-error: unsatisfied lifetime constraints
+error: lifetime may not live long enough
   --> $DIR/constant-in-expr-trait-item-2.rs:12:5
    |
 LL | fn foo<'a, T: Foo<'a>>() -> &'static u32 {
diff --git a/src/test/ui/nll/user-annotations/constant-in-expr-trait-item-3.stderr b/src/test/ui/nll/user-annotations/constant-in-expr-trait-item-3.stderr
index b373ceb..a1e60db 100644
--- a/src/test/ui/nll/user-annotations/constant-in-expr-trait-item-3.stderr
+++ b/src/test/ui/nll/user-annotations/constant-in-expr-trait-item-3.stderr
@@ -1,4 +1,4 @@
-error: unsatisfied lifetime constraints
+error: lifetime may not live long enough
   --> $DIR/constant-in-expr-trait-item-3.rs:12:5
    |
 LL | fn foo<'a, T: Foo<'a>>() -> &'static u32 {
diff --git a/src/test/ui/nll/user-annotations/issue-54124.rs b/src/test/ui/nll/user-annotations/issue-54124.rs
index 042ad02..e1de67a 100644
--- a/src/test/ui/nll/user-annotations/issue-54124.rs
+++ b/src/test/ui/nll/user-annotations/issue-54124.rs
@@ -1,8 +1,8 @@
 #![feature(nll)]
 
 fn test<'a>() {
-    let _:fn(&()) = |_:&'a ()| {}; //~ ERROR unsatisfied lifetime constraints
-    //~^ ERROR unsatisfied lifetime constraints
+    let _:fn(&()) = |_:&'a ()| {}; //~ ERROR lifetime may not live long enough
+    //~^ ERROR lifetime may not live long enough
 }
 
 fn main() {
diff --git a/src/test/ui/nll/user-annotations/issue-54124.stderr b/src/test/ui/nll/user-annotations/issue-54124.stderr
index 5b5afaee..b1c2411 100644
--- a/src/test/ui/nll/user-annotations/issue-54124.stderr
+++ b/src/test/ui/nll/user-annotations/issue-54124.stderr
@@ -1,19 +1,19 @@
-error: unsatisfied lifetime constraints
+error: lifetime may not live long enough
   --> $DIR/issue-54124.rs:4:22
    |
 LL | fn test<'a>() {
    |         -- lifetime `'a` defined here
-LL |     let _:fn(&()) = |_:&'a ()| {}; //~ ERROR unsatisfied lifetime constraints
+LL |     let _:fn(&()) = |_:&'a ()| {}; //~ ERROR lifetime may not live long enough
    |                      ^ - let's call the lifetime of this reference `'1`
    |                      |
    |                      requires that `'1` must outlive `'a`
 
-error: unsatisfied lifetime constraints
+error: lifetime may not live long enough
   --> $DIR/issue-54124.rs:4:22
    |
 LL | fn test<'a>() {
    |         -- lifetime `'a` defined here
-LL |     let _:fn(&()) = |_:&'a ()| {}; //~ ERROR unsatisfied lifetime constraints
+LL |     let _:fn(&()) = |_:&'a ()| {}; //~ ERROR lifetime may not live long enough
    |                      ^ requires that `'a` must outlive `'static`
 
 error: aborting due to 2 previous errors
diff --git a/src/test/ui/nll/user-annotations/normalization.rs b/src/test/ui/nll/user-annotations/normalization.rs
index 51d9adc..e0af2e6 100644
--- a/src/test/ui/nll/user-annotations/normalization.rs
+++ b/src/test/ui/nll/user-annotations/normalization.rs
@@ -2,7 +2,6 @@
 // after normalization.
 
 #![feature(nll)]
-#![ignore(unused)]
 
 trait Foo { type Out; }
 impl Foo for () { type Out = &'static u32; }
diff --git a/src/test/ui/nll/user-annotations/normalization.stderr b/src/test/ui/nll/user-annotations/normalization.stderr
index b059d5a..71bf850 100644
--- a/src/test/ui/nll/user-annotations/normalization.stderr
+++ b/src/test/ui/nll/user-annotations/normalization.stderr
@@ -1,5 +1,5 @@
 error[E0597]: `a` does not live long enough
-  --> $DIR/normalization.rs:12:31
+  --> $DIR/normalization.rs:11:31
    |
 LL |     let b: <() as Foo>::Out = &a; //~ ERROR
    |            ----------------   ^^ borrowed value does not live long enough
diff --git a/src/test/ui/nll/user-annotations/patterns.stderr b/src/test/ui/nll/user-annotations/patterns.stderr
index b0c554e..476578e 100644
--- a/src/test/ui/nll/user-annotations/patterns.stderr
+++ b/src/test/ui/nll/user-annotations/patterns.stderr
@@ -148,7 +148,7 @@
 LL | }
    | - `x` dropped here while still borrowed
 
-error: unsatisfied lifetime constraints
+error: lifetime may not live long enough
   --> $DIR/patterns.rs:113:5
    |
 LL | fn static_to_a_to_static_through_variable<'a>(x: &'a u32) -> &'static u32 {
@@ -157,7 +157,7 @@
 LL |     y //~ ERROR
    |     ^ returning this value requires that `'a` must outlive `'static`
 
-error: unsatisfied lifetime constraints
+error: lifetime may not live long enough
   --> $DIR/patterns.rs:125:5
    |
 LL | fn static_to_a_to_static_through_tuple<'a>(x: &'a u32) -> &'static u32 {
@@ -166,7 +166,7 @@
 LL |     y //~ ERROR
    |     ^ returning this value requires that `'a` must outlive `'static`
 
-error: unsatisfied lifetime constraints
+error: lifetime may not live long enough
   --> $DIR/patterns.rs:130:5
    |
 LL | fn static_to_a_to_static_through_struct<'a>(_x: &'a u32) -> &'static u32 {
@@ -175,7 +175,7 @@
 LL |     y //~ ERROR
    |     ^ returning this value requires that `'a` must outlive `'static`
 
-error: unsatisfied lifetime constraints
+error: lifetime may not live long enough
   --> $DIR/patterns.rs:134:18
    |
 LL | fn a_to_static_then_static<'a>(x: &'a u32) -> &'static u32 {
diff --git a/src/test/ui/nll/user-annotations/wf-self-type.rs b/src/test/ui/nll/user-annotations/wf-self-type.rs
index da9ef8c..d8caf46 100644
--- a/src/test/ui/nll/user-annotations/wf-self-type.rs
+++ b/src/test/ui/nll/user-annotations/wf-self-type.rs
@@ -9,7 +9,7 @@
 }
 
 pub fn foo<'a, 'b>(u: &'b ()) -> &'a () {
-    Foo::xmute(u) //~ ERROR unsatisfied lifetime constraints
+    Foo::xmute(u) //~ ERROR lifetime may not live long enough
 }
 
 fn main() {}
diff --git a/src/test/ui/nll/user-annotations/wf-self-type.stderr b/src/test/ui/nll/user-annotations/wf-self-type.stderr
index 401fe2a..00500c8 100644
--- a/src/test/ui/nll/user-annotations/wf-self-type.stderr
+++ b/src/test/ui/nll/user-annotations/wf-self-type.stderr
@@ -1,11 +1,11 @@
-error: unsatisfied lifetime constraints
+error: lifetime may not live long enough
   --> $DIR/wf-self-type.rs:12:5
    |
 LL | pub fn foo<'a, 'b>(u: &'b ()) -> &'a () {
    |            --  -- lifetime `'b` defined here
    |            |
    |            lifetime `'a` defined here
-LL |     Foo::xmute(u) //~ ERROR unsatisfied lifetime constraints
+LL |     Foo::xmute(u) //~ ERROR lifetime may not live long enough
    |     ^^^^^^^^^^^^^ returning this value requires that `'b` must outlive `'a`
 
 error: aborting due to previous error
diff --git a/src/test/ui/nll/where_clauses_in_functions.rs b/src/test/ui/nll/where_clauses_in_functions.rs
index 256ec60..0d35c09 100644
--- a/src/test/ui/nll/where_clauses_in_functions.rs
+++ b/src/test/ui/nll/where_clauses_in_functions.rs
@@ -11,7 +11,7 @@
 
 fn bar<'a, 'b>(x: &'a u32, y: &'b u32) -> (&'a u32, &'b u32) {
     foo(x, y)
-    //~^ ERROR unsatisfied lifetime constraints
+    //~^ ERROR lifetime may not live long enough
 }
 
 fn main() {}
diff --git a/src/test/ui/nll/where_clauses_in_functions.stderr b/src/test/ui/nll/where_clauses_in_functions.stderr
index 4419a19..f3b65ec 100644
--- a/src/test/ui/nll/where_clauses_in_functions.stderr
+++ b/src/test/ui/nll/where_clauses_in_functions.stderr
@@ -1,4 +1,4 @@
-error: unsatisfied lifetime constraints
+error: lifetime may not live long enough
   --> $DIR/where_clauses_in_functions.rs:13:5
    |
 LL | fn bar<'a, 'b>(x: &'a u32, y: &'b u32) -> (&'a u32, &'b u32) {
diff --git a/src/test/ui/nll/where_clauses_in_structs.rs b/src/test/ui/nll/where_clauses_in_structs.rs
index 1b02f26..8bc6b2e 100644
--- a/src/test/ui/nll/where_clauses_in_structs.rs
+++ b/src/test/ui/nll/where_clauses_in_structs.rs
@@ -11,7 +11,7 @@
 
 fn bar<'a, 'b>(x: Cell<&'a u32>, y: Cell<&'b u32>) {
     Foo { x, y };
-    //~^ ERROR unsatisfied lifetime constraints
+    //~^ ERROR lifetime may not live long enough
 }
 
 fn main() {}
diff --git a/src/test/ui/nll/where_clauses_in_structs.stderr b/src/test/ui/nll/where_clauses_in_structs.stderr
index 8704b0dc..e0feb40 100644
--- a/src/test/ui/nll/where_clauses_in_structs.stderr
+++ b/src/test/ui/nll/where_clauses_in_structs.stderr
@@ -1,4 +1,4 @@
-error: unsatisfied lifetime constraints
+error: lifetime may not live long enough
   --> $DIR/where_clauses_in_structs.rs:13:11
    |
 LL | fn bar<'a, 'b>(x: Cell<&'a u32>, y: Cell<&'b u32>) {
diff --git a/src/test/ui/no_crate_type.rs b/src/test/ui/no_crate_type.rs
index 43efdac..392c6fd 100644
--- a/src/test/ui/no_crate_type.rs
+++ b/src/test/ui/no_crate_type.rs
@@ -1,5 +1,5 @@
 // regression test for issue 11256
-#![crate_type]  //~ ERROR `crate_type` requires a value
+#![crate_type]  //~ ERROR attribute must be of the form
 
 fn main() {
     return
diff --git a/src/test/ui/no_crate_type.stderr b/src/test/ui/no_crate_type.stderr
index 9d691f3..6b76ab6 100644
--- a/src/test/ui/no_crate_type.stderr
+++ b/src/test/ui/no_crate_type.stderr
@@ -1,10 +1,8 @@
-error: `crate_type` requires a value
+error: attribute must be of the form `#[crate_type = "bin|lib|..."]`
   --> $DIR/no_crate_type.rs:2:1
    |
-LL | #![crate_type]  //~ ERROR `crate_type` requires a value
+LL | #![crate_type]  //~ ERROR attribute must be of the form
    | ^^^^^^^^^^^^^^
-   |
-   = note: for example: `#![crate_type="lib"]`
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/old-suffixes-are-really-forbidden.stderr b/src/test/ui/old-suffixes-are-really-forbidden.stderr
index 557e7ef..c54b72a 100644
--- a/src/test/ui/old-suffixes-are-really-forbidden.stderr
+++ b/src/test/ui/old-suffixes-are-really-forbidden.stderr
@@ -2,7 +2,7 @@
   --> $DIR/old-suffixes-are-really-forbidden.rs:2:13
    |
 LL |     let a = 1_is; //~ ERROR invalid suffix
-   |             ^^^^
+   |             ^^^^ invalid suffix `is`
    |
    = help: the suffix must be one of the integral types (`u32`, `isize`, etc)
 
@@ -10,7 +10,7 @@
   --> $DIR/old-suffixes-are-really-forbidden.rs:3:13
    |
 LL |     let b = 2_us; //~ ERROR invalid suffix
-   |             ^^^^
+   |             ^^^^ invalid suffix `us`
    |
    = help: the suffix must be one of the integral types (`u32`, `isize`, etc)
 
diff --git a/src/test/ui/on-unimplemented/bad-annotation.rs b/src/test/ui/on-unimplemented/bad-annotation.rs
index e5e921c..6843c4b 100644
--- a/src/test/ui/on-unimplemented/bad-annotation.rs
+++ b/src/test/ui/on-unimplemented/bad-annotation.rs
@@ -14,7 +14,8 @@
     fn my_from_iter<T: Iterator<Item=A>>(iterator: T) -> Self;
 }
 
-#[rustc_on_unimplemented] //~ ERROR `#[rustc_on_unimplemented]` requires a value
+#[rustc_on_unimplemented]
+//~^ ERROR attribute must be of the form
 trait BadAnnotation1
 {}
 
diff --git a/src/test/ui/on-unimplemented/bad-annotation.stderr b/src/test/ui/on-unimplemented/bad-annotation.stderr
index 70f6932..31b626e 100644
--- a/src/test/ui/on-unimplemented/bad-annotation.stderr
+++ b/src/test/ui/on-unimplemented/bad-annotation.stderr
@@ -1,25 +1,23 @@
-error[E0232]: `#[rustc_on_unimplemented]` requires a value
+error: attribute must be of the form `#[rustc_on_unimplemented(/*opt*/ message = "...", /*opt*/ label = "...", /*opt*/ note = "...")]` or `#[rustc_on_unimplemented = "message"]`
   --> $DIR/bad-annotation.rs:17:1
    |
-LL | #[rustc_on_unimplemented] //~ ERROR `#[rustc_on_unimplemented]` requires a value
-   | ^^^^^^^^^^^^^^^^^^^^^^^^^ value required here
-   |
-   = note: eg `#[rustc_on_unimplemented(message="foo")]`
+LL | #[rustc_on_unimplemented]
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^
 
 error[E0230]: there is no parameter `C` on trait `BadAnnotation2`
-  --> $DIR/bad-annotation.rs:21:1
+  --> $DIR/bad-annotation.rs:22:1
    |
 LL | #[rustc_on_unimplemented = "Unimplemented trait error on `{Self}` with params `<{A},{B},{C}>`"]
    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 error[E0231]: only named substitution parameters are allowed
-  --> $DIR/bad-annotation.rs:26:1
+  --> $DIR/bad-annotation.rs:27:1
    |
 LL | #[rustc_on_unimplemented = "Unimplemented trait error on `{Self}` with params `<{A},{B},{}>`"]
    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 error[E0232]: this attribute must have a valid value
-  --> $DIR/bad-annotation.rs:31:26
+  --> $DIR/bad-annotation.rs:32:26
    |
 LL | #[rustc_on_unimplemented(lorem="")]
    |                          ^^^^^^^^ expected value here
@@ -27,7 +25,7 @@
    = note: eg `#[rustc_on_unimplemented(message="foo")]`
 
 error[E0232]: this attribute must have a valid value
-  --> $DIR/bad-annotation.rs:35:26
+  --> $DIR/bad-annotation.rs:36:26
    |
 LL | #[rustc_on_unimplemented(lorem(ipsum(dolor)))]
    |                          ^^^^^^^^^^^^^^^^^^^ expected value here
@@ -35,7 +33,7 @@
    = note: eg `#[rustc_on_unimplemented(message="foo")]`
 
 error[E0232]: this attribute must have a valid value
-  --> $DIR/bad-annotation.rs:39:39
+  --> $DIR/bad-annotation.rs:40:39
    |
 LL | #[rustc_on_unimplemented(message="x", message="y")]
    |                                       ^^^^^^^^^^^ expected value here
@@ -43,7 +41,7 @@
    = note: eg `#[rustc_on_unimplemented(message="foo")]`
 
 error[E0232]: this attribute must have a valid value
-  --> $DIR/bad-annotation.rs:43:39
+  --> $DIR/bad-annotation.rs:44:39
    |
 LL | #[rustc_on_unimplemented(message="x", on(desugared, message="y"))]
    |                                       ^^^^^^^^^^^^^^^^^^^^^^^^^^ expected value here
@@ -51,13 +49,13 @@
    = note: eg `#[rustc_on_unimplemented(message="foo")]`
 
 error[E0232]: empty `on`-clause in `#[rustc_on_unimplemented]`
-  --> $DIR/bad-annotation.rs:47:26
+  --> $DIR/bad-annotation.rs:48:26
    |
 LL | #[rustc_on_unimplemented(on(), message="y")]
    |                          ^^^^ empty on-clause here
 
 error[E0232]: this attribute must have a valid value
-  --> $DIR/bad-annotation.rs:51:26
+  --> $DIR/bad-annotation.rs:52:26
    |
 LL | #[rustc_on_unimplemented(on="x", message="y")]
    |                          ^^^^^^ expected value here
@@ -65,7 +63,7 @@
    = note: eg `#[rustc_on_unimplemented(message="foo")]`
 
 error[E0232]: this attribute must have a valid value
-  --> $DIR/bad-annotation.rs:58:40
+  --> $DIR/bad-annotation.rs:59:40
    |
 LL | #[rustc_on_unimplemented(on(desugared, on(desugared, message="x")), message="y")]
    |                                        ^^^^^^^^^^^^^^^^^^^^^^^^^^ expected value here
diff --git a/src/test/ui/on-unimplemented/expected-comma-found-token.rs b/src/test/ui/on-unimplemented/expected-comma-found-token.rs
index a4e2a17..d8717f3 100644
--- a/src/test/ui/on-unimplemented/expected-comma-found-token.rs
+++ b/src/test/ui/on-unimplemented/expected-comma-found-token.rs
@@ -4,7 +4,7 @@
 
 #![feature(on_unimplemented)]
 
-#[rustc_on_unimplemented( //~ ERROR `#[rustc_on_unimplemented]` requires a value
+#[rustc_on_unimplemented(
     message="the message"
     label="the label" //~ ERROR expected one of `)` or `,`, found `label`
 )]
diff --git a/src/test/ui/on-unimplemented/expected-comma-found-token.stderr b/src/test/ui/on-unimplemented/expected-comma-found-token.stderr
index aa1b520..1e0808e 100644
--- a/src/test/ui/on-unimplemented/expected-comma-found-token.stderr
+++ b/src/test/ui/on-unimplemented/expected-comma-found-token.stderr
@@ -6,17 +6,5 @@
 LL |     label="the label" //~ ERROR expected one of `)` or `,`, found `label`
    |     ^^^^^ unexpected token
 
-error[E0232]: `#[rustc_on_unimplemented]` requires a value
-  --> $DIR/expected-comma-found-token.rs:7:1
-   |
-LL | / #[rustc_on_unimplemented( //~ ERROR `#[rustc_on_unimplemented]` requires a value
-LL | |     message="the message"
-LL | |     label="the label" //~ ERROR expected one of `)` or `,`, found `label`
-LL | | )]
-   | |__^ value required here
-   |
-   = note: eg `#[rustc_on_unimplemented(message="foo")]`
+error: aborting due to previous error
 
-error: aborting due to 2 previous errors
-
-For more information about this error, try `rustc --explain E0232`.
diff --git a/src/test/ui/parser/attr.rs b/src/test/ui/parser/attr.rs
index 041f30c..91a4abb 100644
--- a/src/test/ui/parser/attr.rs
+++ b/src/test/ui/parser/attr.rs
@@ -2,5 +2,6 @@
 
 fn main() {}
 
-#![lang(foo)] //~ ERROR an inner attribute is not permitted in this context
+#![lang = "foo"] //~ ERROR an inner attribute is not permitted in this context
+                 //~| ERROR definition of an unknown language item: `foo`
 fn foo() {}
diff --git a/src/test/ui/parser/attr.stderr b/src/test/ui/parser/attr.stderr
index 44714dc..8151bd7 100644
--- a/src/test/ui/parser/attr.stderr
+++ b/src/test/ui/parser/attr.stderr
@@ -1,10 +1,17 @@
 error: an inner attribute is not permitted in this context
   --> $DIR/attr.rs:5:3
    |
-LL | #![lang(foo)] //~ ERROR an inner attribute is not permitted in this context
+LL | #![lang = "foo"] //~ ERROR an inner attribute is not permitted in this context
    |   ^
    |
    = note: inner attributes, like `#![no_std]`, annotate the item enclosing them, and are usually found at the beginning of source files. Outer attributes, like `#[test]`, annotate the item following them.
 
-error: aborting due to previous error
+error[E0522]: definition of an unknown language item: `foo`
+  --> $DIR/attr.rs:5:1
+   |
+LL | #![lang = "foo"] //~ ERROR an inner attribute is not permitted in this context
+   | ^^^^^^^^^^^^^^^^ definition of unknown language item `foo`
 
+error: aborting due to 2 previous errors
+
+For more information about this error, try `rustc --explain E0522`.
diff --git a/src/test/ui/parser/bad-lit-suffixes.stderr b/src/test/ui/parser/bad-lit-suffixes.stderr
index 4fd2ab8..608c5fd 100644
--- a/src/test/ui/parser/bad-lit-suffixes.stderr
+++ b/src/test/ui/parser/bad-lit-suffixes.stderr
@@ -2,49 +2,49 @@
   --> $DIR/bad-lit-suffixes.rs:5:5
    |
 LL |     "C"suffix //~ ERROR ABI spec with a suffix is invalid
-   |     ^^^^^^^^^
+   |     ^^^^^^^^^ ABI spec with a suffix is invalid
 
 error: ABI spec with a suffix is invalid
   --> $DIR/bad-lit-suffixes.rs:9:5
    |
 LL |     "C"suffix //~ ERROR ABI spec with a suffix is invalid
-   |     ^^^^^^^^^
+   |     ^^^^^^^^^ ABI spec with a suffix is invalid
 
 error: string literal with a suffix is invalid
   --> $DIR/bad-lit-suffixes.rs:13:5
    |
 LL |     ""suffix; //~ ERROR string literal with a suffix is invalid
-   |     ^^^^^^^^
+   |     ^^^^^^^^ string literal with a suffix is invalid
 
 error: byte string literal with a suffix is invalid
   --> $DIR/bad-lit-suffixes.rs:14:5
    |
 LL |     b""suffix; //~ ERROR byte string literal with a suffix is invalid
-   |     ^^^^^^^^^
+   |     ^^^^^^^^^ byte string literal with a suffix is invalid
 
 error: string literal with a suffix is invalid
   --> $DIR/bad-lit-suffixes.rs:15:5
    |
 LL |     r#""#suffix; //~ ERROR string literal with a suffix is invalid
-   |     ^^^^^^^^^^^
+   |     ^^^^^^^^^^^ string literal with a suffix is invalid
 
 error: byte string literal with a suffix is invalid
   --> $DIR/bad-lit-suffixes.rs:16:5
    |
 LL |     br#""#suffix; //~ ERROR byte string literal with a suffix is invalid
-   |     ^^^^^^^^^^^^
+   |     ^^^^^^^^^^^^ byte string literal with a suffix is invalid
 
 error: char literal with a suffix is invalid
   --> $DIR/bad-lit-suffixes.rs:17:5
    |
 LL |     'a'suffix; //~ ERROR char literal with a suffix is invalid
-   |     ^^^^^^^^^
+   |     ^^^^^^^^^ char literal with a suffix is invalid
 
 error: byte literal with a suffix is invalid
   --> $DIR/bad-lit-suffixes.rs:18:5
    |
 LL |     b'a'suffix; //~ ERROR byte literal with a suffix is invalid
-   |     ^^^^^^^^^^
+   |     ^^^^^^^^^^ byte literal with a suffix is invalid
 
 error: invalid width `1024` for integer literal
   --> $DIR/bad-lit-suffixes.rs:20:5
@@ -82,7 +82,7 @@
   --> $DIR/bad-lit-suffixes.rs:25:5
    |
 LL |     1234suffix; //~ ERROR invalid suffix `suffix` for numeric literal
-   |     ^^^^^^^^^^
+   |     ^^^^^^^^^^ invalid suffix `suffix`
    |
    = help: the suffix must be one of the integral types (`u32`, `isize`, etc)
 
@@ -90,7 +90,7 @@
   --> $DIR/bad-lit-suffixes.rs:26:5
    |
 LL |     0b101suffix; //~ ERROR invalid suffix `suffix` for numeric literal
-   |     ^^^^^^^^^^^
+   |     ^^^^^^^^^^^ invalid suffix `suffix`
    |
    = help: the suffix must be one of the integral types (`u32`, `isize`, etc)
 
@@ -98,7 +98,7 @@
   --> $DIR/bad-lit-suffixes.rs:27:5
    |
 LL |     1.0suffix; //~ ERROR invalid suffix `suffix` for float literal
-   |     ^^^^^^^^^
+   |     ^^^^^^^^^ invalid suffix `suffix`
    |
    = help: valid suffixes are `f32` and `f64`
 
@@ -106,7 +106,7 @@
   --> $DIR/bad-lit-suffixes.rs:28:5
    |
 LL |     1.0e10suffix; //~ ERROR invalid suffix `suffix` for float literal
-   |     ^^^^^^^^^^^^
+   |     ^^^^^^^^^^^^ invalid suffix `suffix`
    |
    = help: valid suffixes are `f32` and `f64`
 
diff --git a/src/test/ui/parser/bad-pointer-type.rs b/src/test/ui/parser/bad-pointer-type.rs
index 0e5a011..59e5e0c 100644
--- a/src/test/ui/parser/bad-pointer-type.rs
+++ b/src/test/ui/parser/bad-pointer-type.rs
@@ -1,5 +1,5 @@
 fn foo(_: *()) {
-    //~^ expected mut or const in raw pointer type (use `*mut T` or `*const T` as appropriate)
+    //~^ ERROR expected mut or const in raw pointer type
 }
 
 fn main() {}
diff --git a/src/test/ui/parser/bad-pointer-type.stderr b/src/test/ui/parser/bad-pointer-type.stderr
index 860f9f9..e18c220 100644
--- a/src/test/ui/parser/bad-pointer-type.stderr
+++ b/src/test/ui/parser/bad-pointer-type.stderr
@@ -1,8 +1,10 @@
-error: expected mut or const in raw pointer type (use `*mut T` or `*const T` as appropriate)
+error: expected mut or const in raw pointer type
   --> $DIR/bad-pointer-type.rs:1:11
    |
 LL | fn foo(_: *()) {
-   |           ^
+   |           ^ expected mut or const in raw pointer type
+   |
+   = help: use `*mut T` or `*const T` as appropriate
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/parser/impl-parsing.stderr b/src/test/ui/parser/impl-parsing.stderr
index 308f14c..353f5e2 100644
--- a/src/test/ui/parser/impl-parsing.stderr
+++ b/src/test/ui/parser/impl-parsing.stderr
@@ -2,13 +2,13 @@
   --> $DIR/impl-parsing.rs:6:11
    |
 LL | impl Trait Type {} //~ ERROR missing `for` in a trait impl
-   |           ^
+   |           ^ help: add `for` here
 
 error: missing `for` in a trait impl
   --> $DIR/impl-parsing.rs:7:11
    |
 LL | impl Trait .. {} //~ ERROR missing `for` in a trait impl
-   |           ^
+   |           ^ help: add `for` here
 
 error: expected a trait, found type
   --> $DIR/impl-parsing.rs:8:6
diff --git a/src/test/ui/parser/issue-14303-fncall.rs b/src/test/ui/parser/issue-14303-fncall.rs
index f589434..17b9b76 100644
--- a/src/test/ui/parser/issue-14303-fncall.rs
+++ b/src/test/ui/parser/issue-14303-fncall.rs
@@ -1,6 +1,17 @@
-fn main() {
-    (0..4)
-    .map(|x| x * 2)
-    .collect::<Vec<'a, usize, 'b>>()
-    //~^ ERROR lifetime parameters must be declared prior to type parameters
+// can't run rustfix because it doesn't handle multipart suggestions correctly
+// compile-flags: -Zborrowck=mir
+// we need the above to avoid ast borrowck failure in recovered code
+
+struct S<'a, T> {
+    a: &'a T,
+    b: &'a T,
 }
+
+fn foo<'a, 'b>(start: &'a usize, end: &'a usize) {
+    let _x = (*start..*end)
+        .map(|x| S { a: start, b: end })
+        .collect::<Vec<S<_, 'a>>>();
+        //~^ ERROR lifetime parameters must be declared prior to type parameters
+}
+
+fn main() {}
diff --git a/src/test/ui/parser/issue-14303-fncall.stderr b/src/test/ui/parser/issue-14303-fncall.stderr
index 1cc82f5..2a73649 100644
--- a/src/test/ui/parser/issue-14303-fncall.stderr
+++ b/src/test/ui/parser/issue-14303-fncall.stderr
@@ -1,8 +1,12 @@
 error: lifetime parameters must be declared prior to type parameters
-  --> $DIR/issue-14303-fncall.rs:4:31
+  --> $DIR/issue-14303-fncall.rs:13:29
    |
-LL |     .collect::<Vec<'a, usize, 'b>>()
-   |                               ^^
+LL |         .collect::<Vec<S<_, 'a>>>();
+   |                             ^^ must be declared prior to type parameters
+help: move the lifetime parameter prior to the first type parameter
+   |
+LL |         .collect::<Vec<S<'a, _>>>();
+   |                          ^^^ --
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/parser/issue-14303-path.rs b/src/test/ui/parser/issue-14303-path.rs
index f61cb6b..a08c89f 100644
--- a/src/test/ui/parser/issue-14303-path.rs
+++ b/src/test/ui/parser/issue-14303-path.rs
@@ -1,4 +1,13 @@
-fn bar<'a, T>(x: mymodule::X<'a, T, 'b, 'c>) {}
+mod foo {
+    pub struct X<'a, 'b, 'c, T> {
+        a: &'a str,
+        b: &'b str,
+        c: &'c str,
+        t: T,
+    }
+}
+
+fn bar<'a, 'b, 'c, T>(x: foo::X<'a, T, 'b, 'c>) {}
 //~^ ERROR lifetime parameters must be declared prior to type parameters
 
 fn main() {}
diff --git a/src/test/ui/parser/issue-14303-path.stderr b/src/test/ui/parser/issue-14303-path.stderr
index 3de8a16..fb4fb32 100644
--- a/src/test/ui/parser/issue-14303-path.stderr
+++ b/src/test/ui/parser/issue-14303-path.stderr
@@ -1,8 +1,14 @@
 error: lifetime parameters must be declared prior to type parameters
-  --> $DIR/issue-14303-path.rs:1:37
+  --> $DIR/issue-14303-path.rs:10:40
    |
-LL | fn bar<'a, T>(x: mymodule::X<'a, T, 'b, 'c>) {}
-   |                                     ^^
+LL | fn bar<'a, 'b, 'c, T>(x: foo::X<'a, T, 'b, 'c>) {}
+   |                                        ^^  ^^ must be declared prior to type parameters
+   |                                        |
+   |                                        must be declared prior to type parameters
+help: move the lifetime parameters prior to the first type parameter
+   |
+LL | fn bar<'a, 'b, 'c, T>(x: foo::X<'a, 'b, 'c, T>) {}
+   |                                     ^^^ ^^^ --
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/parser/issue-17383.rs b/src/test/ui/parser/issue-17383.rs
index 9c00289..04cd43d 100644
--- a/src/test/ui/parser/issue-17383.rs
+++ b/src/test/ui/parser/issue-17383.rs
@@ -1,8 +1,7 @@
 enum X {
-    A =
-        b'a' //~ ERROR discriminator values can only be used with a field-less enum
-    ,
-    B(isize)
+    A = 3,
+    //~^ ERROR discriminator values can only be used with a field-less enum
+    B(usize)
 }
 
 fn main() {}
diff --git a/src/test/ui/parser/issue-17383.stderr b/src/test/ui/parser/issue-17383.stderr
index b225e11..57caa33 100644
--- a/src/test/ui/parser/issue-17383.stderr
+++ b/src/test/ui/parser/issue-17383.stderr
@@ -1,8 +1,8 @@
 error: discriminator values can only be used with a field-less enum
-  --> $DIR/issue-17383.rs:3:9
+  --> $DIR/issue-17383.rs:2:9
    |
-LL |         b'a' //~ ERROR discriminator values can only be used with a field-less enum
-   |         ^^^^
+LL |     A = 3,
+   |         ^ only valid in field-less enums
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/parser/issue-1802-1.rs b/src/test/ui/parser/issue-1802-1.rs
index 050e9a2..3c34b0d 100644
--- a/src/test/ui/parser/issue-1802-1.rs
+++ b/src/test/ui/parser/issue-1802-1.rs
@@ -1,4 +1,7 @@
-// error-pattern:no valid digits found for number
+fn log(a: i32, b: i32) {}
+
 fn main() {
+    let error = 42;
     log(error, 0b);
+    //~^ ERROR no valid digits found for number
 }
diff --git a/src/test/ui/parser/issue-1802-1.stderr b/src/test/ui/parser/issue-1802-1.stderr
index 5cd6a4f..b7d003d 100644
--- a/src/test/ui/parser/issue-1802-1.stderr
+++ b/src/test/ui/parser/issue-1802-1.stderr
@@ -1,5 +1,5 @@
 error: no valid digits found for number
-  --> $DIR/issue-1802-1.rs:3:16
+  --> $DIR/issue-1802-1.rs:5:16
    |
 LL |     log(error, 0b);
    |                ^^
diff --git a/src/test/ui/parser/issue-1802-2.rs b/src/test/ui/parser/issue-1802-2.rs
index 796db66..3c34b0d 100644
--- a/src/test/ui/parser/issue-1802-2.rs
+++ b/src/test/ui/parser/issue-1802-2.rs
@@ -1,4 +1,7 @@
-// error-pattern:no valid digits found for number
+fn log(a: i32, b: i32) {}
+
 fn main() {
-    log(error, 0b_usize);
+    let error = 42;
+    log(error, 0b);
+    //~^ ERROR no valid digits found for number
 }
diff --git a/src/test/ui/parser/issue-1802-2.stderr b/src/test/ui/parser/issue-1802-2.stderr
index c6c0427..8491dd0 100644
--- a/src/test/ui/parser/issue-1802-2.stderr
+++ b/src/test/ui/parser/issue-1802-2.stderr
@@ -1,8 +1,8 @@
 error: no valid digits found for number
-  --> $DIR/issue-1802-2.rs:3:16
+  --> $DIR/issue-1802-2.rs:5:16
    |
-LL |     log(error, 0b_usize);
-   |                ^^^
+LL |     log(error, 0b);
+   |                ^^
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/parser/issue-27255.rs b/src/test/ui/parser/issue-27255.rs
index c0ff331..d619688 100644
--- a/src/test/ui/parser/issue-27255.rs
+++ b/src/test/ui/parser/issue-27255.rs
@@ -1,3 +1,10 @@
-impl A .. {} //~ ERROR
+trait A {}
+
+impl A .. {}
+//~^ ERROR missing `for` in a trait impl
+//~| ERROR `impl Trait for .. {}` is an obsolete syntax
+
+impl A      usize {}
+//~^ ERROR missing `for` in a trait impl
 
 fn main() {}
diff --git a/src/test/ui/parser/issue-27255.stderr b/src/test/ui/parser/issue-27255.stderr
index 6d09d82..391a235 100644
--- a/src/test/ui/parser/issue-27255.stderr
+++ b/src/test/ui/parser/issue-27255.stderr
@@ -1,8 +1,22 @@
 error: missing `for` in a trait impl
-  --> $DIR/issue-27255.rs:1:7
+  --> $DIR/issue-27255.rs:3:7
    |
-LL | impl A .. {} //~ ERROR
-   |       ^
+LL | impl A .. {}
+   |       ^ help: add `for` here
 
-error: aborting due to previous error
+error: missing `for` in a trait impl
+  --> $DIR/issue-27255.rs:7:7
+   |
+LL | impl A      usize {}
+   |       ^^^^^^ help: add `for` here
+
+error: `impl Trait for .. {}` is an obsolete syntax
+  --> $DIR/issue-27255.rs:3:1
+   |
+LL | impl A .. {}
+   | ^^^^^^^^^^^^
+   |
+   = help: use `auto trait Trait {}` instead
+
+error: aborting due to 3 previous errors
 
diff --git a/src/test/ui/parser/issue-32214.stderr b/src/test/ui/parser/issue-32214.stderr
index a01517d..a889513 100644
--- a/src/test/ui/parser/issue-32214.stderr
+++ b/src/test/ui/parser/issue-32214.stderr
@@ -2,7 +2,7 @@
   --> $DIR/issue-32214.rs:5:34
    |
 LL | pub fn test<W, I: Trait<Item=(), W> >() {}
-   |                                  ^
+   |                                  ^ must be declared prior to associated type bindings
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/parser/lex-bad-numeric-literals.stderr b/src/test/ui/parser/lex-bad-numeric-literals.stderr
index b1a9170..1fa23b8 100644
--- a/src/test/ui/parser/lex-bad-numeric-literals.stderr
+++ b/src/test/ui/parser/lex-bad-numeric-literals.stderr
@@ -110,7 +110,7 @@
   --> $DIR/lex-bad-numeric-literals.rs:5:5
    |
 LL |     0o2f32; //~ ERROR: octal float literal is not supported
-   |     ^^^^^^
+   |     ^^^^^^ not supported
 
 error: int literal is too large
   --> $DIR/lex-bad-numeric-literals.rs:16:5
@@ -128,13 +128,13 @@
   --> $DIR/lex-bad-numeric-literals.rs:23:5
    |
 LL |     0o123f64; //~ ERROR: octal float literal is not supported
-   |     ^^^^^^^^
+   |     ^^^^^^^^ not supported
 
 error: binary float literal is not supported
   --> $DIR/lex-bad-numeric-literals.rs:25:5
    |
 LL |     0b101f64; //~ ERROR: binary float literal is not supported
-   |     ^^^^^^^^
+   |     ^^^^^^^^ not supported
 
 error: aborting due to 23 previous errors
 
diff --git a/src/test/ui/parser/no-binary-float-literal.rs b/src/test/ui/parser/no-binary-float-literal.rs
index c078bf5..a42d2cb 100644
--- a/src/test/ui/parser/no-binary-float-literal.rs
+++ b/src/test/ui/parser/no-binary-float-literal.rs
@@ -1,7 +1,8 @@
-// error-pattern:binary float literal is not supported
-
 fn main() {
     0b101010f64;
+    //~^ ERROR binary float literal is not supported
     0b101.010;
+    //~^ ERROR binary float literal is not supported
     0b101p4f64;
+    //~^ ERROR invalid suffix `p4f64` for numeric literal
 }
diff --git a/src/test/ui/parser/no-binary-float-literal.stderr b/src/test/ui/parser/no-binary-float-literal.stderr
index 7ff3e28..21f415b 100644
--- a/src/test/ui/parser/no-binary-float-literal.stderr
+++ b/src/test/ui/parser/no-binary-float-literal.stderr
@@ -1,8 +1,22 @@
 error: binary float literal is not supported
-  --> $DIR/no-binary-float-literal.rs:5:5
+  --> $DIR/no-binary-float-literal.rs:4:5
    |
 LL |     0b101.010;
    |     ^^^^^^^^^
 
-error: aborting due to previous error
+error: binary float literal is not supported
+  --> $DIR/no-binary-float-literal.rs:2:5
+   |
+LL |     0b101010f64;
+   |     ^^^^^^^^^^^ not supported
+
+error: invalid suffix `p4f64` for numeric literal
+  --> $DIR/no-binary-float-literal.rs:6:5
+   |
+LL |     0b101p4f64;
+   |     ^^^^^^^^^^ invalid suffix `p4f64`
+   |
+   = help: the suffix must be one of the integral types (`u32`, `isize`, etc)
+
+error: aborting due to 3 previous errors
 
diff --git a/src/test/ui/parser/no-hex-float-literal.rs b/src/test/ui/parser/no-hex-float-literal.rs
index d830c96..bf11dee 100644
--- a/src/test/ui/parser/no-hex-float-literal.rs
+++ b/src/test/ui/parser/no-hex-float-literal.rs
@@ -1,7 +1,9 @@
-// error-pattern:hexadecimal float literal is not supported
-
 fn main() {
     0xABC.Df;
+    //~^ ERROR `{integer}` is a primitive type and therefore doesn't have fields
     0x567.89;
+    //~^ ERROR hexadecimal float literal is not supported
     0xDEAD.BEEFp-2f;
+    //~^ ERROR invalid suffix `f` for float literal
+    //~| ERROR `{integer}` is a primitive type and therefore doesn't have fields
 }
diff --git a/src/test/ui/parser/no-hex-float-literal.stderr b/src/test/ui/parser/no-hex-float-literal.stderr
index 1668cfe..258ab06 100644
--- a/src/test/ui/parser/no-hex-float-literal.stderr
+++ b/src/test/ui/parser/no-hex-float-literal.stderr
@@ -1,8 +1,29 @@
 error: hexadecimal float literal is not supported
-  --> $DIR/no-hex-float-literal.rs:5:5
+  --> $DIR/no-hex-float-literal.rs:4:5
    |
 LL |     0x567.89;
    |     ^^^^^^^^
 
-error: aborting due to previous error
+error: invalid suffix `f` for float literal
+  --> $DIR/no-hex-float-literal.rs:6:18
+   |
+LL |     0xDEAD.BEEFp-2f;
+   |                  ^^ invalid suffix `f`
+   |
+   = help: valid suffixes are `f32` and `f64`
 
+error[E0610]: `{integer}` is a primitive type and therefore doesn't have fields
+  --> $DIR/no-hex-float-literal.rs:2:11
+   |
+LL |     0xABC.Df;
+   |           ^^
+
+error[E0610]: `{integer}` is a primitive type and therefore doesn't have fields
+  --> $DIR/no-hex-float-literal.rs:6:12
+   |
+LL |     0xDEAD.BEEFp-2f;
+   |            ^^^^^
+
+error: aborting due to 4 previous errors
+
+For more information about this error, try `rustc --explain E0610`.
diff --git a/src/test/ui/parser/no-unsafe-self.stderr b/src/test/ui/parser/no-unsafe-self.stderr
index 364c22a..84779b0 100644
--- a/src/test/ui/parser/no-unsafe-self.stderr
+++ b/src/test/ui/parser/no-unsafe-self.stderr
@@ -2,37 +2,37 @@
   --> $DIR/no-unsafe-self.rs:4:17
    |
 LL |     fn foo(*mut self); //~ ERROR cannot pass `self` by raw pointer
-   |                 ^^^^
+   |                 ^^^^ cannot pass `self` by raw pointer
 
 error: cannot pass `self` by raw pointer
   --> $DIR/no-unsafe-self.rs:5:19
    |
 LL |     fn baz(*const self); //~ ERROR cannot pass `self` by raw pointer
-   |                   ^^^^
+   |                   ^^^^ cannot pass `self` by raw pointer
 
 error: cannot pass `self` by raw pointer
   --> $DIR/no-unsafe-self.rs:6:13
    |
 LL |     fn bar(*self); //~ ERROR cannot pass `self` by raw pointer
-   |             ^^^^
+   |             ^^^^ cannot pass `self` by raw pointer
 
 error: cannot pass `self` by raw pointer
   --> $DIR/no-unsafe-self.rs:11:17
    |
 LL |     fn foo(*mut self) { } //~ ERROR cannot pass `self` by raw pointer
-   |                 ^^^^
+   |                 ^^^^ cannot pass `self` by raw pointer
 
 error: cannot pass `self` by raw pointer
   --> $DIR/no-unsafe-self.rs:12:19
    |
 LL |     fn baz(*const self) { } //~ ERROR cannot pass `self` by raw pointer
-   |                   ^^^^
+   |                   ^^^^ cannot pass `self` by raw pointer
 
 error: cannot pass `self` by raw pointer
   --> $DIR/no-unsafe-self.rs:13:13
    |
 LL |     fn bar(*self) { } //~ ERROR cannot pass `self` by raw pointer
-   |             ^^^^
+   |             ^^^^ cannot pass `self` by raw pointer
 
 error: aborting due to 6 previous errors
 
diff --git a/src/test/ui/parser/pat-tuple-2.rs b/src/test/ui/parser/pat-tuple-2.rs
index 108278f..fd25499 100644
--- a/src/test/ui/parser/pat-tuple-2.rs
+++ b/src/test/ui/parser/pat-tuple-2.rs
@@ -1,5 +1,6 @@
 fn main() {
-    match 0 {
-        (pat, ..,) => {} //~ ERROR trailing comma is not permitted after `..`
+    match (0, 1, 2) {
+        (pat, ..,) => {}
+        //~^ ERROR trailing comma is not permitted after `..`
     }
 }
diff --git a/src/test/ui/parser/pat-tuple-2.stderr b/src/test/ui/parser/pat-tuple-2.stderr
index ec12336..c3a5c39 100644
--- a/src/test/ui/parser/pat-tuple-2.stderr
+++ b/src/test/ui/parser/pat-tuple-2.stderr
@@ -1,8 +1,8 @@
 error: trailing comma is not permitted after `..`
   --> $DIR/pat-tuple-2.rs:3:17
    |
-LL |         (pat, ..,) => {} //~ ERROR trailing comma is not permitted after `..`
-   |                 ^
+LL |         (pat, ..,) => {}
+   |                 ^ trailing comma is not permitted after `..`
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/parser/pat-tuple-3.rs b/src/test/ui/parser/pat-tuple-3.rs
index 63dcde4..e1e975d 100644
--- a/src/test/ui/parser/pat-tuple-3.rs
+++ b/src/test/ui/parser/pat-tuple-3.rs
@@ -1,5 +1,6 @@
 fn main() {
-    match 0 {
-        (.., pat, ..) => {} //~ ERROR `..` can only be used once per tuple or tuple struct pattern
+    match (0, 1, 2) {
+        (.., pat, ..) => {}
+        //~^ ERROR `..` can only be used once per tuple or tuple struct pattern
     }
 }
diff --git a/src/test/ui/parser/pat-tuple-3.stderr b/src/test/ui/parser/pat-tuple-3.stderr
index 90940eb..0ad7d27 100644
--- a/src/test/ui/parser/pat-tuple-3.stderr
+++ b/src/test/ui/parser/pat-tuple-3.stderr
@@ -1,8 +1,8 @@
 error: `..` can only be used once per tuple or tuple struct pattern
   --> $DIR/pat-tuple-3.rs:3:19
    |
-LL |         (.., pat, ..) => {} //~ ERROR `..` can only be used once per tuple or tuple struct pattern
-   |                   ^^
+LL |         (.., pat, ..) => {}
+   |                   ^^ can only be used once per pattern
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/parser/tag-variant-disr-non-nullary.rs b/src/test/ui/parser/tag-variant-disr-non-nullary.rs
index 35a36cb..83a3b72 100644
--- a/src/test/ui/parser/tag-variant-disr-non-nullary.rs
+++ b/src/test/ui/parser/tag-variant-disr-non-nullary.rs
@@ -1,12 +1,11 @@
-//error-pattern: discriminator values can only be used with a field-less enum
-
-enum color {
-    red = 0xff0000,
-    green = 0x00ff00,
-    blue = 0x0000ff,
-    black = 0x000000,
-    white = 0xffffff,
-    other (str),
+enum Color {
+    Red = 0xff0000,
+    //~^ ERROR discriminator values can only be used with a field-less enum
+    Green = 0x00ff00,
+    Blue = 0x0000ff,
+    Black = 0x000000,
+    White = 0xffffff,
+    Other(usize),
 }
 
 fn main() {}
diff --git a/src/test/ui/parser/tag-variant-disr-non-nullary.stderr b/src/test/ui/parser/tag-variant-disr-non-nullary.stderr
index aa45ea4..cc6312b 100644
--- a/src/test/ui/parser/tag-variant-disr-non-nullary.stderr
+++ b/src/test/ui/parser/tag-variant-disr-non-nullary.stderr
@@ -1,8 +1,17 @@
 error: discriminator values can only be used with a field-less enum
-  --> $DIR/tag-variant-disr-non-nullary.rs:8:13
+  --> $DIR/tag-variant-disr-non-nullary.rs:2:11
    |
-LL |     white = 0xffffff,
-   |             ^^^^^^^^
+LL |     Red = 0xff0000,
+   |           ^^^^^^^^ only valid in field-less enums
+LL |     //~^ ERROR discriminator values can only be used with a field-less enum
+LL |     Green = 0x00ff00,
+   |             ^^^^^^^^ only valid in field-less enums
+LL |     Blue = 0x0000ff,
+   |            ^^^^^^^^ only valid in field-less enums
+LL |     Black = 0x000000,
+   |             ^^^^^^^^ only valid in field-less enums
+LL |     White = 0xffffff,
+   |             ^^^^^^^^ only valid in field-less enums
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/parser/where_with_bound.rs b/src/test/ui/parser/where_with_bound.rs
index 3a1edb9..3ca45f1 100644
--- a/src/test/ui/parser/where_with_bound.rs
+++ b/src/test/ui/parser/where_with_bound.rs
@@ -1,4 +1,5 @@
 fn foo<T>() where <T>::Item: ToString, T: Iterator { }
 //~^ ERROR generic parameters on `where` clauses are reserved for future use
+//~| ERROR cannot find type `Item` in the crate root
 
 fn main() {}
diff --git a/src/test/ui/parser/where_with_bound.stderr b/src/test/ui/parser/where_with_bound.stderr
index e68f744..ff98b3f 100644
--- a/src/test/ui/parser/where_with_bound.stderr
+++ b/src/test/ui/parser/where_with_bound.stderr
@@ -2,7 +2,14 @@
   --> $DIR/where_with_bound.rs:1:19
    |
 LL | fn foo<T>() where <T>::Item: ToString, T: Iterator { }
-   |                   ^^^
+   |                   ^^^ currently unsupported
 
-error: aborting due to previous error
+error[E0412]: cannot find type `Item` in the crate root
+  --> $DIR/where_with_bound.rs:1:24
+   |
+LL | fn foo<T>() where <T>::Item: ToString, T: Iterator { }
+   |                        ^^^^ not found in the crate root
 
+error: aborting due to 2 previous errors
+
+For more information about this error, try `rustc --explain E0412`.
diff --git a/src/test/ui/pattern/const-pat-ice.rs b/src/test/ui/pattern/const-pat-ice.rs
index 6496a2a..865c54b 100644
--- a/src/test/ui/pattern/const-pat-ice.rs
+++ b/src/test/ui/pattern/const-pat-ice.rs
@@ -1,4 +1,5 @@
 // failure-status: 101
+// rustc-env:RUST_BACKTRACE=0
 
 // This is a repro test for an ICE in our pattern handling of constants.
 
diff --git a/src/test/ui/platform-intrinsic-params.rs b/src/test/ui/platform-intrinsic-params.rs
deleted file mode 100644
index 5759a10e..0000000
--- a/src/test/ui/platform-intrinsic-params.rs
+++ /dev/null
@@ -1,6 +0,0 @@
-#![feature(platform_intrinsics)]
-extern "platform-intrinsic" {
-    fn x86_mm_movemask_ps() -> i32; //~ERROR found 0, expected 1
-}
-
-fn main() { }
diff --git a/src/test/ui/platform-intrinsic-params.stderr b/src/test/ui/platform-intrinsic-params.stderr
deleted file mode 100644
index 17671ce..0000000
--- a/src/test/ui/platform-intrinsic-params.stderr
+++ /dev/null
@@ -1,9 +0,0 @@
-error[E0444]: platform-specific intrinsic has invalid number of arguments: found 0, expected 1
-  --> $DIR/platform-intrinsic-params.rs:3:5
-   |
-LL |     fn x86_mm_movemask_ps() -> i32; //~ERROR found 0, expected 1
-   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-error: aborting due to previous error
-
-For more information about this error, try `rustc --explain E0444`.
diff --git a/src/test/ui/point-to-type-err-cause-on-impl-trait-return-2.rs b/src/test/ui/point-to-type-err-cause-on-impl-trait-return-2.rs
new file mode 100644
index 0000000..50f1fe8
--- /dev/null
+++ b/src/test/ui/point-to-type-err-cause-on-impl-trait-return-2.rs
@@ -0,0 +1,17 @@
+fn unrelated() -> Result<(), std::string::ParseError> {  // #57664
+    let x = 0;
+
+    match x {
+        1 => {
+            let property_value_as_string = "a".parse()?;
+        }
+        2 => {
+            let value: &bool = unsafe { &42 };
+            //~^ ERROR mismatched types
+        }
+    };
+
+    Ok(())
+}
+
+fn main() {}
diff --git a/src/test/ui/point-to-type-err-cause-on-impl-trait-return-2.stderr b/src/test/ui/point-to-type-err-cause-on-impl-trait-return-2.stderr
new file mode 100644
index 0000000..edaa60e
--- /dev/null
+++ b/src/test/ui/point-to-type-err-cause-on-impl-trait-return-2.stderr
@@ -0,0 +1,12 @@
+error[E0308]: mismatched types
+  --> $DIR/point-to-type-err-cause-on-impl-trait-return-2.rs:9:41
+   |
+LL |             let value: &bool = unsafe { &42 };
+   |                                         ^^^ expected bool, found integer
+   |
+   = note: expected type `&bool`
+              found type `&{integer}`
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0308`.
diff --git a/src/test/ui/point-to-type-err-cause-on-impl-trait-return.rs b/src/test/ui/point-to-type-err-cause-on-impl-trait-return.rs
new file mode 100644
index 0000000..95b4036
--- /dev/null
+++ b/src/test/ui/point-to-type-err-cause-on-impl-trait-return.rs
@@ -0,0 +1,36 @@
+fn foo() -> impl std::fmt::Display {
+    if false {
+        return 0i32;
+    }
+    1u32
+    //~^ ERROR mismatched types
+}
+
+fn bar() -> impl std::fmt::Display {
+    if false {
+        return 0i32;
+    } else {
+        return 1u32;
+        //~^ ERROR mismatched types
+    }
+}
+
+fn baz() -> impl std::fmt::Display {
+    if false {
+    //~^ ERROR mismatched types
+        return 0i32;
+    } else {
+        1u32
+    }
+}
+
+fn qux() -> impl std::fmt::Display {
+    if false {
+        0i32
+    } else {
+        1u32
+        //~^ ERROR if and else have incompatible types
+    }
+}
+
+fn main() {}
diff --git a/src/test/ui/point-to-type-err-cause-on-impl-trait-return.stderr b/src/test/ui/point-to-type-err-cause-on-impl-trait-return.stderr
new file mode 100644
index 0000000..62da078
--- /dev/null
+++ b/src/test/ui/point-to-type-err-cause-on-impl-trait-return.stderr
@@ -0,0 +1,58 @@
+error[E0308]: mismatched types
+  --> $DIR/point-to-type-err-cause-on-impl-trait-return.rs:5:5
+   |
+LL |         return 0i32;
+   |                ---- expected because of this statement
+LL |     }
+LL |     1u32
+   |     ^^^^ expected i32, found u32
+   |
+   = note: expected type `i32`
+              found type `u32`
+
+error[E0308]: mismatched types
+  --> $DIR/point-to-type-err-cause-on-impl-trait-return.rs:13:16
+   |
+LL |         return 0i32;
+   |                ---- expected because of this statement
+LL |     } else {
+LL |         return 1u32;
+   |                ^^^^ expected i32, found u32
+   |
+   = note: expected type `i32`
+              found type `u32`
+
+error[E0308]: mismatched types
+  --> $DIR/point-to-type-err-cause-on-impl-trait-return.rs:19:5
+   |
+LL | /     if false {
+LL | |     //~^ ERROR mismatched types
+LL | |         return 0i32;
+   | |                ---- expected because of this statement
+LL | |     } else {
+LL | |         1u32
+LL | |     }
+   | |_____^ expected i32, found u32
+   |
+   = note: expected type `i32`
+              found type `u32`
+
+error[E0308]: if and else have incompatible types
+  --> $DIR/point-to-type-err-cause-on-impl-trait-return.rs:31:9
+   |
+LL | /     if false {
+LL | |         0i32
+   | |         ---- expected because of this
+LL | |     } else {
+LL | |         1u32
+   | |         ^^^^ expected i32, found u32
+LL | |         //~^ ERROR if and else have incompatible types
+LL | |     }
+   | |_____- if and else have incompatible types
+   |
+   = note: expected type `i32`
+              found type `u32`
+
+error: aborting due to 4 previous errors
+
+For more information about this error, try `rustc --explain E0308`.
diff --git a/src/test/ui/privacy/private-in-public-assoc-ty.rs b/src/test/ui/privacy/private-in-public-assoc-ty.rs
index c6e86ed..81d2395 100644
--- a/src/test/ui/privacy/private-in-public-assoc-ty.rs
+++ b/src/test/ui/privacy/private-in-public-assoc-ty.rs
@@ -1,7 +1,7 @@
 // Private types and traits are not allowed in interfaces of associated types.
 // This test also ensures that the checks are performed even inside private modules.
 
-#![feature(associated_type_defaults)]
+#![feature(associated_type_defaults, existential_type)]
 
 mod m {
     struct Priv;
@@ -23,10 +23,17 @@
 
         type Alias4 = Priv;
         //~^ ERROR private type `m::Priv` in public interface
+
+        type Exist;
+        fn infer_exist() -> Self::Exist;
     }
     impl PubTr for u8 {
         type Alias1 = Priv;
         //~^ ERROR private type `m::Priv` in public interface
+
+        existential type Exist: PrivTr;
+        //~^ ERROR private trait `m::PrivTr` in public interface
+        fn infer_exist() -> Self::Exist { Priv }
     }
 }
 
diff --git a/src/test/ui/privacy/private-in-public-assoc-ty.stderr b/src/test/ui/privacy/private-in-public-assoc-ty.stderr
index 6740277..0e5dab1 100644
--- a/src/test/ui/privacy/private-in-public-assoc-ty.stderr
+++ b/src/test/ui/privacy/private-in-public-assoc-ty.stderr
@@ -6,7 +6,7 @@
 LL | |         //~| WARN this was previously accepted
 LL | |         //~| WARN private type `m::Priv` in public interface
 ...  |
-LL | |         //~^ ERROR private type `m::Priv` in public interface
+LL | |         fn infer_exist() -> Self::Exist;
 LL | |     }
    | |_____^
    |
@@ -22,7 +22,7 @@
 LL | |         //~| WARN this was previously accepted
 LL | |         //~| WARN private type `m::Priv` in public interface
 ...  |
-LL | |         //~^ ERROR private type `m::Priv` in public interface
+LL | |         fn infer_exist() -> Self::Exist;
 LL | |     }
    | |_____^
    |
@@ -39,7 +39,7 @@
    |         ^^^^^^^^^^^^^^^^^^^ can't leak private type
 
 error[E0446]: private type `m::Priv` in public interface
-  --> $DIR/private-in-public-assoc-ty.rs:28:9
+  --> $DIR/private-in-public-assoc-ty.rs:31:9
    |
 LL |     struct Priv;
    |     - `m::Priv` declared as private
@@ -47,6 +47,16 @@
 LL |         type Alias1 = Priv;
    |         ^^^^^^^^^^^^^^^^^^^ can't leak private type
 
-error: aborting due to 2 previous errors
+error[E0445]: private trait `m::PrivTr` in public interface
+  --> $DIR/private-in-public-assoc-ty.rs:34:9
+   |
+LL |     trait PrivTr {}
+   |     - `m::PrivTr` declared as private
+...
+LL |         existential type Exist: PrivTr;
+   |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ can't leak private trait
 
-For more information about this error, try `rustc --explain E0446`.
+error: aborting due to 3 previous errors
+
+Some errors occurred: E0445, E0446.
+For more information about an error, try `rustc --explain E0445`.
diff --git a/src/test/ui/privacy/private-in-public-existential.rs b/src/test/ui/privacy/private-in-public-existential.rs
index 95658f4..61c6130 100644
--- a/src/test/ui/privacy/private-in-public-existential.rs
+++ b/src/test/ui/privacy/private-in-public-existential.rs
@@ -12,4 +12,14 @@
     Priv
 }
 
+pub trait Trait {
+    type Pub: Default;
+    fn method() -> Self::Pub;
+}
+
+impl Trait for u8 {
+    existential type Pub: Default;
+    fn method() -> Self::Pub { Priv }
+}
+
 fn main() {}
diff --git a/src/test/ui/proc-macro/attribute.rs b/src/test/ui/proc-macro/attribute.rs
index 736030f..a0b982d 100644
--- a/src/test/ui/proc-macro/attribute.rs
+++ b/src/test/ui/proc-macro/attribute.rs
@@ -6,13 +6,13 @@
 extern crate proc_macro;
 
 #[proc_macro_derive]
-//~^ ERROR: attribute must be of form: #[proc_macro_derive(TraitName)]
+//~^ ERROR: attribute must be of the form
 pub fn foo1(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
     input
 }
 
 #[proc_macro_derive = "foo"]
-//~^ ERROR: attribute must be of form: #[proc_macro_derive(TraitName)]
+//~^ ERROR: attribute must be of the form
 pub fn foo2(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
     input
 }
diff --git a/src/test/ui/proc-macro/attribute.stderr b/src/test/ui/proc-macro/attribute.stderr
index a8fecd2..231eb1f 100644
--- a/src/test/ui/proc-macro/attribute.stderr
+++ b/src/test/ui/proc-macro/attribute.stderr
@@ -1,15 +1,3 @@
-error: attribute must be of form: #[proc_macro_derive(TraitName)]
-  --> $DIR/attribute.rs:8:1
-   |
-LL | #[proc_macro_derive]
-   | ^^^^^^^^^^^^^^^^^^^^
-
-error: attribute must be of form: #[proc_macro_derive(TraitName)]
-  --> $DIR/attribute.rs:14:1
-   |
-LL | #[proc_macro_derive = "foo"]
-   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
 error: must only be one word
   --> $DIR/attribute.rs:21:5
    |
@@ -46,5 +34,17 @@
 LL | #[proc_macro_derive(l, attributes(m), n)]
    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
+error: attribute must be of the form `#[proc_macro_derive(TraitName, /*opt*/ attributes(name1, name2, ...))]`
+  --> $DIR/attribute.rs:8:1
+   |
+LL | #[proc_macro_derive]
+   | ^^^^^^^^^^^^^^^^^^^^
+
+error: attribute must be of the form `#[proc_macro_derive(TraitName, /*opt*/ attributes(name1, name2, ...))]`
+  --> $DIR/attribute.rs:14:1
+   |
+LL | #[proc_macro_derive = "foo"]
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
 error: aborting due to 8 previous errors
 
diff --git a/src/test/ui/proc-macro/invalid-attributes.rs b/src/test/ui/proc-macro/invalid-attributes.rs
index 22ebc77..c5ec492 100644
--- a/src/test/ui/proc-macro/invalid-attributes.rs
+++ b/src/test/ui/proc-macro/invalid-attributes.rs
@@ -7,20 +7,20 @@
 
 use proc_macro::TokenStream;
 
-#[proc_macro = "test"] //~ ERROR: does not take any arguments
+#[proc_macro = "test"] //~ ERROR attribute must be of the form
 pub fn a(a: TokenStream) -> TokenStream { a }
 
-#[proc_macro()] //~ ERROR: does not take any arguments
+#[proc_macro()] //~ ERROR attribute must be of the form
 pub fn c(a: TokenStream) -> TokenStream { a }
 
-#[proc_macro(x)] //~ ERROR: does not take any arguments
+#[proc_macro(x)] //~ ERROR attribute must be of the form
 pub fn d(a: TokenStream) -> TokenStream { a }
 
-#[proc_macro_attribute = "test"] //~ ERROR: does not take any arguments
+#[proc_macro_attribute = "test"] //~ ERROR attribute must be of the form
 pub fn e(_: TokenStream, a: TokenStream) -> TokenStream { a }
 
-#[proc_macro_attribute()] //~ ERROR: does not take any arguments
+#[proc_macro_attribute()] //~ ERROR attribute must be of the form
 pub fn g(_: TokenStream, a: TokenStream) -> TokenStream { a }
 
-#[proc_macro_attribute(x)] //~ ERROR: does not take any arguments
+#[proc_macro_attribute(x)] //~ ERROR attribute must be of the form
 pub fn h(_: TokenStream, a: TokenStream) -> TokenStream { a }
diff --git a/src/test/ui/proc-macro/invalid-attributes.stderr b/src/test/ui/proc-macro/invalid-attributes.stderr
index 31c42bc..06a7ef2 100644
--- a/src/test/ui/proc-macro/invalid-attributes.stderr
+++ b/src/test/ui/proc-macro/invalid-attributes.stderr
@@ -1,37 +1,37 @@
-error: `#[proc_macro]` attribute does not take any arguments
+error: attribute must be of the form `#[proc_macro]`
   --> $DIR/invalid-attributes.rs:10:1
    |
-LL | #[proc_macro = "test"] //~ ERROR: does not take any arguments
+LL | #[proc_macro = "test"] //~ ERROR attribute must be of the form
    | ^^^^^^^^^^^^^^^^^^^^^^
 
-error: `#[proc_macro]` attribute does not take any arguments
+error: attribute must be of the form `#[proc_macro]`
   --> $DIR/invalid-attributes.rs:13:1
    |
-LL | #[proc_macro()] //~ ERROR: does not take any arguments
+LL | #[proc_macro()] //~ ERROR attribute must be of the form
    | ^^^^^^^^^^^^^^^
 
-error: `#[proc_macro]` attribute does not take any arguments
+error: attribute must be of the form `#[proc_macro]`
   --> $DIR/invalid-attributes.rs:16:1
    |
-LL | #[proc_macro(x)] //~ ERROR: does not take any arguments
+LL | #[proc_macro(x)] //~ ERROR attribute must be of the form
    | ^^^^^^^^^^^^^^^^
 
-error: `#[proc_macro_attribute]` attribute does not take any arguments
+error: attribute must be of the form `#[proc_macro_attribute]`
   --> $DIR/invalid-attributes.rs:19:1
    |
-LL | #[proc_macro_attribute = "test"] //~ ERROR: does not take any arguments
+LL | #[proc_macro_attribute = "test"] //~ ERROR attribute must be of the form
    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
-error: `#[proc_macro_attribute]` attribute does not take any arguments
+error: attribute must be of the form `#[proc_macro_attribute]`
   --> $DIR/invalid-attributes.rs:22:1
    |
-LL | #[proc_macro_attribute()] //~ ERROR: does not take any arguments
+LL | #[proc_macro_attribute()] //~ ERROR attribute must be of the form
    | ^^^^^^^^^^^^^^^^^^^^^^^^^
 
-error: `#[proc_macro_attribute]` attribute does not take any arguments
+error: attribute must be of the form `#[proc_macro_attribute]`
   --> $DIR/invalid-attributes.rs:25:1
    |
-LL | #[proc_macro_attribute(x)] //~ ERROR: does not take any arguments
+LL | #[proc_macro_attribute(x)] //~ ERROR attribute must be of the form
    | ^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 error: aborting due to 6 previous errors
diff --git a/src/test/ui/proc-macro/span-preservation.stderr b/src/test/ui/proc-macro/span-preservation.stderr
index 1f9103a..db52490 100644
--- a/src/test/ui/proc-macro/span-preservation.stderr
+++ b/src/test/ui/proc-macro/span-preservation.stderr
@@ -15,6 +15,9 @@
 error[E0308]: mismatched types
   --> $DIR/span-preservation.rs:19:29
    |
+LL | fn b(x: Option<isize>) -> usize {
+   |                           ----- expected `usize` because of return type
+LL |     match x {
 LL |         Some(x) => { return x }, //~ ERROR mismatched types
    |                             ^ expected usize, found isize
 
diff --git a/src/test/ui/regions/regions-static-bound.nll.stderr b/src/test/ui/regions/regions-static-bound.nll.stderr
index f667afd..d6cec03 100644
--- a/src/test/ui/regions/regions-static-bound.nll.stderr
+++ b/src/test/ui/regions/regions-static-bound.nll.stderr
@@ -1,4 +1,4 @@
-error: unsatisfied lifetime constraints
+error: lifetime may not live long enough
   --> $DIR/regions-static-bound.rs:9:5
    |
 LL | fn static_id_wrong_way<'a>(t: &'a ()) -> &'static () where 'static: 'a {
diff --git a/src/test/ui/regions/regions-static-bound.rs b/src/test/ui/regions/regions-static-bound.rs
index 3ee5187..c1a15e5 100644
--- a/src/test/ui/regions/regions-static-bound.rs
+++ b/src/test/ui/regions/regions-static-bound.rs
@@ -7,7 +7,7 @@
     where 'a: 'b, 'b: 'static { t }
 fn static_id_wrong_way<'a>(t: &'a ()) -> &'static () where 'static: 'a {
     t //[ll]~ ERROR E0312
-        //[nll]~^ ERROR unsatisfied lifetime constraints
+        //[nll]~^ ERROR lifetime may not live long enough
 }
 
 fn error(u: &(), v: &()) {
diff --git a/src/test/ui/repr.rs b/src/test/ui/repr.rs
index a35252c41..9d84474 100644
--- a/src/test/ui/repr.rs
+++ b/src/test/ui/repr.rs
@@ -1,15 +1,13 @@
-// compile-pass
-
 #[repr]
-//^ WARN `repr` attribute must have a hint
+//~^ ERROR attribute must be of the form
 struct _A {}
 
 #[repr = "B"]
-//^ WARN `repr` attribute isn't configurable with a literal
+//~^ ERROR attribute must be of the form
 struct _B {}
 
 #[repr = "C"]
-//^ WARN `repr` attribute isn't configurable with a literal
+//~^ ERROR attribute must be of the form
 struct _C {}
 
 #[repr(C)]
diff --git a/src/test/ui/repr.stderr b/src/test/ui/repr.stderr
index 503d47c..7ebfe08 100644
--- a/src/test/ui/repr.stderr
+++ b/src/test/ui/repr.stderr
@@ -1,25 +1,20 @@
-warning: `repr` attribute must have a hint
-  --> $DIR/repr.rs:3:1
+error: attribute must be of the form `#[repr(C, packed, ...)]`
+  --> $DIR/repr.rs:1:1
    |
 LL | #[repr]
-   | ^^^^^^^ needs a hint
-   |
-   = note: #[warn(bad_repr)] on by default
-   = help: valid hints include `#[repr(C)]`, `#[repr(packed)]`, `#[repr(rust)]` and `#[repr(transparent)]`
-   = note: for more information, visit <https://doc.rust-lang.org/reference/type-layout.html>
+   | ^^^^^^^
 
-warning: `repr` attribute isn't configurable with a literal
-  --> $DIR/repr.rs:7:1
+error: attribute must be of the form `#[repr(C, packed, ...)]`
+  --> $DIR/repr.rs:5:1
    |
 LL | #[repr = "B"]
-   | ^^^^^^^^^^^^^ needs a hint
-   |
-   = help: valid hints include `#[repr(C)]`, `#[repr(packed)]`, `#[repr(rust)]` and `#[repr(transparent)]`
-   = note: for more information, visit <https://doc.rust-lang.org/reference/type-layout.html>
+   | ^^^^^^^^^^^^^
 
-warning: `repr` attribute isn't configurable with a literal
-  --> $DIR/repr.rs:11:1
+error: attribute must be of the form `#[repr(C, packed, ...)]`
+  --> $DIR/repr.rs:9:1
    |
 LL | #[repr = "C"]
-   | ^^^^^^^^^^^^^ help: give `repr` a hint: `#[repr(C)]`
+   | ^^^^^^^^^^^^^
+
+error: aborting due to 3 previous errors
 
diff --git a/src/test/ui/resolve/resolve-hint-macro.stderr b/src/test/ui/resolve/resolve-hint-macro.stderr
index 4f6d0f6..ebe3c36 100644
--- a/src/test/ui/resolve/resolve-hint-macro.stderr
+++ b/src/test/ui/resolve/resolve-hint-macro.stderr
@@ -2,7 +2,7 @@
   --> $DIR/resolve-hint-macro.rs:2:5
    |
 LL |     assert(true);
-   |     ^^^^^^ did you mean `assert!(...)`?
+   |     ^^^^^^ help: use `!` to invoke the macro: `assert!`
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/resolve/suggest-path-instead-of-mod-dot-item.stderr b/src/test/ui/resolve/suggest-path-instead-of-mod-dot-item.stderr
index 8a9426b..b7b158c 100644
--- a/src/test/ui/resolve/suggest-path-instead-of-mod-dot-item.stderr
+++ b/src/test/ui/resolve/suggest-path-instead-of-mod-dot-item.stderr
@@ -4,15 +4,15 @@
 LL |     a.I
    |     ^--
    |     |
-   |     did you mean `a::I`?
+   |     help: use the path separator to refer to an item: `a::I`
 
 error[E0423]: expected value, found module `a`
   --> $DIR/suggest-path-instead-of-mod-dot-item.rs:22:5
    |
 LL |     a.g()
-   |     ^----
+   |     ^--
    |     |
-   |     did you mean `a::g(...)`?
+   |     help: use the path separator to refer to an item: `a::g`
 
 error[E0423]: expected value, found module `a`
   --> $DIR/suggest-path-instead-of-mod-dot-item.rs:27:5
@@ -20,16 +20,21 @@
 LL |     a.b.J
    |     ^--
    |     |
-   |     did you mean `a::b`?
+   |     help: use the path separator to refer to an item: `a::b`
 
 error[E0423]: expected value, found module `a::b`
   --> $DIR/suggest-path-instead-of-mod-dot-item.rs:32:5
    |
 LL |     a::b.J
-   |     ^^^---
-   |     |  |
-   |     |  help: a constant with a similar name exists: `I`
-   |     did you mean `a::b::J`?
+   |     ^^^^
+help: a constant with a similar name exists
+   |
+LL |     a::I.J
+   |        ^
+help: use the path separator to refer to an item
+   |
+LL |     a::b::J
+   |
 
 error[E0423]: expected value, found module `a`
   --> $DIR/suggest-path-instead-of-mod-dot-item.rs:37:5
@@ -37,7 +42,7 @@
 LL |     a.b.f();
    |     ^--
    |     |
-   |     did you mean `a::b`?
+   |     help: use the path separator to refer to an item: `a::b`
 
 error[E0423]: expected value, found module `a::b`
   --> $DIR/suggest-path-instead-of-mod-dot-item.rs:40:12
@@ -51,10 +56,15 @@
   --> $DIR/suggest-path-instead-of-mod-dot-item.rs:45:5
    |
 LL |     a::b.f()
-   |     ^^^-----
-   |     |  |
-   |     |  help: a constant with a similar name exists: `I`
-   |     did you mean `a::b::f(...)`?
+   |     ^^^^
+help: a constant with a similar name exists
+   |
+LL |     a::I.f()
+   |        ^
+help: use the path separator to refer to an item
+   |
+LL |     a::b::f()
+   |     ^^^^^^^
 
 error[E0423]: expected value, found module `a::b`
   --> $DIR/suggest-path-instead-of-mod-dot-item.rs:50:5
diff --git a/src/test/ui/return/return-from-diverging.stderr b/src/test/ui/return/return-from-diverging.stderr
index c84dd19..2862ae6 100644
--- a/src/test/ui/return/return-from-diverging.stderr
+++ b/src/test/ui/return/return-from-diverging.stderr
@@ -1,6 +1,8 @@
 error[E0308]: mismatched types
   --> $DIR/return-from-diverging.rs:4:12
    |
+LL | fn fail() -> ! {
+   |              - expected `!` because of return type
 LL |     return "wow"; //~ ERROR mismatched types
    |            ^^^^^ expected !, found reference
    |
diff --git a/src/test/ui/rfc-2008-non-exhaustive/invalid-attribute.rs b/src/test/ui/rfc-2008-non-exhaustive/invalid-attribute.rs
index 27db489..3375210 100644
--- a/src/test/ui/rfc-2008-non-exhaustive/invalid-attribute.rs
+++ b/src/test/ui/rfc-2008-non-exhaustive/invalid-attribute.rs
@@ -1,7 +1,7 @@
 #![feature(non_exhaustive)]
 
 #[non_exhaustive(anything)]
-//~^ ERROR attribute should be empty [E0702]
+//~^ ERROR attribute must be of the form
 struct Foo;
 
 #[non_exhaustive]
diff --git a/src/test/ui/rfc-2008-non-exhaustive/invalid-attribute.stderr b/src/test/ui/rfc-2008-non-exhaustive/invalid-attribute.stderr
index c069999..1d055fe 100644
--- a/src/test/ui/rfc-2008-non-exhaustive/invalid-attribute.stderr
+++ b/src/test/ui/rfc-2008-non-exhaustive/invalid-attribute.stderr
@@ -1,11 +1,8 @@
-error[E0702]: attribute should be empty
+error: attribute must be of the form `#[non_exhaustive]`
   --> $DIR/invalid-attribute.rs:3:1
    |
 LL | #[non_exhaustive(anything)]
    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^
-LL | //~^ ERROR attribute should be empty [E0702]
-LL | struct Foo;
-   | ----------- not empty
 
 error[E0701]: attribute can only be applied to a struct or enum
   --> $DIR/invalid-attribute.rs:7:1
@@ -30,5 +27,4 @@
 
 error: aborting due to 3 previous errors
 
-Some errors occurred: E0701, E0702.
-For more information about an error, try `rustc --explain E0701`.
+For more information about this error, try `rustc --explain E0701`.
diff --git a/src/test/ui/rfc-2126-extern-in-paths/auxiliary/xcrate.rs b/src/test/ui/rfc-2126-extern-in-paths/auxiliary/xcrate.rs
deleted file mode 100644
index c4d4447..0000000
--- a/src/test/ui/rfc-2126-extern-in-paths/auxiliary/xcrate.rs
+++ /dev/null
@@ -1,5 +0,0 @@
-#[derive(Debug)]
-pub struct S;
-
-#[derive(Debug)]
-pub struct Z;
diff --git a/src/test/ui/rfc-2126-extern-in-paths/non-existent-1.rs b/src/test/ui/rfc-2126-extern-in-paths/non-existent-1.rs
deleted file mode 100644
index 5e5e6c6..0000000
--- a/src/test/ui/rfc-2126-extern-in-paths/non-existent-1.rs
+++ /dev/null
@@ -1,5 +0,0 @@
-#![feature(extern_in_paths)]
-
-use extern::xcrate::S; //~ ERROR unresolved import `extern::xcrate`
-
-fn main() {}
diff --git a/src/test/ui/rfc-2126-extern-in-paths/non-existent-1.stderr b/src/test/ui/rfc-2126-extern-in-paths/non-existent-1.stderr
deleted file mode 100644
index 5b7528c..0000000
--- a/src/test/ui/rfc-2126-extern-in-paths/non-existent-1.stderr
+++ /dev/null
@@ -1,9 +0,0 @@
-error[E0432]: unresolved import `extern::xcrate`
-  --> $DIR/non-existent-1.rs:3:13
-   |
-LL | use extern::xcrate::S; //~ ERROR unresolved import `extern::xcrate`
-   |             ^^^^^^ could not find `xcrate` in `extern`
-
-error: aborting due to previous error
-
-For more information about this error, try `rustc --explain E0432`.
diff --git a/src/test/ui/rfc-2126-extern-in-paths/non-existent-2.rs b/src/test/ui/rfc-2126-extern-in-paths/non-existent-2.rs
deleted file mode 100644
index 0f26eef..0000000
--- a/src/test/ui/rfc-2126-extern-in-paths/non-existent-2.rs
+++ /dev/null
@@ -1,6 +0,0 @@
-#![feature(extern_in_paths)]
-
-fn main() {
-    let s = extern::xcrate::S;
-    //~^ ERROR failed to resolve: could not find `xcrate` in `extern`
-}
diff --git a/src/test/ui/rfc-2126-extern-in-paths/non-existent-2.stderr b/src/test/ui/rfc-2126-extern-in-paths/non-existent-2.stderr
deleted file mode 100644
index 21c2a0c..0000000
--- a/src/test/ui/rfc-2126-extern-in-paths/non-existent-2.stderr
+++ /dev/null
@@ -1,9 +0,0 @@
-error[E0433]: failed to resolve: could not find `xcrate` in `extern`
-  --> $DIR/non-existent-2.rs:4:21
-   |
-LL |     let s = extern::xcrate::S;
-   |                     ^^^^^^ could not find `xcrate` in `extern`
-
-error: aborting due to previous error
-
-For more information about this error, try `rustc --explain E0433`.
diff --git a/src/test/ui/rfc-2126-extern-in-paths/non-existent-3.rs b/src/test/ui/rfc-2126-extern-in-paths/non-existent-3.rs
deleted file mode 100644
index 1875fb9..0000000
--- a/src/test/ui/rfc-2126-extern-in-paths/non-existent-3.rs
+++ /dev/null
@@ -1,5 +0,0 @@
-#![feature(extern_in_paths)]
-
-use extern::ycrate; //~ ERROR unresolved import `extern::ycrate`
-
-fn main() {}
diff --git a/src/test/ui/rfc-2126-extern-in-paths/non-existent-3.stderr b/src/test/ui/rfc-2126-extern-in-paths/non-existent-3.stderr
deleted file mode 100644
index e2e7df6..0000000
--- a/src/test/ui/rfc-2126-extern-in-paths/non-existent-3.stderr
+++ /dev/null
@@ -1,9 +0,0 @@
-error[E0432]: unresolved import `extern::ycrate`
-  --> $DIR/non-existent-3.rs:3:5
-   |
-LL | use extern::ycrate; //~ ERROR unresolved import `extern::ycrate`
-   |     ^^^^^^^^^^^^^^ no `ycrate` external crate
-
-error: aborting due to previous error
-
-For more information about this error, try `rustc --explain E0432`.
diff --git a/src/test/ui/rfc-2126-extern-in-paths/single-segment.rs b/src/test/ui/rfc-2126-extern-in-paths/single-segment.rs
deleted file mode 100644
index 1d5af1e..0000000
--- a/src/test/ui/rfc-2126-extern-in-paths/single-segment.rs
+++ /dev/null
@@ -1,13 +0,0 @@
-// aux-build:xcrate.rs
-// compile-flags:--extern xcrate
-
-#![feature(extern_in_paths)]
-
-use extern; //~ ERROR unresolved import `extern`
-            //~^ NOTE no `extern` in the root
-use extern::*; //~ ERROR cannot glob-import all possible crates
-
-fn main() {
-    let s = extern::xcrate; //~ ERROR expected value, found module `extern::xcrate`
-                            //~^ NOTE not a value
-}
diff --git a/src/test/ui/rfc-2126-extern-in-paths/single-segment.stderr b/src/test/ui/rfc-2126-extern-in-paths/single-segment.stderr
deleted file mode 100644
index 2d8ecd4..0000000
--- a/src/test/ui/rfc-2126-extern-in-paths/single-segment.stderr
+++ /dev/null
@@ -1,22 +0,0 @@
-error: cannot glob-import all possible crates
-  --> $DIR/single-segment.rs:8:5
-   |
-LL | use extern::*; //~ ERROR cannot glob-import all possible crates
-   |     ^^^^^^^^^
-
-error[E0432]: unresolved import `extern`
-  --> $DIR/single-segment.rs:6:5
-   |
-LL | use extern; //~ ERROR unresolved import `extern`
-   |     ^^^^^^ no `extern` in the root
-
-error[E0423]: expected value, found module `extern::xcrate`
-  --> $DIR/single-segment.rs:11:13
-   |
-LL |     let s = extern::xcrate; //~ ERROR expected value, found module `extern::xcrate`
-   |             ^^^^^^^^^^^^^^ not a value
-
-error: aborting due to 3 previous errors
-
-Some errors occurred: E0423, E0432.
-For more information about an error, try `rustc --explain E0423`.
diff --git a/src/test/ui/simd-intrinsic/simd-intrinsic-declaration-type.rs b/src/test/ui/simd-intrinsic/simd-intrinsic-declaration-type.rs
deleted file mode 100644
index 7405678..0000000
--- a/src/test/ui/simd-intrinsic/simd-intrinsic-declaration-type.rs
+++ /dev/null
@@ -1,59 +0,0 @@
-#![feature(repr_simd, platform_intrinsics)]
-#![allow(non_camel_case_types)]
-
-#[repr(simd)]
-struct i16x8(i16, i16, i16, i16, i16, i16, i16, i16);
-#[repr(simd)]
-struct u16x8(u16, u16, u16, u16, u16, u16, u16, u16);
-
-#[repr(simd)]
-struct i8x16(i8, i8, i8, i8, i8, i8, i8, i8,
-             i8, i8, i8, i8, i8, i8, i8, i8);
-#[repr(simd)]
-struct i32x4(i32, i32, i32, i32);
-#[repr(simd)]
-struct f32x4(f32, f32, f32, f32);
-#[repr(simd)]
-struct i64x2(i64, i64);
-
-// correct signatures work well
-mod right {
-    use {i16x8, u16x8};
-    extern "platform-intrinsic" {
-        fn x86_mm_adds_epi16(x: i16x8, y: i16x8) -> i16x8;
-        fn x86_mm_adds_epu16(x: u16x8, y: u16x8) -> u16x8;
-    }
-}
-// but incorrect ones don't.
-
-mod signedness {
-    use {i16x8, u16x8};
-    // signedness matters
-    extern "platform-intrinsic" {
-        fn x86_mm_adds_epi16(x: u16x8, y: u16x8) -> u16x8;
-        //~^ ERROR intrinsic argument 1 has wrong type
-        //~^^ ERROR intrinsic argument 2 has wrong type
-        //~^^^ ERROR intrinsic return value has wrong type
-        fn x86_mm_adds_epu16(x: i16x8, y: i16x8) -> i16x8;
-        //~^ ERROR intrinsic argument 1 has wrong type
-        //~^^ ERROR intrinsic argument 2 has wrong type
-        //~^^^ ERROR intrinsic return value has wrong type
-    }
-}
-// as do lengths
-extern "platform-intrinsic" {
-    fn x86_mm_adds_epi16(x: i8x16, y: i32x4) -> i64x2;
-    //~^ ERROR intrinsic argument 1 has wrong type
-    //~^^ ERROR intrinsic argument 2 has wrong type
-    //~^^^ ERROR intrinsic return value has wrong type
-}
-// and so does int vs. float:
-extern "platform-intrinsic" {
-    fn x86_mm_max_ps(x: i32x4, y: i32x4) -> i32x4;
-    //~^ ERROR intrinsic argument 1 has wrong type
-    //~^^ ERROR intrinsic argument 2 has wrong type
-    //~^^^ ERROR intrinsic return value has wrong type
-}
-
-
-fn main() {}
diff --git a/src/test/ui/simd-intrinsic/simd-intrinsic-declaration-type.stderr b/src/test/ui/simd-intrinsic/simd-intrinsic-declaration-type.stderr
deleted file mode 100644
index 22df5e4..0000000
--- a/src/test/ui/simd-intrinsic/simd-intrinsic-declaration-type.stderr
+++ /dev/null
@@ -1,75 +0,0 @@
-error[E0442]: intrinsic argument 1 has wrong type: found vector with length 16, expected length 8
-  --> $DIR/simd-intrinsic-declaration-type.rs:45:5
-   |
-LL |     fn x86_mm_adds_epi16(x: i8x16, y: i32x4) -> i64x2;
-   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-error[E0442]: intrinsic argument 2 has wrong type: found vector with length 4, expected length 8
-  --> $DIR/simd-intrinsic-declaration-type.rs:45:5
-   |
-LL |     fn x86_mm_adds_epi16(x: i8x16, y: i32x4) -> i64x2;
-   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-error[E0442]: intrinsic return value has wrong type: found vector with length 2, expected length 8
-  --> $DIR/simd-intrinsic-declaration-type.rs:45:5
-   |
-LL |     fn x86_mm_adds_epi16(x: i8x16, y: i32x4) -> i64x2;
-   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-error[E0442]: intrinsic argument 1 has wrong type: found `i32`, expected `f32`
-  --> $DIR/simd-intrinsic-declaration-type.rs:52:5
-   |
-LL |     fn x86_mm_max_ps(x: i32x4, y: i32x4) -> i32x4;
-   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-error[E0442]: intrinsic argument 2 has wrong type: found `i32`, expected `f32`
-  --> $DIR/simd-intrinsic-declaration-type.rs:52:5
-   |
-LL |     fn x86_mm_max_ps(x: i32x4, y: i32x4) -> i32x4;
-   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-error[E0442]: intrinsic return value has wrong type: found `i32`, expected `f32`
-  --> $DIR/simd-intrinsic-declaration-type.rs:52:5
-   |
-LL |     fn x86_mm_max_ps(x: i32x4, y: i32x4) -> i32x4;
-   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-error[E0442]: intrinsic argument 1 has wrong type: found `u16`, expected `i16`
-  --> $DIR/simd-intrinsic-declaration-type.rs:33:9
-   |
-LL |         fn x86_mm_adds_epi16(x: u16x8, y: u16x8) -> u16x8;
-   |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-error[E0442]: intrinsic argument 2 has wrong type: found `u16`, expected `i16`
-  --> $DIR/simd-intrinsic-declaration-type.rs:33:9
-   |
-LL |         fn x86_mm_adds_epi16(x: u16x8, y: u16x8) -> u16x8;
-   |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-error[E0442]: intrinsic return value has wrong type: found `u16`, expected `i16`
-  --> $DIR/simd-intrinsic-declaration-type.rs:33:9
-   |
-LL |         fn x86_mm_adds_epi16(x: u16x8, y: u16x8) -> u16x8;
-   |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-error[E0442]: intrinsic argument 1 has wrong type: found `i16`, expected `u16`
-  --> $DIR/simd-intrinsic-declaration-type.rs:37:9
-   |
-LL |         fn x86_mm_adds_epu16(x: i16x8, y: i16x8) -> i16x8;
-   |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-error[E0442]: intrinsic argument 2 has wrong type: found `i16`, expected `u16`
-  --> $DIR/simd-intrinsic-declaration-type.rs:37:9
-   |
-LL |         fn x86_mm_adds_epu16(x: i16x8, y: i16x8) -> i16x8;
-   |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-error[E0442]: intrinsic return value has wrong type: found `i16`, expected `u16`
-  --> $DIR/simd-intrinsic-declaration-type.rs:37:9
-   |
-LL |         fn x86_mm_adds_epu16(x: i16x8, y: i16x8) -> i16x8;
-   |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-error: aborting due to 12 previous errors
-
-For more information about this error, try `rustc --explain E0442`.
diff --git a/src/test/ui/simd-intrinsic/simd-intrinsic-single-nominal-type.rs b/src/test/ui/simd-intrinsic/simd-intrinsic-single-nominal-type.rs
deleted file mode 100644
index f38ef2e..0000000
--- a/src/test/ui/simd-intrinsic/simd-intrinsic-single-nominal-type.rs
+++ /dev/null
@@ -1,23 +0,0 @@
-#![feature(repr_simd, platform_intrinsics)]
-
-#[repr(simd)]
-struct A(i16, i16, i16, i16, i16, i16, i16, i16);
-#[repr(simd)]
-struct B(i16, i16, i16, i16, i16, i16, i16, i16);
-
-// each intrinsic definition has to use the same nominal type for any
-// vector structure throughout that declaration (i.e., every instance
-// of i16x8 in each `fn ...;` needs to be either A or B)
-
-extern "platform-intrinsic" {
-    fn x86_mm_adds_epi16(x: A, y: A) -> B;
-    //~^ ERROR intrinsic return value has wrong type: found `B`, expected `A`
-    fn x86_mm_subs_epi16(x: A, y: B) -> A;
-    //~^ ERROR intrinsic argument 2 has wrong type: found `B`, expected `A`
-
-    // ok:
-    fn x86_mm_max_epi16(x: B, y: B) -> B;
-    fn x86_mm_min_epi16(x: A, y: A) -> A;
-}
-
-fn main() {}
diff --git a/src/test/ui/simd-intrinsic/simd-intrinsic-single-nominal-type.stderr b/src/test/ui/simd-intrinsic/simd-intrinsic-single-nominal-type.stderr
deleted file mode 100644
index 2754dd1..0000000
--- a/src/test/ui/simd-intrinsic/simd-intrinsic-single-nominal-type.stderr
+++ /dev/null
@@ -1,15 +0,0 @@
-error[E0443]: intrinsic return value has wrong type: found `B`, expected `A` which was used for this vector type previously in this signature
-  --> $DIR/simd-intrinsic-single-nominal-type.rs:13:5
-   |
-LL |     fn x86_mm_adds_epi16(x: A, y: A) -> B;
-   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-error[E0443]: intrinsic argument 2 has wrong type: found `B`, expected `A` which was used for this vector type previously in this signature
-  --> $DIR/simd-intrinsic-single-nominal-type.rs:15:5
-   |
-LL |     fn x86_mm_subs_epi16(x: A, y: B) -> A;
-   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-error: aborting due to 2 previous errors
-
-For more information about this error, try `rustc --explain E0443`.
diff --git a/src/test/ui/stability-attribute/stability-attribute-non-staged-force-unstable.rs b/src/test/ui/stability-attribute/stability-attribute-non-staged-force-unstable.rs
index 3c4d629..1f0a7a8 100644
--- a/src/test/ui/stability-attribute/stability-attribute-non-staged-force-unstable.rs
+++ b/src/test/ui/stability-attribute/stability-attribute-non-staged-force-unstable.rs
@@ -1,6 +1,6 @@
 // compile-flags:-Zforce-unstable-if-unmarked
 
-#[unstable] //~ ERROR: stability attributes may not be used
-#[stable] //~ ERROR: stability attributes may not be used
-#[rustc_deprecated] //~ ERROR: stability attributes may not be used
+#[unstable()] //~ ERROR: stability attributes may not be used
+#[stable()] //~ ERROR: stability attributes may not be used
+#[rustc_deprecated()] //~ ERROR: stability attributes may not be used
 fn main() { }
diff --git a/src/test/ui/stability-attribute/stability-attribute-non-staged-force-unstable.stderr b/src/test/ui/stability-attribute/stability-attribute-non-staged-force-unstable.stderr
index 2b8fb86..cd8ea92 100644
--- a/src/test/ui/stability-attribute/stability-attribute-non-staged-force-unstable.stderr
+++ b/src/test/ui/stability-attribute/stability-attribute-non-staged-force-unstable.stderr
@@ -1,20 +1,20 @@
 error: stability attributes may not be used outside of the standard library
   --> $DIR/stability-attribute-non-staged-force-unstable.rs:3:1
    |
-LL | #[unstable] //~ ERROR: stability attributes may not be used
-   | ^^^^^^^^^^^
+LL | #[unstable()] //~ ERROR: stability attributes may not be used
+   | ^^^^^^^^^^^^^
 
 error: stability attributes may not be used outside of the standard library
   --> $DIR/stability-attribute-non-staged-force-unstable.rs:4:1
    |
-LL | #[stable] //~ ERROR: stability attributes may not be used
-   | ^^^^^^^^^
+LL | #[stable()] //~ ERROR: stability attributes may not be used
+   | ^^^^^^^^^^^
 
 error: stability attributes may not be used outside of the standard library
   --> $DIR/stability-attribute-non-staged-force-unstable.rs:5:1
    |
-LL | #[rustc_deprecated] //~ ERROR: stability attributes may not be used
-   | ^^^^^^^^^^^^^^^^^^^
+LL | #[rustc_deprecated()] //~ ERROR: stability attributes may not be used
+   | ^^^^^^^^^^^^^^^^^^^^^
 
 error: aborting due to 3 previous errors
 
diff --git a/src/test/ui/stability-attribute/stability-attribute-non-staged.rs b/src/test/ui/stability-attribute/stability-attribute-non-staged.rs
index 3b22385..fc2c2b5 100644
--- a/src/test/ui/stability-attribute/stability-attribute-non-staged.rs
+++ b/src/test/ui/stability-attribute/stability-attribute-non-staged.rs
@@ -1,4 +1,4 @@
-#[unstable] //~ ERROR: stability attributes may not be used
-#[stable] //~ ERROR: stability attributes may not be used
-#[rustc_deprecated] //~ ERROR: stability attributes may not be used
+#[unstable()] //~ ERROR: stability attributes may not be used
+#[stable()] //~ ERROR: stability attributes may not be used
+#[rustc_deprecated()] //~ ERROR: stability attributes may not be used
 fn main() { }
diff --git a/src/test/ui/stability-attribute/stability-attribute-non-staged.stderr b/src/test/ui/stability-attribute/stability-attribute-non-staged.stderr
index ad437dd..67f6ef8 100644
--- a/src/test/ui/stability-attribute/stability-attribute-non-staged.stderr
+++ b/src/test/ui/stability-attribute/stability-attribute-non-staged.stderr
@@ -1,20 +1,20 @@
 error: stability attributes may not be used outside of the standard library
   --> $DIR/stability-attribute-non-staged.rs:1:1
    |
-LL | #[unstable] //~ ERROR: stability attributes may not be used
-   | ^^^^^^^^^^^
+LL | #[unstable()] //~ ERROR: stability attributes may not be used
+   | ^^^^^^^^^^^^^
 
 error: stability attributes may not be used outside of the standard library
   --> $DIR/stability-attribute-non-staged.rs:2:1
    |
-LL | #[stable] //~ ERROR: stability attributes may not be used
-   | ^^^^^^^^^
+LL | #[stable()] //~ ERROR: stability attributes may not be used
+   | ^^^^^^^^^^^
 
 error: stability attributes may not be used outside of the standard library
   --> $DIR/stability-attribute-non-staged.rs:3:1
    |
-LL | #[rustc_deprecated] //~ ERROR: stability attributes may not be used
-   | ^^^^^^^^^^^^^^^^^^^
+LL | #[rustc_deprecated()] //~ ERROR: stability attributes may not be used
+   | ^^^^^^^^^^^^^^^^^^^^^
 
 error: aborting due to 3 previous errors
 
diff --git a/src/test/ui/stability-attribute/stability-attribute-sanity-4.rs b/src/test/ui/stability-attribute/stability-attribute-sanity-4.rs
new file mode 100644
index 0000000..3fd54bc
--- /dev/null
+++ b/src/test/ui/stability-attribute/stability-attribute-sanity-4.rs
@@ -0,0 +1,29 @@
+// Various checks that stability attributes are used correctly, per RFC 507
+
+#![feature(staged_api)]
+
+#![stable(feature = "rust1", since = "1.0.0")]
+
+mod bogus_attribute_types_2 {
+    #[unstable] //~ ERROR attribute must be of the form
+    fn f1() { }
+
+    #[unstable = "b"] //~ ERROR attribute must be of the form
+    fn f2() { }
+
+    #[stable] //~ ERROR attribute must be of the form
+    fn f3() { }
+
+    #[stable = "a"] //~ ERROR attribute must be of the form
+    fn f4() { }
+
+    #[stable(feature = "a", since = "b")]
+    #[rustc_deprecated] //~ ERROR attribute must be of the form
+    fn f5() { }
+
+    #[stable(feature = "a", since = "b")]
+    #[rustc_deprecated = "a"] //~ ERROR attribute must be of the form
+    fn f6() { }
+}
+
+fn main() { }
diff --git a/src/test/ui/stability-attribute/stability-attribute-sanity-4.stderr b/src/test/ui/stability-attribute/stability-attribute-sanity-4.stderr
new file mode 100644
index 0000000..4b4efe9
--- /dev/null
+++ b/src/test/ui/stability-attribute/stability-attribute-sanity-4.stderr
@@ -0,0 +1,38 @@
+error: attribute must be of the form `#[unstable(feature = "name", reason = "...", issue = "N")]`
+  --> $DIR/stability-attribute-sanity-4.rs:8:5
+   |
+LL |     #[unstable] //~ ERROR attribute must be of the form
+   |     ^^^^^^^^^^^
+
+error: attribute must be of the form `#[unstable(feature = "name", reason = "...", issue = "N")]`
+  --> $DIR/stability-attribute-sanity-4.rs:11:5
+   |
+LL |     #[unstable = "b"] //~ ERROR attribute must be of the form
+   |     ^^^^^^^^^^^^^^^^^
+
+error: attribute must be of the form `#[stable(feature = "name", since = "version")]`
+  --> $DIR/stability-attribute-sanity-4.rs:14:5
+   |
+LL |     #[stable] //~ ERROR attribute must be of the form
+   |     ^^^^^^^^^
+
+error: attribute must be of the form `#[stable(feature = "name", since = "version")]`
+  --> $DIR/stability-attribute-sanity-4.rs:17:5
+   |
+LL |     #[stable = "a"] //~ ERROR attribute must be of the form
+   |     ^^^^^^^^^^^^^^^
+
+error: attribute must be of the form `#[rustc_deprecated(since = "version", reason = "...")]`
+  --> $DIR/stability-attribute-sanity-4.rs:21:5
+   |
+LL |     #[rustc_deprecated] //~ ERROR attribute must be of the form
+   |     ^^^^^^^^^^^^^^^^^^^
+
+error: attribute must be of the form `#[rustc_deprecated(since = "version", reason = "...")]`
+  --> $DIR/stability-attribute-sanity-4.rs:25:5
+   |
+LL |     #[rustc_deprecated = "a"] //~ ERROR attribute must be of the form
+   |     ^^^^^^^^^^^^^^^^^^^^^^^^^
+
+error: aborting due to 6 previous errors
+
diff --git a/src/test/ui/stability-attribute/stability-attribute-sanity.rs b/src/test/ui/stability-attribute/stability-attribute-sanity.rs
index cb10df9..aebdb3b 100644
--- a/src/test/ui/stability-attribute/stability-attribute-sanity.rs
+++ b/src/test/ui/stability-attribute/stability-attribute-sanity.rs
@@ -21,28 +21,6 @@
     fn f6() { }
 }
 
-mod bogus_attribute_types_2 {
-    #[unstable] //~ ERROR incorrect stability attribute type [E0548]
-    fn f1() { }
-
-    #[unstable = "b"] //~ ERROR incorrect stability attribute type [E0548]
-    fn f2() { }
-
-    #[stable] //~ ERROR incorrect stability attribute type [E0548]
-    fn f3() { }
-
-    #[stable = "a"] //~ ERROR incorrect stability attribute type [E0548]
-    fn f4() { }
-
-    #[stable(feature = "a", since = "b")]
-    #[rustc_deprecated] //~ ERROR incorrect stability attribute type [E0548]
-    fn f5() { }
-
-    #[stable(feature = "a", since = "b")]
-    #[rustc_deprecated = "a"] //~ ERROR incorrect stability attribute type [E0548]
-    fn f6() { }
-}
-
 mod missing_feature_names {
     #[unstable(issue = "0")] //~ ERROR missing 'feature' [E0546]
     fn f1() { }
diff --git a/src/test/ui/stability-attribute/stability-attribute-sanity.stderr b/src/test/ui/stability-attribute/stability-attribute-sanity.stderr
index 14c0728..74c1bbf 100644
--- a/src/test/ui/stability-attribute/stability-attribute-sanity.stderr
+++ b/src/test/ui/stability-attribute/stability-attribute-sanity.stderr
@@ -28,115 +28,79 @@
 LL |     #[stable(feature(b), since = "a")] //~ ERROR incorrect meta item [E0539]
    |              ^^^^^^^^^^
 
-error[E0548]: incorrect stability attribute type
-  --> $DIR/stability-attribute-sanity.rs:25:5
-   |
-LL |     #[unstable] //~ ERROR incorrect stability attribute type [E0548]
-   |     ^^^^^^^^^^^
-
-error[E0548]: incorrect stability attribute type
-  --> $DIR/stability-attribute-sanity.rs:28:5
-   |
-LL |     #[unstable = "b"] //~ ERROR incorrect stability attribute type [E0548]
-   |     ^^^^^^^^^^^^^^^^^
-
-error[E0548]: incorrect stability attribute type
-  --> $DIR/stability-attribute-sanity.rs:31:5
-   |
-LL |     #[stable] //~ ERROR incorrect stability attribute type [E0548]
-   |     ^^^^^^^^^
-
-error[E0548]: incorrect stability attribute type
-  --> $DIR/stability-attribute-sanity.rs:34:5
-   |
-LL |     #[stable = "a"] //~ ERROR incorrect stability attribute type [E0548]
-   |     ^^^^^^^^^^^^^^^
-
-error[E0548]: incorrect stability attribute type
-  --> $DIR/stability-attribute-sanity.rs:38:5
-   |
-LL |     #[rustc_deprecated] //~ ERROR incorrect stability attribute type [E0548]
-   |     ^^^^^^^^^^^^^^^^^^^
-
-error[E0548]: incorrect stability attribute type
-  --> $DIR/stability-attribute-sanity.rs:42:5
-   |
-LL |     #[rustc_deprecated = "a"] //~ ERROR incorrect stability attribute type [E0548]
-   |     ^^^^^^^^^^^^^^^^^^^^^^^^^
-
 error[E0546]: missing 'feature'
-  --> $DIR/stability-attribute-sanity.rs:47:5
+  --> $DIR/stability-attribute-sanity.rs:25:5
    |
 LL |     #[unstable(issue = "0")] //~ ERROR missing 'feature' [E0546]
    |     ^^^^^^^^^^^^^^^^^^^^^^^^
 
 error[E0547]: missing 'issue'
-  --> $DIR/stability-attribute-sanity.rs:50:5
+  --> $DIR/stability-attribute-sanity.rs:28:5
    |
 LL |     #[unstable(feature = "b")] //~ ERROR missing 'issue' [E0547]
    |     ^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 error[E0546]: missing 'feature'
-  --> $DIR/stability-attribute-sanity.rs:53:5
+  --> $DIR/stability-attribute-sanity.rs:31:5
    |
 LL |     #[stable(since = "a")] //~ ERROR missing 'feature' [E0546]
    |     ^^^^^^^^^^^^^^^^^^^^^^
 
 error[E0542]: missing 'since'
-  --> $DIR/stability-attribute-sanity.rs:58:5
+  --> $DIR/stability-attribute-sanity.rs:36:5
    |
 LL |     #[stable(feature = "a")] //~ ERROR missing 'since' [E0542]
    |     ^^^^^^^^^^^^^^^^^^^^^^^^
 
 error[E0542]: missing 'since'
-  --> $DIR/stability-attribute-sanity.rs:62:5
+  --> $DIR/stability-attribute-sanity.rs:40:5
    |
 LL |     #[rustc_deprecated(reason = "a")] //~ ERROR missing 'since' [E0542]
    |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 error[E0544]: multiple stability levels
-  --> $DIR/stability-attribute-sanity.rs:67:1
+  --> $DIR/stability-attribute-sanity.rs:45:1
    |
 LL | #[stable(feature = "a", since = "b")] //~ ERROR multiple stability levels [E0544]
    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 error[E0544]: multiple stability levels
-  --> $DIR/stability-attribute-sanity.rs:71:1
+  --> $DIR/stability-attribute-sanity.rs:49:1
    |
 LL | #[unstable(feature = "b", issue = "0")] //~ ERROR multiple stability levels [E0544]
    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 error[E0544]: multiple stability levels
-  --> $DIR/stability-attribute-sanity.rs:75:1
+  --> $DIR/stability-attribute-sanity.rs:53:1
    |
 LL | #[stable(feature = "a", since = "b")] //~ ERROR multiple stability levels [E0544]
    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 error[E0540]: multiple rustc_deprecated attributes
-  --> $DIR/stability-attribute-sanity.rs:83:1
+  --> $DIR/stability-attribute-sanity.rs:61:1
    |
 LL | pub const fn multiple4() { } //~ ERROR multiple rustc_deprecated attributes [E0540]
    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 error[E0553]: multiple rustc_const_unstable attributes
-  --> $DIR/stability-attribute-sanity.rs:83:1
+  --> $DIR/stability-attribute-sanity.rs:61:1
    |
 LL | pub const fn multiple4() { } //~ ERROR multiple rustc_deprecated attributes [E0540]
    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 error: Invalid stability or deprecation version found
-  --> $DIR/stability-attribute-sanity.rs:83:1
+  --> $DIR/stability-attribute-sanity.rs:61:1
    |
 LL | pub const fn multiple4() { } //~ ERROR multiple rustc_deprecated attributes [E0540]
    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 error[E0549]: rustc_deprecated attribute must be paired with either stable or unstable attribute
-  --> $DIR/stability-attribute-sanity.rs:88:1
+  --> $DIR/stability-attribute-sanity.rs:66:1
    |
 LL | fn deprecated_without_unstable_or_stable() { }
    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
-error: aborting due to 23 previous errors
+error: aborting due to 17 previous errors
 
-Some errors occurred: E0539, E0540, E0541, E0542, E0544, E0546, E0547, E0548, E0549...
+Some errors occurred: E0539, E0540, E0541, E0542, E0544, E0546, E0547, E0549, E0553.
 For more information about an error, try `rustc --explain E0539`.
diff --git a/src/test/ui/str/str-idx.stderr b/src/test/ui/str/str-idx.stderr
index 108096d..71b1747 100644
--- a/src/test/ui/str/str-idx.stderr
+++ b/src/test/ui/str/str-idx.stderr
@@ -5,6 +5,8 @@
    |                 ^^^^ `str` cannot be indexed by `{integer}`
    |
    = help: the trait `std::ops::Index<{integer}>` is not implemented for `str`
+   = note: you can use `.chars().nth()` or `.bytes().nth()`
+           see chapter in The Book <https://doc.rust-lang.org/book/ch08-02-strings.html#indexing-into-strings>
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/str/str-mut-idx.stderr b/src/test/ui/str/str-mut-idx.stderr
index a0c7c2c..a1212c5 100644
--- a/src/test/ui/str/str-mut-idx.stderr
+++ b/src/test/ui/str/str-mut-idx.stderr
@@ -29,6 +29,8 @@
    |     ^^^^^^^^^ `str` cannot be mutably indexed by `usize`
    |
    = help: the trait `std::ops::IndexMut<usize>` is not implemented for `str`
+   = note: you can use `.chars().nth()` or `.bytes().nth()`
+           see chapter in The Book <https://doc.rust-lang.org/book/ch08-02-strings.html#indexing-into-strings>
 
 error: aborting due to 3 previous errors
 
diff --git a/src/test/ui/suffixed-literal-meta.rs b/src/test/ui/suffixed-literal-meta.rs
index a311b65..bd2d662 100644
--- a/src/test/ui/suffixed-literal-meta.rs
+++ b/src/test/ui/suffixed-literal-meta.rs
@@ -1,13 +1,15 @@
-#[path = 1usize] //~ ERROR: suffixed literals are not allowed in attributes
-#[path = 1u8] //~ ERROR: suffixed literals are not allowed in attributes
-#[path = 1u16] //~ ERROR: suffixed literals are not allowed in attributes
-#[path = 1u32] //~ ERROR: suffixed literals are not allowed in attributes
-#[path = 1u64] //~ ERROR: suffixed literals are not allowed in attributes
-#[path = 1isize] //~ ERROR: suffixed literals are not allowed in attributes
-#[path = 1i8] //~ ERROR: suffixed literals are not allowed in attributes
-#[path = 1i16] //~ ERROR: suffixed literals are not allowed in attributes
-#[path = 1i32] //~ ERROR: suffixed literals are not allowed in attributes
-#[path = 1i64] //~ ERROR: suffixed literals are not allowed in attributes
-#[path = 1.0f32] //~ ERROR: suffixed literals are not allowed in attributes
-#[path = 1.0f64] //~ ERROR: suffixed literals are not allowed in attributes
+#![feature(custom_attribute)]
+
+#[my_attr = 1usize] //~ ERROR: suffixed literals are not allowed in attributes
+#[my_attr = 1u8] //~ ERROR: suffixed literals are not allowed in attributes
+#[my_attr = 1u16] //~ ERROR: suffixed literals are not allowed in attributes
+#[my_attr = 1u32] //~ ERROR: suffixed literals are not allowed in attributes
+#[my_attr = 1u64] //~ ERROR: suffixed literals are not allowed in attributes
+#[my_attr = 1isize] //~ ERROR: suffixed literals are not allowed in attributes
+#[my_attr = 1i8] //~ ERROR: suffixed literals are not allowed in attributes
+#[my_attr = 1i16] //~ ERROR: suffixed literals are not allowed in attributes
+#[my_attr = 1i32] //~ ERROR: suffixed literals are not allowed in attributes
+#[my_attr = 1i64] //~ ERROR: suffixed literals are not allowed in attributes
+#[my_attr = 1.0f32] //~ ERROR: suffixed literals are not allowed in attributes
+#[my_attr = 1.0f64] //~ ERROR: suffixed literals are not allowed in attributes
 fn main() { }
diff --git a/src/test/ui/suffixed-literal-meta.stderr b/src/test/ui/suffixed-literal-meta.stderr
index 2f3ad8a..265aa78 100644
--- a/src/test/ui/suffixed-literal-meta.stderr
+++ b/src/test/ui/suffixed-literal-meta.stderr
@@ -1,96 +1,96 @@
 error: suffixed literals are not allowed in attributes
-  --> $DIR/suffixed-literal-meta.rs:1:10
+  --> $DIR/suffixed-literal-meta.rs:3:13
    |
-LL | #[path = 1usize] //~ ERROR: suffixed literals are not allowed in attributes
-   |          ^^^^^^
+LL | #[my_attr = 1usize] //~ ERROR: suffixed literals are not allowed in attributes
+   |             ^^^^^^
    |
    = help: instead of using a suffixed literal (1u8, 1.0f32, etc.), use an unsuffixed version (1, 1.0, etc.).
 
 error: suffixed literals are not allowed in attributes
-  --> $DIR/suffixed-literal-meta.rs:2:10
+  --> $DIR/suffixed-literal-meta.rs:4:13
    |
-LL | #[path = 1u8] //~ ERROR: suffixed literals are not allowed in attributes
-   |          ^^^
+LL | #[my_attr = 1u8] //~ ERROR: suffixed literals are not allowed in attributes
+   |             ^^^
    |
    = help: instead of using a suffixed literal (1u8, 1.0f32, etc.), use an unsuffixed version (1, 1.0, etc.).
 
 error: suffixed literals are not allowed in attributes
-  --> $DIR/suffixed-literal-meta.rs:3:10
+  --> $DIR/suffixed-literal-meta.rs:5:13
    |
-LL | #[path = 1u16] //~ ERROR: suffixed literals are not allowed in attributes
-   |          ^^^^
+LL | #[my_attr = 1u16] //~ ERROR: suffixed literals are not allowed in attributes
+   |             ^^^^
    |
    = help: instead of using a suffixed literal (1u8, 1.0f32, etc.), use an unsuffixed version (1, 1.0, etc.).
 
 error: suffixed literals are not allowed in attributes
-  --> $DIR/suffixed-literal-meta.rs:4:10
+  --> $DIR/suffixed-literal-meta.rs:6:13
    |
-LL | #[path = 1u32] //~ ERROR: suffixed literals are not allowed in attributes
-   |          ^^^^
+LL | #[my_attr = 1u32] //~ ERROR: suffixed literals are not allowed in attributes
+   |             ^^^^
    |
    = help: instead of using a suffixed literal (1u8, 1.0f32, etc.), use an unsuffixed version (1, 1.0, etc.).
 
 error: suffixed literals are not allowed in attributes
-  --> $DIR/suffixed-literal-meta.rs:5:10
+  --> $DIR/suffixed-literal-meta.rs:7:13
    |
-LL | #[path = 1u64] //~ ERROR: suffixed literals are not allowed in attributes
-   |          ^^^^
+LL | #[my_attr = 1u64] //~ ERROR: suffixed literals are not allowed in attributes
+   |             ^^^^
    |
    = help: instead of using a suffixed literal (1u8, 1.0f32, etc.), use an unsuffixed version (1, 1.0, etc.).
 
 error: suffixed literals are not allowed in attributes
-  --> $DIR/suffixed-literal-meta.rs:6:10
+  --> $DIR/suffixed-literal-meta.rs:8:13
    |
-LL | #[path = 1isize] //~ ERROR: suffixed literals are not allowed in attributes
-   |          ^^^^^^
+LL | #[my_attr = 1isize] //~ ERROR: suffixed literals are not allowed in attributes
+   |             ^^^^^^
    |
    = help: instead of using a suffixed literal (1u8, 1.0f32, etc.), use an unsuffixed version (1, 1.0, etc.).
 
 error: suffixed literals are not allowed in attributes
-  --> $DIR/suffixed-literal-meta.rs:7:10
+  --> $DIR/suffixed-literal-meta.rs:9:13
    |
-LL | #[path = 1i8] //~ ERROR: suffixed literals are not allowed in attributes
-   |          ^^^
+LL | #[my_attr = 1i8] //~ ERROR: suffixed literals are not allowed in attributes
+   |             ^^^
    |
    = help: instead of using a suffixed literal (1u8, 1.0f32, etc.), use an unsuffixed version (1, 1.0, etc.).
 
 error: suffixed literals are not allowed in attributes
-  --> $DIR/suffixed-literal-meta.rs:8:10
+  --> $DIR/suffixed-literal-meta.rs:10:13
    |
-LL | #[path = 1i16] //~ ERROR: suffixed literals are not allowed in attributes
-   |          ^^^^
+LL | #[my_attr = 1i16] //~ ERROR: suffixed literals are not allowed in attributes
+   |             ^^^^
    |
    = help: instead of using a suffixed literal (1u8, 1.0f32, etc.), use an unsuffixed version (1, 1.0, etc.).
 
 error: suffixed literals are not allowed in attributes
-  --> $DIR/suffixed-literal-meta.rs:9:10
+  --> $DIR/suffixed-literal-meta.rs:11:13
    |
-LL | #[path = 1i32] //~ ERROR: suffixed literals are not allowed in attributes
-   |          ^^^^
+LL | #[my_attr = 1i32] //~ ERROR: suffixed literals are not allowed in attributes
+   |             ^^^^
    |
    = help: instead of using a suffixed literal (1u8, 1.0f32, etc.), use an unsuffixed version (1, 1.0, etc.).
 
 error: suffixed literals are not allowed in attributes
-  --> $DIR/suffixed-literal-meta.rs:10:10
+  --> $DIR/suffixed-literal-meta.rs:12:13
    |
-LL | #[path = 1i64] //~ ERROR: suffixed literals are not allowed in attributes
-   |          ^^^^
+LL | #[my_attr = 1i64] //~ ERROR: suffixed literals are not allowed in attributes
+   |             ^^^^
    |
    = help: instead of using a suffixed literal (1u8, 1.0f32, etc.), use an unsuffixed version (1, 1.0, etc.).
 
 error: suffixed literals are not allowed in attributes
-  --> $DIR/suffixed-literal-meta.rs:11:10
+  --> $DIR/suffixed-literal-meta.rs:13:13
    |
-LL | #[path = 1.0f32] //~ ERROR: suffixed literals are not allowed in attributes
-   |          ^^^^^^
+LL | #[my_attr = 1.0f32] //~ ERROR: suffixed literals are not allowed in attributes
+   |             ^^^^^^
    |
    = help: instead of using a suffixed literal (1u8, 1.0f32, etc.), use an unsuffixed version (1, 1.0, etc.).
 
 error: suffixed literals are not allowed in attributes
-  --> $DIR/suffixed-literal-meta.rs:12:10
+  --> $DIR/suffixed-literal-meta.rs:14:13
    |
-LL | #[path = 1.0f64] //~ ERROR: suffixed literals are not allowed in attributes
-   |          ^^^^^^
+LL | #[my_attr = 1.0f64] //~ ERROR: suffixed literals are not allowed in attributes
+   |             ^^^^^^
    |
    = help: instead of using a suffixed literal (1u8, 1.0f32, etc.), use an unsuffixed version (1, 1.0, etc.).
 
diff --git a/src/test/ui/suggestions/recover-from-semicolon-trailing-item.rs b/src/test/ui/suggestions/recover-from-semicolon-trailing-item.rs
new file mode 100644
index 0000000..82935af
--- /dev/null
+++ b/src/test/ui/suggestions/recover-from-semicolon-trailing-item.rs
@@ -0,0 +1,16 @@
+// verify that after encountering a semicolon after an item the parser recovers
+mod M {};
+//~^ ERROR expected item, found `;`
+struct S {};
+//~^ ERROR expected item, found `;`
+fn foo(a: usize) {};
+//~^ ERROR expected item, found `;`
+fn main() {
+    struct X {};  // ok
+    let _: usize = S {};
+    //~^ ERROR mismatched types
+    let _: usize = X {};
+    //~^ ERROR mismatched types
+    foo("");
+    //~^ ERROR mismatched types
+}
diff --git a/src/test/ui/suggestions/recover-from-semicolon-trailing-item.stderr b/src/test/ui/suggestions/recover-from-semicolon-trailing-item.stderr
new file mode 100644
index 0000000..9a47a1e
--- /dev/null
+++ b/src/test/ui/suggestions/recover-from-semicolon-trailing-item.stderr
@@ -0,0 +1,50 @@
+error: expected item, found `;`
+  --> $DIR/recover-from-semicolon-trailing-item.rs:2:9
+   |
+LL | mod M {};
+   |         ^ help: remove this semicolon
+
+error: expected item, found `;`
+  --> $DIR/recover-from-semicolon-trailing-item.rs:4:12
+   |
+LL | struct S {};
+   |            ^ help: remove this semicolon
+   |
+   = help: braced struct declarations are not followed by a semicolon
+
+error: expected item, found `;`
+  --> $DIR/recover-from-semicolon-trailing-item.rs:6:20
+   |
+LL | fn foo(a: usize) {};
+   |                    ^ help: remove this semicolon
+
+error[E0308]: mismatched types
+  --> $DIR/recover-from-semicolon-trailing-item.rs:10:20
+   |
+LL |     let _: usize = S {};
+   |                    ^^^^ expected usize, found struct `S`
+   |
+   = note: expected type `usize`
+              found type `S`
+
+error[E0308]: mismatched types
+  --> $DIR/recover-from-semicolon-trailing-item.rs:12:20
+   |
+LL |     let _: usize = X {};
+   |                    ^^^^ expected usize, found struct `main::X`
+   |
+   = note: expected type `usize`
+              found type `main::X`
+
+error[E0308]: mismatched types
+  --> $DIR/recover-from-semicolon-trailing-item.rs:14:9
+   |
+LL |     foo("");
+   |         ^^ expected usize, found reference
+   |
+   = note: expected type `usize`
+              found type `&'static str`
+
+error: aborting due to 6 previous errors
+
+For more information about this error, try `rustc --explain E0308`.
diff --git a/src/test/ui/suggestions/suggest-move-lifetimes.stderr b/src/test/ui/suggestions/suggest-move-lifetimes.stderr
index 72a2cbe..b36e927 100644
--- a/src/test/ui/suggestions/suggest-move-lifetimes.stderr
+++ b/src/test/ui/suggestions/suggest-move-lifetimes.stderr
@@ -16,7 +16,7 @@
 help: move the lifetime parameter prior to the first type parameter
    |
 LL | struct B<'a, T, U> { //~ ERROR lifetime parameters must be declared
-   |          ^^^   --
+   |          ^^^ --
 
 error: lifetime parameters must be declared prior to type parameters
   --> $DIR/suggest-move-lifetimes.rs:10:16
@@ -36,7 +36,7 @@
 help: move the lifetime parameter prior to the first type parameter
    |
 LL | struct D<'a, 'b, 'c, T, U, V> { //~ ERROR lifetime parameters must be declared
-   |          ^^^ ^^^ ^^^      ---
+   |          ^^^ ^^^ ^^^    -- --
 
 error: aborting due to 4 previous errors
 
diff --git a/src/test/ui/tail-typeck.stderr b/src/test/ui/tail-typeck.stderr
index eadf3d6..1170f5c 100644
--- a/src/test/ui/tail-typeck.stderr
+++ b/src/test/ui/tail-typeck.stderr
@@ -2,7 +2,9 @@
   --> $DIR/tail-typeck.rs:3:26
    |
 LL | fn f() -> isize { return g(); }
-   |                          ^^^ expected isize, found usize
+   |           -----          ^^^ expected isize, found usize
+   |           |
+   |           expected `isize` because of return type
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/target-feature-wrong.stderr b/src/test/ui/target-feature-wrong.stderr
index 2eeaa10..236f5c4 100644
--- a/src/test/ui/target-feature-wrong.stderr
+++ b/src/test/ui/target-feature-wrong.stderr
@@ -1,4 +1,4 @@
-error: #[target_feature] attribute must be of the form #[target_feature(..)]
+error: attribute must be of the form `#[target_feature(enable = "name")]`
   --> $DIR/target-feature-wrong.rs:16:1
    |
 LL | #[target_feature = "+sse2"]
diff --git a/src/test/ui/test-should-panic-attr.rs b/src/test/ui/test-should-panic-attr.rs
index 1b5afda..f936dd5 100644
--- a/src/test/ui/test-should-panic-attr.rs
+++ b/src/test/ui/test-should-panic-attr.rs
@@ -1,9 +1,8 @@
-// run-pass
+// compile-pass
 // compile-flags: --test
 
 #[test]
 #[should_panic = "foo"]
-//~^ WARN: attribute must be of the form:
 fn test1() {
     panic!();
 }
diff --git a/src/test/ui/test-should-panic-attr.stderr b/src/test/ui/test-should-panic-attr.stderr
index 0f25477..4b032eb 100644
--- a/src/test/ui/test-should-panic-attr.stderr
+++ b/src/test/ui/test-should-panic-attr.stderr
@@ -1,13 +1,5 @@
-warning: attribute must be of the form: `#[should_panic]` or `#[should_panic(expected = "error message")]`
-  --> $DIR/test-should-panic-attr.rs:5:1
-   |
-LL | #[should_panic = "foo"]
-   | ^^^^^^^^^^^^^^^^^^^^^^^
-   |
-   = note: Errors in this attribute were erroneously allowed and will become a hard error in a future release.
-
 warning: argument must be of the form: `expected = "error message"`
-  --> $DIR/test-should-panic-attr.rs:12:1
+  --> $DIR/test-should-panic-attr.rs:11:1
    |
 LL | #[should_panic(expected)]
    | ^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -15,7 +7,7 @@
    = note: Errors in this attribute were erroneously allowed and will become a hard error in a future release.
 
 warning: argument must be of the form: `expected = "error message"`
-  --> $DIR/test-should-panic-attr.rs:19:1
+  --> $DIR/test-should-panic-attr.rs:18:1
    |
 LL | #[should_panic(expect)]
    | ^^^^^^^^^^^^^^^^^^^^^^^
@@ -23,7 +15,7 @@
    = note: Errors in this attribute were erroneously allowed and will become a hard error in a future release.
 
 warning: argument must be of the form: `expected = "error message"`
-  --> $DIR/test-should-panic-attr.rs:26:1
+  --> $DIR/test-should-panic-attr.rs:25:1
    |
 LL | #[should_panic(expected(foo, bar))]
    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -31,7 +23,7 @@
    = note: Errors in this attribute were erroneously allowed and will become a hard error in a future release.
 
 warning: argument must be of the form: `expected = "error message"`
-  --> $DIR/test-should-panic-attr.rs:33:1
+  --> $DIR/test-should-panic-attr.rs:32:1
    |
 LL | #[should_panic(expected = "foo", bar)]
    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/src/test/ui/thread-local-mutation.nll.stderr b/src/test/ui/thread-local-mutation.nll.stderr
new file mode 100644
index 0000000..0a3664b
--- /dev/null
+++ b/src/test/ui/thread-local-mutation.nll.stderr
@@ -0,0 +1,9 @@
+error[E0594]: cannot assign to immutable static item `S`
+  --> $DIR/thread-local-mutation.rs:11:5
+   |
+LL |     S = "after"; //~ ERROR cannot assign to immutable
+   |     ^^^^^^^^^^^ cannot assign
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0594`.
diff --git a/src/test/ui/thread-local-mutation.rs b/src/test/ui/thread-local-mutation.rs
new file mode 100644
index 0000000..e738225
--- /dev/null
+++ b/src/test/ui/thread-local-mutation.rs
@@ -0,0 +1,18 @@
+// Regression test for #54901: immutable thread locals could be mutated. See:
+// https://github.com/rust-lang/rust/issues/29594#issuecomment-328177697
+// https://github.com/rust-lang/rust/issues/54901
+
+#![feature(thread_local)]
+
+#[thread_local]
+static S: &str = "before";
+
+fn set_s() {
+    S = "after"; //~ ERROR cannot assign to immutable
+}
+
+fn main() {
+    println!("{}", S);
+    set_s();
+    println!("{}", S);
+}
diff --git a/src/test/ui/thread-local-mutation.stderr b/src/test/ui/thread-local-mutation.stderr
new file mode 100644
index 0000000..bf29852
--- /dev/null
+++ b/src/test/ui/thread-local-mutation.stderr
@@ -0,0 +1,9 @@
+error[E0594]: cannot assign to immutable thread-local static item
+  --> $DIR/thread-local-mutation.rs:11:5
+   |
+LL |     S = "after"; //~ ERROR cannot assign to immutable
+   |     ^^^^^^^^^^^
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0594`.
diff --git a/src/test/ui/traits/auxiliary/trait_alias.rs b/src/test/ui/traits/auxiliary/trait_alias.rs
new file mode 100644
index 0000000..9e56b87
--- /dev/null
+++ b/src/test/ui/traits/auxiliary/trait_alias.rs
@@ -0,0 +1,3 @@
+#![feature(trait_alias)]
+
+pub trait SendSync = Send + Sync;
diff --git a/src/test/ui/traits/trait-alias-cross-crate.rs b/src/test/ui/traits/trait-alias-cross-crate.rs
new file mode 100644
index 0000000..259fc4f
--- /dev/null
+++ b/src/test/ui/traits/trait-alias-cross-crate.rs
@@ -0,0 +1,17 @@
+// aux-build:trait_alias.rs
+
+#![feature(trait_alias)]
+
+extern crate trait_alias;
+
+use std::rc::Rc;
+use trait_alias::SendSync;
+
+fn use_alias<T: SendSync>() {}
+
+fn main() {
+    use_alias::<u32>();
+    use_alias::<Rc<u32>>();
+    //~^ ERROR `std::rc::Rc<u32>` cannot be sent between threads safely [E0277]
+    //~^^ ERROR `std::rc::Rc<u32>` cannot be shared between threads safely [E0277]
+}
diff --git a/src/test/ui/traits/trait-alias-cross-crate.stderr b/src/test/ui/traits/trait-alias-cross-crate.stderr
new file mode 100644
index 0000000..972d213
--- /dev/null
+++ b/src/test/ui/traits/trait-alias-cross-crate.stderr
@@ -0,0 +1,29 @@
+error[E0277]: `std::rc::Rc<u32>` cannot be sent between threads safely
+  --> $DIR/trait-alias-cross-crate.rs:14:5
+   |
+LL |     use_alias::<Rc<u32>>();
+   |     ^^^^^^^^^^^^^^^^^^^^ `std::rc::Rc<u32>` cannot be sent between threads safely
+   |
+   = help: the trait `std::marker::Send` is not implemented for `std::rc::Rc<u32>`
+note: required by `use_alias`
+  --> $DIR/trait-alias-cross-crate.rs:10:1
+   |
+LL | fn use_alias<T: SendSync>() {}
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+error[E0277]: `std::rc::Rc<u32>` cannot be shared between threads safely
+  --> $DIR/trait-alias-cross-crate.rs:14:5
+   |
+LL |     use_alias::<Rc<u32>>();
+   |     ^^^^^^^^^^^^^^^^^^^^ `std::rc::Rc<u32>` cannot be shared between threads safely
+   |
+   = help: the trait `std::marker::Sync` is not implemented for `std::rc::Rc<u32>`
+note: required by `use_alias`
+  --> $DIR/trait-alias-cross-crate.rs:10:1
+   |
+LL | fn use_alias<T: SendSync>() {}
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+error: aborting due to 2 previous errors
+
+For more information about this error, try `rustc --explain E0277`.
diff --git a/src/test/ui/traits/trait-object-vs-lifetime.rs b/src/test/ui/traits/trait-object-vs-lifetime.rs
index 57d9b2d..a12429c 100644
--- a/src/test/ui/traits/trait-object-vs-lifetime.rs
+++ b/src/test/ui/traits/trait-object-vs-lifetime.rs
@@ -1,8 +1,6 @@
 // A few contrived examples where lifetime should (or should not) be parsed as an object type.
 // Lifetimes parsed as types are still rejected later by semantic checks.
 
-// compile-flags: -Z continue-parse-after-error
-
 struct S<'a, T>(&'a u8, T);
 
 fn main() {
diff --git a/src/test/ui/traits/trait-object-vs-lifetime.stderr b/src/test/ui/traits/trait-object-vs-lifetime.stderr
index 20218c1..4cc96ba 100644
--- a/src/test/ui/traits/trait-object-vs-lifetime.stderr
+++ b/src/test/ui/traits/trait-object-vs-lifetime.stderr
@@ -1,29 +1,33 @@
 error: lifetime parameters must be declared prior to type parameters
-  --> $DIR/trait-object-vs-lifetime.rs:16:25
+  --> $DIR/trait-object-vs-lifetime.rs:14:25
    |
 LL |     let _: S<'static +, 'static>;
-   |                         ^^^^^^^
+   |                         ^^^^^^^ must be declared prior to type parameters
+help: move the lifetime parameter prior to the first type parameter
+   |
+LL |     let _: S<'static, 'static +>;
+   |              ^^^^^^^^         --
 
 error[E0224]: at least one non-builtin trait is required for an object type
-  --> $DIR/trait-object-vs-lifetime.rs:11:23
+  --> $DIR/trait-object-vs-lifetime.rs:9:23
    |
 LL |     let _: S<'static, 'static +>;
    |                       ^^^^^^^^^
 
 error[E0107]: wrong number of lifetime arguments: expected 1, found 2
-  --> $DIR/trait-object-vs-lifetime.rs:13:23
+  --> $DIR/trait-object-vs-lifetime.rs:11:23
    |
 LL |     let _: S<'static, 'static>;
    |                       ^^^^^^^ unexpected lifetime argument
 
 error[E0107]: wrong number of type arguments: expected 1, found 0
-  --> $DIR/trait-object-vs-lifetime.rs:13:12
+  --> $DIR/trait-object-vs-lifetime.rs:11:12
    |
 LL |     let _: S<'static, 'static>;
    |            ^^^^^^^^^^^^^^^^^^^ expected 1 type argument
 
 error[E0224]: at least one non-builtin trait is required for an object type
-  --> $DIR/trait-object-vs-lifetime.rs:16:14
+  --> $DIR/trait-object-vs-lifetime.rs:14:14
    |
 LL |     let _: S<'static +, 'static>;
    |              ^^^^^^^^^
diff --git a/src/test/ui/try-block/try-block-in-edition2015.stderr b/src/test/ui/try-block/try-block-in-edition2015.stderr
index 6365008..a7b8106 100644
--- a/src/test/ui/try-block/try-block-in-edition2015.stderr
+++ b/src/test/ui/try-block/try-block-in-edition2015.stderr
@@ -15,7 +15,7 @@
   --> $DIR/try-block-in-edition2015.rs:4:33
    |
 LL |     let try_result: Option<_> = try {
-   |                                 ^^^ did you mean `try!(...)`?
+   |                                 ^^^ help: use `!` to invoke the macro: `try!`
 
 error: aborting due to 2 previous errors
 
diff --git a/src/test/ui/type-alias-enum-variants-priority-2.rs b/src/test/ui/type-alias-enum-variants-priority-2.rs
new file mode 100644
index 0000000..295f8ac
--- /dev/null
+++ b/src/test/ui/type-alias-enum-variants-priority-2.rs
@@ -0,0 +1,13 @@
+#![feature(type_alias_enum_variants)]
+
+enum E {
+    V(u8)
+}
+
+impl E {
+    fn V() {}
+}
+
+fn main() {
+    <E>::V(); //~ ERROR this function takes 1 parameter but 0 parameters were supplied
+}
diff --git a/src/test/ui/type-alias-enum-variants-priority-2.stderr b/src/test/ui/type-alias-enum-variants-priority-2.stderr
new file mode 100644
index 0000000..c6ec96e
--- /dev/null
+++ b/src/test/ui/type-alias-enum-variants-priority-2.stderr
@@ -0,0 +1,12 @@
+error[E0061]: this function takes 1 parameter but 0 parameters were supplied
+  --> $DIR/type-alias-enum-variants-priority-2.rs:12:5
+   |
+LL |     V(u8)
+   |     ----- defined here
+...
+LL |     <E>::V(); //~ ERROR this function takes 1 parameter but 0 parameters were supplied
+   |     ^^^^^^^^ expected 1 parameter
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0061`.
diff --git a/src/test/ui/type-alias-enum-variants-priority-3.rs b/src/test/ui/type-alias-enum-variants-priority-3.rs
new file mode 100644
index 0000000..33f9655
--- /dev/null
+++ b/src/test/ui/type-alias-enum-variants-priority-3.rs
@@ -0,0 +1,10 @@
+#![feature(type_alias_enum_variants)]
+
+enum E {
+    V
+}
+
+fn check() -> <E>::V {}
+//~^ ERROR expected type, found variant `V`
+
+fn main() {}
diff --git a/src/test/ui/type-alias-enum-variants-priority-3.stderr b/src/test/ui/type-alias-enum-variants-priority-3.stderr
new file mode 100644
index 0000000..b345154
--- /dev/null
+++ b/src/test/ui/type-alias-enum-variants-priority-3.stderr
@@ -0,0 +1,8 @@
+error: expected type, found variant `V`
+  --> $DIR/type-alias-enum-variants-priority-3.rs:7:15
+   |
+LL | fn check() -> <E>::V {}
+   |               ^^^^^^
+
+error: aborting due to previous error
+
diff --git a/src/test/ui/type-alias-enum-variants-priority.rs b/src/test/ui/type-alias-enum-variants-priority.rs
new file mode 100644
index 0000000..db1da2b
--- /dev/null
+++ b/src/test/ui/type-alias-enum-variants-priority.rs
@@ -0,0 +1,20 @@
+#![feature(type_alias_enum_variants)]
+#![deny(ambiguous_associated_items)]
+
+enum E {
+    V
+}
+
+trait Tr {
+    type V;
+    fn f() -> Self::V;
+}
+
+impl Tr for E {
+    type V = u8;
+    fn f() -> Self::V { 0 }
+    //~^ ERROR ambiguous associated item
+    //~| WARN this was previously accepted
+}
+
+fn main() {}
diff --git a/src/test/ui/type-alias-enum-variants-priority.stderr b/src/test/ui/type-alias-enum-variants-priority.stderr
new file mode 100644
index 0000000..dcf7dc7
--- /dev/null
+++ b/src/test/ui/type-alias-enum-variants-priority.stderr
@@ -0,0 +1,26 @@
+error: ambiguous associated item
+  --> $DIR/type-alias-enum-variants-priority.rs:15:15
+   |
+LL |     fn f() -> Self::V { 0 }
+   |               ^^^^^^^ help: use fully-qualified syntax: `<E as Trait>::V`
+   |
+note: lint level defined here
+  --> $DIR/type-alias-enum-variants-priority.rs:2:9
+   |
+LL | #![deny(ambiguous_associated_items)]
+   |         ^^^^^^^^^^^^^^^^^^^^^^^^^^
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #57644 <https://github.com/rust-lang/rust/issues/57644>
+note: `V` could refer to variant defined here
+  --> $DIR/type-alias-enum-variants-priority.rs:5:5
+   |
+LL |     V
+   |     ^
+note: `V` could also refer to associated type defined here
+  --> $DIR/type-alias-enum-variants-priority.rs:9:5
+   |
+LL |     type V;
+   |     ^^^^^^^
+
+error: aborting due to previous error
+
diff --git a/src/test/ui/wrong-ret-type.stderr b/src/test/ui/wrong-ret-type.stderr
index 221806f..cf59f42 100644
--- a/src/test/ui/wrong-ret-type.stderr
+++ b/src/test/ui/wrong-ret-type.stderr
@@ -2,7 +2,9 @@
   --> $DIR/wrong-ret-type.rs:2:49
    |
 LL | fn mk_int() -> usize { let i: isize = 3; return i; }
-   |                                                 ^ expected usize, found isize
+   |                -----                            ^ expected usize, found isize
+   |                |
+   |                expected `usize` because of return type
 
 error: aborting due to previous error
 
diff --git a/src/tools/build-manifest/src/main.rs b/src/tools/build-manifest/src/main.rs
index 8c1baa5..4ca285b 100644
--- a/src/tools/build-manifest/src/main.rs
+++ b/src/tools/build-manifest/src/main.rs
@@ -95,6 +95,7 @@
     "wasm32-unknown-unknown",
     "x86_64-apple-darwin",
     "x86_64-apple-ios",
+    "x86_64-fortanix-unknown-sgx",
     "x86_64-fuchsia",
     "x86_64-linux-android",
     "x86_64-pc-windows-gnu",
diff --git a/src/tools/cargo b/src/tools/cargo
index 34320d2..ffe6587 160000
--- a/src/tools/cargo
+++ b/src/tools/cargo
@@ -1 +1 @@
-Subproject commit 34320d212dca8cd27d06ce93c16c6151f46fcf2e
+Subproject commit ffe65875fd05018599ad07e7389e99050c7915be
diff --git a/src/tools/clippy b/src/tools/clippy
index c63b634..1b89724 160000
--- a/src/tools/clippy
+++ b/src/tools/clippy
@@ -1 +1 @@
-Subproject commit c63b6349b44019146cc2edcef8141692891b9401
+Subproject commit 1b89724b4889aef631b40d52c0943bdc28e04d1d
diff --git a/src/tools/rls b/src/tools/rls
index 1a6361b..ae0d89a 160000
--- a/src/tools/rls
+++ b/src/tools/rls
@@ -1 +1 @@
-Subproject commit 1a6361bd399a9466deba9b42ff2ff2ae365c5d0e
+Subproject commit ae0d89a08d091ba1563b571739768a09d4cd3d69
diff --git a/src/tools/tidy/src/bins.rs b/src/tools/tidy/src/bins.rs
index 7a5495b..610d1d8 100644
--- a/src/tools/tidy/src/bins.rs
+++ b/src/tools/tidy/src/bins.rs
@@ -2,12 +2,12 @@
 //! by accident.
 //!
 //! In the past we've accidentally checked in test binaries and such which add a
-//! huge amount of bloat to the git history, so it's good to just ensure we
-//! don't do that again :)
+//! huge amount of bloat to the Git history, so it's good to just ensure we
+//! don't do that again.
 
 use std::path::Path;
 
-// All files are executable on Windows, so just check on Unix
+// All files are executable on Windows, so just check on Unix.
 #[cfg(windows)]
 pub fn check(_path: &Path, _bad: &mut bool) {}
 
diff --git a/src/tools/tidy/src/cargo.rs b/src/tools/tidy/src/cargo.rs
index 3369d82..26ced7f 100644
--- a/src/tools/tidy/src/cargo.rs
+++ b/src/tools/tidy/src/cargo.rs
@@ -13,7 +13,7 @@
         return
     }
     for entry in t!(path.read_dir(), path).map(|e| t!(e)) {
-        // Look for `Cargo.toml` with a sibling `src/lib.rs` or `lib.rs`
+        // Look for `Cargo.toml` with a sibling `src/lib.rs` or `lib.rs`.
         if entry.file_name().to_str() == Some("Cargo.toml") {
             if path.join("src/lib.rs").is_file() {
                 verify(&entry.path(), &path.join("src/lib.rs"), bad)
@@ -27,8 +27,8 @@
     }
 }
 
-// Verify that the dependencies in Cargo.toml at `tomlfile` are sync'd with the
-// `extern crate` annotations in the lib.rs at `libfile`.
+/// Verifies that the dependencies in Cargo.toml at `tomlfile` are synced with
+/// the `extern crate` annotations in the lib.rs at `libfile`.
 fn verify(tomlfile: &Path, libfile: &Path, bad: &mut bool) {
     let toml = t!(fs::read_to_string(&tomlfile));
     let librs = t!(fs::read_to_string(&libfile));
@@ -37,14 +37,16 @@
         return
     }
 
-    // "Poor man's TOML parser", just assume we use one syntax for now
+    // "Poor man's TOML parser" -- just assume we use one syntax for now.
     //
     // We just look for:
     //
-    //      [dependencies]
-    //      name = ...
-    //      name2 = ...
-    //      name3 = ...
+    // ````
+    // [dependencies]
+    // name = ...
+    // name2 = ...
+    // name3 = ...
+    // ```
     //
     // If we encounter a line starting with `[` then we assume it's the end of
     // the dependency section and bail out.
@@ -63,14 +65,14 @@
             continue
         }
 
-        // Don't worry about depending on core/std but not saying `extern crate
-        // core/std`, that's intentional.
+        // Don't worry about depending on core/std while not writing `extern crate
+        // core/std` -- that's intentional.
         if krate == "core" || krate == "std" {
             continue
         }
 
-        // This is intentional, this dependency just makes the crate available
-        // for others later on. Cover cases
+        // This is intentional -- this dependency just makes the crate available
+        // for others later on.
         let whitelisted = krate.starts_with("panic");
         if toml.contains("name = \"std\"") && whitelisted {
             continue
diff --git a/src/tools/tidy/src/deps.rs b/src/tools/tidy/src/deps.rs
index 7f0f0c6..f1bfb6e 100644
--- a/src/tools/tidy/src/deps.rs
+++ b/src/tools/tidy/src/deps.rs
@@ -1,4 +1,4 @@
-//! Check license of third-party deps by inspecting vendor
+//! Checks the licenses of third-party dependencies by inspecting vendors.
 
 use std::collections::{BTreeSet, HashSet, HashMap};
 use std::fs;
@@ -21,7 +21,7 @@
 /// These are exceptions to Rust's permissive licensing policy, and
 /// should be considered bugs. Exceptions are only allowed in Rust
 /// tooling. It is _crucial_ that no exception crates be dependencies
-/// of the Rust runtime (std / test).
+/// of the Rust runtime (std/test).
 const EXCEPTIONS: &[&str] = &[
     "mdbook",             // MPL2, mdbook
     "openssl",            // BSD+advertising clause, cargo, mdbook
@@ -39,11 +39,11 @@
     "colored",            // MPL-2.0, rustfmt
     "ordslice",           // Apache-2.0, rls
     "cloudabi",           // BSD-2-Clause, (rls -> crossbeam-channel 0.2 -> rand 0.5)
-    "ryu",                // Apache-2.0, rls/cargo/... (b/c of serde)
+    "ryu",                // Apache-2.0, rls/cargo/... (because of serde)
     "bytesize",           // Apache-2.0, cargo
     "im-rc",              // MPL-2.0+, cargo
     "adler32",            // BSD-3-Clause AND Zlib, cargo dep that isn't used
-    "fortanix-sgx-abi",   // MPL-2.0+, libstd but only for sgx target
+    "fortanix-sgx-abi",   // MPL-2.0+, libstd but only for `sgx` target
 ];
 
 /// Which crates to check against the whitelist?
@@ -156,7 +156,7 @@
     Crate("wincolor"),
 ];
 
-// Some types for Serde to deserialize the output of `cargo metadata` to...
+// Some types for Serde to deserialize the output of `cargo metadata` to.
 
 #[derive(Deserialize)]
 struct Output {
@@ -174,9 +174,9 @@
     dependencies: Vec<String>,
 }
 
-/// A unique identifier for a crate
+/// A unique identifier for a crate.
 #[derive(Copy, Clone, PartialOrd, Ord, PartialEq, Eq, Debug, Hash)]
-struct Crate<'a>(&'a str); // (name,)
+struct Crate<'a>(&'a str); // (name)
 
 #[derive(Copy, Clone, PartialOrd, Ord, PartialEq, Eq, Debug, Hash)]
 struct CrateVersion<'a>(&'a str, &'a str); // (name, version)
@@ -188,7 +188,7 @@
 }
 
 impl<'a> CrateVersion<'a> {
-    /// Returns the struct and whether or not the dep is in-tree
+    /// Returns the struct and whether or not the dependency is in-tree.
     pub fn from_str(s: &'a str) -> (Self, bool) {
         let mut parts = s.split(' ');
         let name = parts.next().unwrap();
@@ -215,7 +215,7 @@
 ///
 /// Specifically, this checks that the license is correct.
 pub fn check(path: &Path, bad: &mut bool) {
-    // Check licences
+    // Check licences.
     let path = path.join("../vendor");
     assert!(path.exists(), "vendor directory missing");
     let mut saw_dir = false;
@@ -223,7 +223,7 @@
         saw_dir = true;
         let dir = t!(dir);
 
-        // skip our exceptions
+        // Skip our exceptions.
         let is_exception = EXCEPTIONS.iter().any(|exception| {
             dir.path()
                 .to_str()
@@ -240,18 +240,18 @@
     assert!(saw_dir, "no vendored source");
 }
 
-/// Checks the dependency of WHITELIST_CRATES at the given path. Changes `bad` to `true` if a check
-/// failed.
+/// Checks the dependency of `WHITELIST_CRATES` at the given path. Changes `bad` to `true` if a
+/// check failed.
 ///
-/// Specifically, this checks that the dependencies are on the WHITELIST.
+/// Specifically, this checks that the dependencies are on the `WHITELIST`.
 pub fn check_whitelist(path: &Path, cargo: &Path, bad: &mut bool) {
-    // Get dependencies from cargo metadata
+    // Get dependencies from Cargo metadata.
     let resolve = get_deps(path, cargo);
 
-    // Get the whitelist into a convenient form
+    // Get the whitelist in a convenient form.
     let whitelist: HashSet<_> = WHITELIST.iter().cloned().collect();
 
-    // Check dependencies
+    // Check dependencies.
     let mut visited = BTreeSet::new();
     let mut unapproved = BTreeSet::new();
     for &krate in WHITELIST_CRATES.iter() {
@@ -308,9 +308,9 @@
     }
 }
 
-/// Get the dependencies of the crate at the given path using `cargo metadata`.
+/// Gets the dependencies of the crate at the given path using `cargo metadata`.
 fn get_deps(path: &Path, cargo: &Path) -> Resolve {
-    // Run `cargo metadata` to get the set of dependencies
+    // Run `cargo metadata` to get the set of dependencies.
     let output = Command::new(cargo)
         .arg("metadata")
         .arg("--format-version")
@@ -335,25 +335,25 @@
     krate: CrateVersion<'a>,
     must_be_on_whitelist: bool,
 ) -> BTreeSet<Crate<'a>> {
-    // Will contain bad deps
+    // This will contain bad deps.
     let mut unapproved = BTreeSet::new();
 
-    // Check if we have already visited this crate
+    // Check if we have already visited this crate.
     if visited.contains(&krate) {
         return unapproved;
     }
 
     visited.insert(krate);
 
-    // If this path is in-tree, we don't require it to be on the whitelist
+    // If this path is in-tree, we don't require it to be on the whitelist.
     if must_be_on_whitelist {
-        // If this dependency is not on the WHITELIST, add to bad set
+        // If this dependency is not on `WHITELIST`, add to bad set.
         if !whitelist.contains(&krate.into()) {
             unapproved.insert(krate.into());
         }
     }
 
-    // Do a DFS in the crate graph (it's a DAG, so we know we have no cycles!)
+    // Do a DFS in the crate graph (it's a DAG, so we know we have no cycles!).
     let to_check = resolve
         .nodes
         .iter()
@@ -372,9 +372,10 @@
 
 fn check_crate_duplicate(resolve: &Resolve, bad: &mut bool) {
     const FORBIDDEN_TO_HAVE_DUPLICATES: &[&str] = &[
-        // These two crates take quite a long time to build, let's not let two
-        // versions of them accidentally sneak into our dependency graph to
-        // ensure we keep our CI times under control
+        // These two crates take quite a long time to build, so don't allow two versions of them
+        // to accidentally sneak into our dependency graph, in order to ensure we keep our CI times
+        // under control.
+
         // "cargo", // FIXME(#53005)
         "rustc-ap-syntax",
     ];
diff --git a/src/tools/tidy/src/errors.rs b/src/tools/tidy/src/errors.rs
index 212b1a4..76ebc9b 100644
--- a/src/tools/tidy/src/errors.rs
+++ b/src/tools/tidy/src/errors.rs
@@ -22,11 +22,13 @@
         contents.truncate(0);
         t!(t!(File::open(file)).read_to_string(&mut contents));
 
-        // In the register_long_diagnostics! macro, entries look like this:
+        // In the `register_long_diagnostics!` macro, entries look like this:
         //
+        // ```
         // EXXXX: r##"
         // <Long diagnostic message>
         // "##,
+        // ```
         //
         // and these long messages often have error codes themselves inside
         // them, but we don't want to report duplicates in these cases. This
diff --git a/src/tools/tidy/src/extdeps.rs b/src/tools/tidy/src/extdeps.rs
index 8b5021e..52e263d 100644
--- a/src/tools/tidy/src/extdeps.rs
+++ b/src/tools/tidy/src/extdeps.rs
@@ -1,33 +1,32 @@
-// ! Check for external package sources. Allow only vendorable packages.
+//! Check for external package sources. Allow only vendorable packages.
 
 use std::fs;
 use std::path::Path;
 
-/// List of whitelisted sources for packages
+/// List of whitelisted sources for packages.
 const WHITELISTED_SOURCES: &[&str] = &[
     "\"registry+https://github.com/rust-lang/crates.io-index\"",
 ];
 
-/// check for external package sources
+/// Checks for external package sources.
 pub fn check(path: &Path, bad: &mut bool) {
-    // Cargo.lock of rust (tidy runs inside src/)
+    // `Cargo.lock` of rust (tidy runs inside `src/`).
     let path = path.join("../Cargo.lock");
 
-    // open and read the whole file
+    // Open and read the whole file.
     let cargo_lock = t!(fs::read_to_string(&path));
 
-    // process each line
+    // Process each line.
     for line in cargo_lock.lines() {
-
-        // consider only source entries
+        // Consider only source entries.
         if ! line.starts_with("source = ") {
             continue;
         }
 
-        // extract source value
+        // Extract source value.
         let source = line.splitn(2, '=').nth(1).unwrap().trim();
 
-        // ensure source is whitelisted
+        // Ensure source is whitelisted.
         if !WHITELISTED_SOURCES.contains(&&*source) {
             println!("invalid source: {}", source);
             *bad = true;
diff --git a/src/tools/tidy/src/features.rs b/src/tools/tidy/src/features.rs
index 2435a0c..16f2e3b 100644
--- a/src/tools/tidy/src/features.rs
+++ b/src/tools/tidy/src/features.rs
@@ -1,12 +1,12 @@
-//! Tidy check to ensure that unstable features are all in order
+//! Tidy check to ensure that unstable features are all in order.
 //!
 //! This check will ensure properties like:
 //!
-//! * All stability attributes look reasonably well formed
-//! * The set of library features is disjoint from the set of language features
-//! * Library features have at most one stability level
-//! * Library features have at most one `since` value
-//! * All unstable lang features have tests to ensure they are actually unstable
+//! * All stability attributes look reasonably well formed.
+//! * The set of library features is disjoint from the set of language features.
+//! * Library features have at most one stability level.
+//! * Library features have at most one `since` value.
+//! * All unstable lang features have tests to ensure they are actually unstable.
 
 use std::collections::HashMap;
 use std::fmt;
@@ -172,8 +172,8 @@
 pub fn collect_lang_features(base_src_path: &Path, bad: &mut bool) -> Features {
     let contents = t!(fs::read_to_string(base_src_path.join("libsyntax/feature_gate.rs")));
 
-    // we allow rustc-internal features to omit a tracking issue.
-    // these features must be marked with `// rustc internal` in its own group.
+    // We allow rustc-internal features to omit a tracking issue.
+    // These features must be marked with a `// rustc internal` in its own group.
     let mut next_feature_is_rustc_internal = false;
 
     contents.lines().zip(1..)
@@ -327,7 +327,7 @@
             }
             becoming_feature = None;
             if line.contains("rustc_const_unstable(") {
-                // const fn features are handled specially
+                // `const fn` features are handled specially.
                 let feature_name = match find_attr_val(line, "feature") {
                     Some(name) => name,
                     None => err!("malformed stability attribute"),
@@ -337,9 +337,8 @@
                     since: "None".to_owned(),
                     has_gate_test: false,
                     // FIXME(#57563): #57563 is now used as a common tracking issue,
-                    // although we would like to have specific tracking
-                    // issues for each `rustc_const_unstable` in the
-                    // future.
+                    // although we would like to have specific tracking issues for each
+                    // `rustc_const_unstable` in the future.
                     tracking_issue: Some(57563),
                 };
                 mf(Ok((feature_name, feature)), file, i + 1);
diff --git a/src/tools/tidy/src/lib.rs b/src/tools/tidy/src/lib.rs
index 58220c4..a103325 100644
--- a/src/tools/tidy/src/lib.rs
+++ b/src/tools/tidy/src/lib.rs
@@ -1,4 +1,4 @@
-//! Library used by tidy and other tools
+//! Library used by tidy and other tools.
 //!
 //! This library contains the tidy lints and exposes it
 //! to be used by tools.
diff --git a/src/tools/tidy/src/main.rs b/src/tools/tidy/src/main.rs
index e705e2d..81b7b2a 100644
--- a/src/tools/tidy/src/main.rs
+++ b/src/tools/tidy/src/main.rs
@@ -1,4 +1,4 @@
-//! Tidy checks source code in this repository
+//! Tidy checks source code in this repository.
 //!
 //! This program runs all of the various tidy checks for style, cleanliness,
 //! etc. This is run by default on `make check` and as part of the auto
diff --git a/src/tools/tidy/src/pal.rs b/src/tools/tidy/src/pal.rs
index a34712d..ce5e15a 100644
--- a/src/tools/tidy/src/pal.rs
+++ b/src/tools/tidy/src/pal.rs
@@ -1,4 +1,4 @@
-//! Tidy check to enforce rules about platform-specific code in std
+//! Tidy check to enforce rules about platform-specific code in std.
 //!
 //! This is intended to maintain existing standards of code
 //! organization in hopes that the standard library will continue to
@@ -15,15 +15,15 @@
 //! Following are the basic rules, though there are currently
 //! exceptions:
 //!
-//! - core may not have platform-specific code
-//! - libpanic_abort may have platform-specific code
-//! - libpanic_unwind may have platform-specific code
-//! - libunwind may have platform-specific code
-//! - other crates in the std facade may not
-//! - std may have platform-specific code in the following places
-//!   - sys/unix/
-//!   - sys/windows/
-//!   - os/
+//! - core may not have platform-specific code.
+//! - libpanic_abort may have platform-specific code.
+//! - libpanic_unwind may have platform-specific code.
+//! - libunwind may have platform-specific code.
+//! - other crates in the std facade may not.
+//! - std may have platform-specific code in the following places:
+//!   - `sys/unix/`
+//!   - `sys/windows/`
+//!   - `os/`
 //!
 //! `std/sys_common` should _not_ contain platform-specific code.
 //! Finally, because std contains tests with platform-specific
@@ -36,7 +36,7 @@
 use std::path::Path;
 use std::iter::Iterator;
 
-// Paths that may contain platform-specific code
+// Paths that may contain platform-specific code.
 const EXCEPTION_PATHS: &[&str] = &[
     // std crates
     "src/libpanic_abort",
@@ -54,10 +54,10 @@
     "src/libstd/f64.rs",
     "src/libstd/sys_common/mod.rs",
     "src/libstd/sys_common/net.rs",
-    "src/libterm", // Not sure how to make this crate portable, but test needs it
-    "src/libtest", // Probably should defer to unstable std::sys APIs
+    "src/libterm", // Not sure how to make this crate portable, but test crate needs it.
+    "src/libtest", // Probably should defer to unstable `std::sys` APIs.
 
-    // std testing crates, ok for now at least
+    // std testing crates, okay for now at least
     "src/libcore/tests",
     "src/liballoc/tests/lib.rs",
 
@@ -79,7 +79,7 @@
 
 pub fn check(path: &Path, bad: &mut bool) {
     let mut contents = String::new();
-    // Sanity check that the complex parsing here works
+    // Sanity check that the complex parsing here works.
     let mut saw_target_arch = false;
     let mut saw_cfg_bang = false;
     super::walk(path, &mut super::filter_dirs, &mut |file| {
@@ -104,7 +104,7 @@
     // For now it's ok to have platform-specific code after 'mod tests'.
     let mod_tests_idx = find_test_mod(contents);
     let contents = &contents[..mod_tests_idx];
-    // Pull out all "cfg(...)" and "cfg!(...)" strings
+    // Pull out all `cfg(...)` and `cfg!(...)` strings.
     let cfgs = parse_cfgs(contents);
 
     let mut line_numbers: Option<Vec<usize>> = None;
@@ -121,7 +121,7 @@
     };
 
     for (idx, cfg) in cfgs {
-        // Sanity check that the parsing here works
+        // Sanity check that the parsing here works.
         if !*saw_target_arch && cfg.contains("target_arch") { *saw_target_arch = true }
         if !*saw_cfg_bang && cfg.contains("cfg!") { *saw_cfg_bang = true }
 
@@ -153,7 +153,7 @@
 
 fn find_test_mod(contents: &str) -> usize {
     if let Some(mod_tests_idx) = contents.find("mod tests") {
-        // Also capture a previous line indicating "mod tests" in cfg-ed out
+        // Also capture a previous line indicating that "mod tests" is cfg'd out.
         let prev_newline_idx = contents[..mod_tests_idx].rfind('\n').unwrap_or(mod_tests_idx);
         let prev_newline_idx = contents[..prev_newline_idx].rfind('\n');
         if let Some(nl) = prev_newline_idx {
@@ -176,7 +176,7 @@
     let candidate_cfgs = contents.match_indices("cfg");
     let candidate_cfg_idxs = candidate_cfgs.map(|(i, _)| i);
     // This is puling out the indexes of all "cfg" strings
-    // that appear to be tokens succeeded by a paren.
+    // that appear to be tokens followed by a parenthesis.
     let cfgs = candidate_cfg_idxs.filter(|i| {
         let pre_idx = i.saturating_sub(*i);
         let succeeds_non_ident = !contents.as_bytes().get(pre_idx)
diff --git a/src/tools/tidy/src/style.rs b/src/tools/tidy/src/style.rs
index 42e803b..df54afe 100644
--- a/src/tools/tidy/src/style.rs
+++ b/src/tools/tidy/src/style.rs
@@ -2,12 +2,12 @@
 //!
 //! Example checks are:
 //!
-//! * No lines over 100 characters
-//! * No tabs
-//! * No trailing whitespace
-//! * No CR characters
-//! * No `TODO` or `XXX` directives
-//! * No unexplained ` ```ignore ` or ` ```rust,ignore ` doc tests
+//! * No lines over 100 characters.
+//! * No tabs.
+//! * No trailing whitespace.
+//! * No CR characters.
+//! * No `TODO` or `XXX` directives.
+//! * No unexplained ` ```ignore ` or ` ```rust,ignore ` doc tests.
 //!
 //! A number of these checks can be opted-out of with various directives like
 //! `// ignore-tidy-linelength`.
@@ -34,15 +34,17 @@
 when executed when assertions are disabled.
 Use llvm::report_fatal_error for increased robustness.";
 
-/// Parser states for line_is_url.
+/// Parser states for `line_is_url`.
 #[derive(PartialEq)]
 #[allow(non_camel_case_types)]
-enum LIUState { EXP_COMMENT_START,
-                EXP_LINK_LABEL_OR_URL,
-                EXP_URL,
-                EXP_END }
+enum LIUState {
+    EXP_COMMENT_START,
+    EXP_LINK_LABEL_OR_URL,
+    EXP_URL,
+    EXP_END,
+}
 
-/// True if LINE appears to be a line comment containing an URL,
+/// Returns whether `line` appears to be a line comment containing an URL,
 /// possibly with a Markdown link label in front, and nothing else.
 /// The Markdown link label, if present, may not contain whitespace.
 /// Lines of this form are allowed to be overlength, because Markdown
@@ -77,7 +79,7 @@
     state == EXP_END
 }
 
-/// True if LINE is allowed to be longer than the normal limit.
+/// Returns whether `line` is allowed to be longer than the normal limit.
 /// Currently there is only one exception, for long URLs, but more
 /// may be added in the future.
 fn long_line_is_ok(line: &str) -> bool {
@@ -109,6 +111,7 @@
         let skip_tab = contents.contains("ignore-tidy-tab");
         let skip_length = contents.contains("ignore-tidy-linelength");
         let skip_end_whitespace = contents.contains("ignore-tidy-end-whitespace");
+        let skip_copyright = contents.contains("ignore-tidy-copyright");
         let mut trailing_new_lines = 0;
         for (i, line) in contents.split('\n').enumerate() {
             let mut err = |msg: &str| {
@@ -118,13 +121,13 @@
                 && !long_line_is_ok(line) {
                     err(&format!("line longer than {} chars", COLS));
             }
-            if line.contains('\t') && !skip_tab {
+            if !skip_tab && line.contains('\t') {
                 err("tab character");
             }
             if !skip_end_whitespace && (line.ends_with(' ') || line.ends_with('\t')) {
                 err("trailing whitespace");
             }
-            if line.contains('\r') && !skip_cr {
+            if !skip_cr && line.contains('\r') {
                 err("CR character");
             }
             if filename != "style.rs" {
@@ -135,6 +138,13 @@
                     err("XXX is deprecated; use FIXME")
                 }
             }
+            if !skip_copyright && (line.starts_with("// Copyright") ||
+                                   line.starts_with("# Copyright") ||
+                                   line.starts_with("Copyright"))
+                               && (line.contains("Rust Developers") ||
+                                   line.contains("Rust Project Developers")) {
+                err("copyright notices attributed to the Rust Project Developers are deprecated");
+            }
             if line.ends_with("```ignore") || line.ends_with("```rust,ignore") {
                 err(UNEXPLAINED_IGNORE_DOCTEST_INFO);
             }
diff --git a/src/tools/tidy/src/ui_tests.rs b/src/tools/tidy/src/ui_tests.rs
index fa71980..b572b52 100644
--- a/src/tools/tidy/src/ui_tests.rs
+++ b/src/tools/tidy/src/ui_tests.rs
@@ -10,14 +10,16 @@
         &mut |file_path| {
             if let Some(ext) = file_path.extension() {
                 if ext == "stderr" || ext == "stdout" {
-                    // Test output filenames have the format:
+                    // Test output filenames have one of the formats:
+                    // ```
                     // $testname.stderr
                     // $testname.$mode.stderr
                     // $testname.$revision.stderr
                     // $testname.$revision.$mode.stderr
+                    // ```
                     //
                     // For now, just make sure that there is a corresponding
-                    // $testname.rs file.
+                    // `$testname.rs` file.
                     let testname = file_path
                         .file_name()
                         .unwrap()
diff --git a/src/tools/tidy/src/unstable_book.rs b/src/tools/tidy/src/unstable_book.rs
index c09a049..bd3b1f0 100644
--- a/src/tools/tidy/src/unstable_book.rs
+++ b/src/tools/tidy/src/unstable_book.rs
@@ -11,22 +11,24 @@
 
 pub const LIB_FEATURES_DIR: &str = "library-features";
 
-/// Build the path to the Unstable Book source directory from the Rust 'src' directory
+/// Builds the path to the Unstable Book source directory from the Rust 'src' directory.
 pub fn unstable_book_path(base_src_path: &path::Path) -> path::PathBuf {
     base_src_path.join(PATH_STR)
 }
 
-/// Directory where the features are documented within the Unstable Book source directory
+/// Builds the path to the directory where the features are documented within the Unstable Book
+/// source directory.
 pub fn unstable_book_lang_features_path(base_src_path: &path::Path) -> path::PathBuf {
     unstable_book_path(base_src_path).join(LANG_FEATURES_DIR)
 }
 
-/// Directory where the features are documented within the Unstable Book source directory
+/// Builds the path to the directory where the features are documented within the Unstable Book
+/// source directory.
 pub fn unstable_book_lib_features_path(base_src_path: &path::Path) -> path::PathBuf {
     unstable_book_path(base_src_path).join(LIB_FEATURES_DIR)
 }
 
-/// Test to determine if DirEntry is a file
+/// Tests whether `DirEntry` is a file.
 fn dir_entry_is_file(dir_entry: &fs::DirEntry) -> bool {
     dir_entry
         .file_type()
@@ -34,7 +36,7 @@
         .is_file()
 }
 
-/// Retrieve names of all unstable features
+/// Retrieves names of all unstable features.
 pub fn collect_unstable_feature_names(features: &Features) -> BTreeSet<String> {
     features
         .iter()
@@ -56,24 +58,23 @@
 
 /// Retrieve file names of all library feature sections in the Unstable Book with:
 ///
-/// * hyphens replaced by underscores
-/// * the markdown suffix ('.md') removed
+/// * hyphens replaced by underscores,
+/// * the markdown suffix ('.md') removed.
 fn collect_unstable_book_lang_features_section_file_names(base_src_path: &path::Path)
                                                           -> BTreeSet<String> {
     collect_unstable_book_section_file_names(&unstable_book_lang_features_path(base_src_path))
 }
 
-/// Retrieve file names of all language feature sections in the Unstable Book with:
+/// Retrieves file names of all language feature sections in the Unstable Book with:
 ///
-/// * hyphens replaced by underscores
-/// * the markdown suffix ('.md') removed
+/// * hyphens replaced by underscores,
+/// * the markdown suffix ('.md') removed.
 fn collect_unstable_book_lib_features_section_file_names(base_src_path: &path::Path)
                                                          -> BTreeSet<String> {
     collect_unstable_book_section_file_names(&unstable_book_lib_features_path(base_src_path))
 }
 
 pub fn check(path: &path::Path, bad: &mut bool) {
-
     // Library features
 
     let lang_features = collect_lang_features(path, bad);
@@ -100,7 +101,7 @@
     let unstable_book_lang_features_section_file_names =
         collect_unstable_book_lang_features_section_file_names(path);
 
-    // Check for Unstable Book sections that don't have a corresponding unstable feature
+    // Check for Unstable Book sections that don't have a corresponding unstable feature.
     for feature_name in &unstable_book_lang_features_section_file_names -
                         &unstable_lang_feature_names {
         tidy_error!(bad,
@@ -109,8 +110,8 @@
                     feature_name)
     }
 
-    // List unstable features that don't have Unstable Book sections
-    // Remove the comment marker if you want the list printed
+    // List unstable features that don't have Unstable Book sections.
+    // Remove the comment marker if you want the list printed.
     /*
     println!("Lib features without unstable book sections:");
     for feature_name in &unstable_lang_feature_names -