Auto merge of #57647 - cuviper:gdb-version, r=tromey

[rust-gdb] relax the GDB version regex

The pretty-printer script is checking `gdb.VERSION` to see if it's at
least 8.1 for some features. With `re.match`, it will only find the
version at the beginning of that string, but in Fedora the string is
something like "Fedora 8.2-5.fc29". Using `re.search` instead will find
the first location that matches anywhere, so it will find my 8.2.
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/appveyor.yml b/appveyor.yml
index f043b8b..d70ad54 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -5,12 +5,6 @@
   # server goes down presumably. See #43333 for more info
   CARGO_HTTP_CHECK_REVOKE: false
 
-  # Recommended by AppVeyor this moves our builds to GCE which incurs a 3-4
-  # minute startup overhead, but that's paltry compared to our overall build
-  # times so we're will to eat the cost. This is intended to give us better
-  # performance I believe!
-  appveyor_build_worker_cloud: gce
-
   matrix:
   # 32/64 bit MSVC tests
   - MSYS_BITS: 64
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/bootstrap.py b/src/bootstrap/bootstrap.py
index f3dbae6..e8c1594 100644
--- a/src/bootstrap/bootstrap.py
+++ b/src/bootstrap/bootstrap.py
@@ -230,6 +230,9 @@
         err = "unknown OS type: {}".format(ostype)
         sys.exit(err)
 
+    if cputype == 'powerpc' and ostype == 'unknown-freebsd':
+        cputype = subprocess.check_output(
+              ['uname', '-p']).strip().decode(default_encoding)
     cputype_mapper = {
         'BePC': 'i686',
         'aarch64': 'aarch64',
diff --git a/src/bootstrap/builder.rs b/src/bootstrap/builder.rs
index 9c58f5b..31adab6 100644
--- a/src/bootstrap/builder.rs
+++ b/src/bootstrap/builder.rs
@@ -660,6 +660,15 @@
         }
     }
 
+    /// Get the paths to all of the compiler's codegen backends.
+    fn codegen_backends(&self, compiler: Compiler) -> impl Iterator<Item = PathBuf> {
+        fs::read_dir(self.sysroot_codegen_backends(compiler))
+            .into_iter()
+            .flatten()
+            .filter_map(Result::ok)
+            .map(|entry| entry.path())
+    }
+
     pub fn rustdoc(&self, host: Interned<String>) -> PathBuf {
         self.ensure(tool::Rustdoc { host })
     }
@@ -750,6 +759,9 @@
             match mode {
                 Mode::Std => {
                     self.clear_if_dirty(&my_out, &self.rustc(compiler));
+                    for backend in self.codegen_backends(compiler) {
+                        self.clear_if_dirty(&my_out, &backend);
+                    }
                 },
                 Mode::Test => {
                     self.clear_if_dirty(&my_out, &libstd_stamp);
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/dist.rs b/src/bootstrap/dist.rs
index df34dfe..71662e8 100644
--- a/src/bootstrap/dist.rs
+++ b/src/bootstrap/dist.rs
@@ -602,6 +602,8 @@
             // gdb debugger scripts
             builder.install(&builder.src.join("src/etc/rust-gdb"), &sysroot.join("bin"),
                     0o755);
+            builder.install(&builder.src.join("src/etc/rust-gdbgui"), &sysroot.join("bin"),
+                    0o755);
 
             cp_debugger_script("gdb_load_rust_pretty_printers.py");
             cp_debugger_script("gdb_rust_pretty_printing.py");
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/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/library-features/is-sorted.md b/src/doc/unstable-book/src/library-features/is-sorted.md
new file mode 100644
index 0000000..e3b7dc3
--- /dev/null
+++ b/src/doc/unstable-book/src/library-features/is-sorted.md
@@ -0,0 +1,11 @@
+# `is_sorted`
+
+The tracking issue for this feature is: [#53485]
+
+[#53485]: https://github.com/rust-lang/rust/issues/53485
+
+------------------------
+
+Add the methods `is_sorted`, `is_sorted_by` and `is_sorted_by_key` to `[T]`;
+add the methods `is_sorted`, `is_sorted_by` and `is_sorted_by_key` to
+`Iterator`.
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/libcore/benches/fmt.rs b/src/libcore/benches/fmt.rs
new file mode 100644
index 0000000..92f10c7
--- /dev/null
+++ b/src/libcore/benches/fmt.rs
@@ -0,0 +1,110 @@
+use std::io::{self, Write as IoWrite};
+use std::fmt::{self, Write as FmtWrite};
+use test::Bencher;
+
+#[bench]
+fn write_vec_value(bh: &mut Bencher) {
+    bh.iter(|| {
+        let mut mem = Vec::new();
+        for _ in 0..1000 {
+            mem.write_all("abc".as_bytes()).unwrap();
+        }
+    });
+}
+
+#[bench]
+fn write_vec_ref(bh: &mut Bencher) {
+    bh.iter(|| {
+        let mut mem = Vec::new();
+        let wr = &mut mem as &mut dyn io::Write;
+        for _ in 0..1000 {
+            wr.write_all("abc".as_bytes()).unwrap();
+        }
+    });
+}
+
+#[bench]
+fn write_vec_macro1(bh: &mut Bencher) {
+    bh.iter(|| {
+        let mut mem = Vec::new();
+        let wr = &mut mem as &mut dyn io::Write;
+        for _ in 0..1000 {
+            write!(wr, "abc").unwrap();
+        }
+    });
+}
+
+#[bench]
+fn write_vec_macro2(bh: &mut Bencher) {
+    bh.iter(|| {
+        let mut mem = Vec::new();
+        let wr = &mut mem as &mut dyn io::Write;
+        for _ in 0..1000 {
+            write!(wr, "{}", "abc").unwrap();
+        }
+    });
+}
+
+#[bench]
+fn write_vec_macro_debug(bh: &mut Bencher) {
+    bh.iter(|| {
+        let mut mem = Vec::new();
+        let wr = &mut mem as &mut dyn io::Write;
+        for _ in 0..1000 {
+            write!(wr, "{:?}", "☃").unwrap();
+        }
+    });
+}
+
+#[bench]
+fn write_str_value(bh: &mut Bencher) {
+    bh.iter(|| {
+        let mut mem = String::new();
+        for _ in 0..1000 {
+            mem.write_str("abc").unwrap();
+        }
+    });
+}
+
+#[bench]
+fn write_str_ref(bh: &mut Bencher) {
+    bh.iter(|| {
+        let mut mem = String::new();
+        let wr = &mut mem as &mut dyn fmt::Write;
+        for _ in 0..1000 {
+            wr.write_str("abc").unwrap();
+        }
+    });
+}
+
+#[bench]
+fn write_str_macro1(bh: &mut Bencher) {
+    bh.iter(|| {
+        let mut mem = String::new();
+        for _ in 0..1000 {
+            write!(mem, "abc").unwrap();
+        }
+    });
+}
+
+#[bench]
+fn write_str_macro2(bh: &mut Bencher) {
+    bh.iter(|| {
+        let mut mem = String::new();
+        let wr = &mut mem as &mut dyn fmt::Write;
+        for _ in 0..1000 {
+            write!(wr, "{}", "abc").unwrap();
+        }
+    });
+}
+
+#[bench]
+fn write_str_macro_debug(bh: &mut Bencher) {
+    bh.iter(|| {
+        let mut mem = String::new();
+        let wr = &mut mem as &mut dyn fmt::Write;
+        for _ in 0..1000 {
+            write!(wr, "{:?}", "☃").unwrap();
+        }
+    });
+}
diff --git a/src/libcore/benches/lib.rs b/src/libcore/benches/lib.rs
index 5b4971c..48572af 100644
--- a/src/libcore/benches/lib.rs
+++ b/src/libcore/benches/lib.rs
@@ -11,3 +11,4 @@
 mod num;
 mod ops;
 mod slice;
+mod fmt;
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/convert.rs b/src/libcore/convert.rs
index 08b5ac0..203be54 100644
--- a/src/libcore/convert.rs
+++ b/src/libcore/convert.rs
@@ -463,11 +463,11 @@
 // Infallible conversions are semantically equivalent to fallible conversions
 // with an uninhabited error type.
 #[unstable(feature = "try_from", issue = "33417")]
-impl<T, U> TryFrom<U> for T where T: From<U> {
+impl<T, U> TryFrom<U> for T where U: Into<T> {
     type Error = !;
 
     fn try_from(value: U) -> Result<Self, Self::Error> {
-        Ok(T::from(value))
+        Ok(U::into(value))
     }
 }
 
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..935579f 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> {
@@ -997,28 +1006,30 @@
         curarg: args.args.iter(),
     };
 
-    let mut pieces = args.pieces.iter();
+    let mut idx = 0;
 
     match args.fmt {
         None => {
             // We can use default formatting parameters for all arguments.
-            for (arg, piece) in args.args.iter().zip(pieces.by_ref()) {
+            for (arg, piece) in args.args.iter().zip(args.pieces.iter()) {
                 formatter.buf.write_str(*piece)?;
                 (arg.formatter)(arg.value, &mut formatter)?;
+                idx += 1;
             }
         }
         Some(fmt) => {
             // Every spec has a corresponding argument that is preceded by
             // a string piece.
-            for (arg, piece) in fmt.iter().zip(pieces.by_ref()) {
+            for (arg, piece) in fmt.iter().zip(args.pieces.iter()) {
                 formatter.buf.write_str(*piece)?;
                 formatter.run(arg)?;
+                idx += 1;
             }
         }
     }
 
     // There can be only one trailing string piece left.
-    if let Some(piece) = pieces.next() {
+    if let Some(piece) = args.pieces.get(idx) {
         formatter.buf.write_str(*piece)?;
     }
 
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 0ad29af..ac21586 100644
--- a/src/libcore/iter/iterator.rs
+++ b/src/libcore/iter/iterator.rs
@@ -2605,6 +2605,95 @@
             }
         }
     }
+
+    /// Checks if the elements of this iterator are sorted.
+    ///
+    /// That is, for each element `a` and its following element `b`, `a <= b` must hold. If the
+    /// iterator yields exactly zero or one element, `true` is returned.
+    ///
+    /// Note that if `Self::Item` is only `PartialOrd`, but not `Ord`, the above definition
+    /// implies that this function returns `false` if any two consecutive items are not
+    /// comparable.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// #![feature(is_sorted)]
+    ///
+    /// assert!([1, 2, 2, 9].iter().is_sorted());
+    /// assert!(![1, 3, 2, 4].iter().is_sorted());
+    /// assert!([0].iter().is_sorted());
+    /// assert!(std::iter::empty::<i32>().is_sorted());
+    /// assert!(![0.0, 1.0, std::f32::NAN].iter().is_sorted());
+    /// ```
+    #[inline]
+    #[unstable(feature = "is_sorted", reason = "new API", issue = "53485")]
+    fn is_sorted(self) -> bool
+    where
+        Self: Sized,
+        Self::Item: PartialOrd,
+    {
+        self.is_sorted_by(|a, b| a.partial_cmp(b))
+    }
+
+    /// Checks if the elements of this iterator are sorted using the given comparator function.
+    ///
+    /// Instead of using `PartialOrd::partial_cmp`, this function uses the given `compare`
+    /// function to determine the ordering of two elements. Apart from that, it's equivalent to
+    /// [`is_sorted`]; see its documentation for more information.
+    ///
+    /// [`is_sorted`]: trait.Iterator.html#method.is_sorted
+    #[unstable(feature = "is_sorted", reason = "new API", issue = "53485")]
+    fn is_sorted_by<F>(mut self, mut compare: F) -> bool
+    where
+        Self: Sized,
+        F: FnMut(&Self::Item, &Self::Item) -> Option<Ordering>
+    {
+        let mut last = match self.next() {
+            Some(e) => e,
+            None => return true,
+        };
+
+        while let Some(curr) = self.next() {
+            if compare(&last, &curr)
+                .map(|o| o == Ordering::Greater)
+                .unwrap_or(true)
+            {
+                return false;
+            }
+            last = curr;
+        }
+
+        true
+    }
+
+    /// Checks if the elements of this iterator are sorted using the given key extraction
+    /// function.
+    ///
+    /// Instead of comparing the iterator's elements directly, this function compares the keys of
+    /// the elements, as determined by `f`. Apart from that, it's equivalent to [`is_sorted`]; see
+    /// its documentation for more information.
+    ///
+    /// [`is_sorted`]: trait.Iterator.html#method.is_sorted
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// #![feature(is_sorted)]
+    ///
+    /// assert!(["c", "bb", "aaa"].iter().is_sorted_by_key(|s| s.len()));
+    /// assert!(![-2i32, -1, 0, 3].iter().is_sorted_by_key(|n| n.abs()));
+    /// ```
+    #[inline]
+    #[unstable(feature = "is_sorted", reason = "new API", issue = "53485")]
+    fn is_sorted_by_key<F, K>(self, mut f: F) -> bool
+    where
+        Self: Sized,
+        F: FnMut(&Self::Item) -> K,
+        K: PartialOrd
+    {
+        self.is_sorted_by(|a, b| f(a).partial_cmp(&f(b)))
+    }
 }
 
 /// Select an element from an iterator based on the given "projection"
diff --git a/src/libcore/lib.rs b/src/libcore/lib.rs
index 33c0da8..df32cfa 100644
--- a/src/libcore/lib.rs
+++ b/src/libcore/lib.rs
@@ -79,6 +79,7 @@
 #![feature(extern_types)]
 #![feature(fundamental)]
 #![feature(intrinsics)]
+#![feature(is_sorted)]
 #![feature(iter_once_with)]
 #![feature(lang_items)]
 #![feature(link_llvm_intrinsics)]
diff --git a/src/libcore/num/mod.rs b/src/libcore/num/mod.rs
index 6827364..41caa17 100644
--- a/src/libcore/num/mod.rs
+++ b/src/libcore/num/mod.rs
@@ -10,9 +10,9 @@
 use str::FromStr;
 
 macro_rules! impl_nonzero_fmt {
-    ( ( $( $Trait: ident ),+ ) for $Ty: ident ) => {
+    ( #[$stability: meta] ( $( $Trait: ident ),+ ) for $Ty: ident ) => {
         $(
-            #[stable(feature = "nonzero", since = "1.28.0")]
+            #[$stability]
             impl fmt::$Trait for $Ty {
                 #[inline]
                 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
@@ -31,7 +31,7 @@
 }
 
 macro_rules! nonzero_integers {
-    ( $( $Ty: ident($Int: ty); )+ ) => {
+    ( $( #[$stability: meta] $Ty: ident($Int: ty); )+ ) => {
         $(
             doc_comment! {
                 concat!("An integer that is known not to equal zero.
@@ -41,10 +41,10 @@
 
 ```rust
 use std::mem::size_of;
-assert_eq!(size_of::<Option<std::num::", stringify!($Ty), ">>(), size_of::<", stringify!($Int),
+assert_eq!(size_of::<Option<core::num::", stringify!($Ty), ">>(), size_of::<", stringify!($Int),
 ">());
 ```"),
-                #[stable(feature = "nonzero", since = "1.28.0")]
+                #[$stability]
                 #[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
                 #[repr(transparent)]
                 #[rustc_layout_scalar_valid_range_start(1)]
@@ -57,14 +57,14 @@
                 /// # Safety
                 ///
                 /// The value must not be zero.
-                #[stable(feature = "nonzero", since = "1.28.0")]
+                #[$stability]
                 #[inline]
                 pub const unsafe fn new_unchecked(n: $Int) -> Self {
                     $Ty(n)
                 }
 
                 /// Create a non-zero if the given value is not zero.
-                #[stable(feature = "nonzero", since = "1.28.0")]
+                #[$stability]
                 #[inline]
                 pub fn new(n: $Int) -> Option<Self> {
                     if n != 0 {
@@ -75,7 +75,7 @@
                 }
 
                 /// Returns the value as a primitive type.
-                #[stable(feature = "nonzero", since = "1.28.0")]
+                #[$stability]
                 #[inline]
                 pub const fn get(self) -> $Int {
                     self.0
@@ -91,19 +91,25 @@
             }
 
             impl_nonzero_fmt! {
-                (Debug, Display, Binary, Octal, LowerHex, UpperHex) for $Ty
+                #[$stability] (Debug, Display, Binary, Octal, LowerHex, UpperHex) for $Ty
             }
         )+
     }
 }
 
 nonzero_integers! {
-    NonZeroU8(u8);
-    NonZeroU16(u16);
-    NonZeroU32(u32);
-    NonZeroU64(u64);
-    NonZeroU128(u128);
-    NonZeroUsize(usize);
+    #[stable(feature = "nonzero", since = "1.28.0")] NonZeroU8(u8);
+    #[stable(feature = "nonzero", since = "1.28.0")] NonZeroU16(u16);
+    #[stable(feature = "nonzero", since = "1.28.0")] NonZeroU32(u32);
+    #[stable(feature = "nonzero", since = "1.28.0")] NonZeroU64(u64);
+    #[stable(feature = "nonzero", since = "1.28.0")] NonZeroU128(u128);
+    #[stable(feature = "nonzero", since = "1.28.0")] NonZeroUsize(usize);
+    #[stable(feature = "signed_nonzero", since = "1.34.0")] NonZeroI8(i8);
+    #[stable(feature = "signed_nonzero", since = "1.34.0")] NonZeroI16(i16);
+    #[stable(feature = "signed_nonzero", since = "1.34.0")] NonZeroI32(i32);
+    #[stable(feature = "signed_nonzero", since = "1.34.0")] NonZeroI64(i64);
+    #[stable(feature = "signed_nonzero", since = "1.34.0")] NonZeroI128(i128);
+    #[stable(feature = "signed_nonzero", since = "1.34.0")] NonZeroIsize(isize);
 }
 
 /// Provides intentionally-wrapped arithmetic on `T`.
diff --git a/src/libcore/ops/index.rs b/src/libcore/ops/index.rs
index 4f55c68..d4ed861 100644
--- a/src/libcore/ops/index.rs
+++ b/src/libcore/ops/index.rs
@@ -141,6 +141,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/slice/mod.rs b/src/libcore/slice/mod.rs
index 7fdc2ac..9f9515e 100644
--- a/src/libcore/slice/mod.rs
+++ b/src/libcore/slice/mod.rs
@@ -1783,7 +1783,7 @@
     /// let mut a = ['a', 'b', 'c', 'd', 'e', 'f'];
     /// a[1..5].rotate_left(1);
     /// assert_eq!(a, ['a', 'c', 'd', 'e', 'b', 'f']);
-   /// ```
+    /// ```
     #[stable(feature = "slice_rotate", since = "1.26.0")]
     pub fn rotate_left(&mut self, mid: usize) {
         assert!(mid <= self.len());
@@ -2250,6 +2250,77 @@
              from_raw_parts_mut(mut_ptr.add(rest.len() - ts_len), ts_len))
         }
     }
+
+    /// Checks if the elements of this slice are sorted.
+    ///
+    /// That is, for each element `a` and its following element `b`, `a <= b` must hold. If the
+    /// slice yields exactly zero or one element, `true` is returned.
+    ///
+    /// Note that if `Self::Item` is only `PartialOrd`, but not `Ord`, the above definition
+    /// implies that this function returns `false` if any two consecutive items are not
+    /// comparable.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// #![feature(is_sorted)]
+    /// let empty: [i32; 0] = [];
+    ///
+    /// assert!([1, 2, 2, 9].is_sorted());
+    /// assert!(![1, 3, 2, 4].is_sorted());
+    /// assert!([0].is_sorted());
+    /// assert!(empty.is_sorted());
+    /// assert!(![0.0, 1.0, std::f32::NAN].is_sorted());
+    /// ```
+    #[inline]
+    #[unstable(feature = "is_sorted", reason = "new API", issue = "53485")]
+    pub fn is_sorted(&self) -> bool
+    where
+        T: PartialOrd,
+    {
+        self.is_sorted_by(|a, b| a.partial_cmp(b))
+    }
+
+    /// Checks if the elements of this slice are sorted using the given comparator function.
+    ///
+    /// Instead of using `PartialOrd::partial_cmp`, this function uses the given `compare`
+    /// function to determine the ordering of two elements. Apart from that, it's equivalent to
+    /// [`is_sorted`]; see its documentation for more information.
+    ///
+    /// [`is_sorted`]: #method.is_sorted
+    #[unstable(feature = "is_sorted", reason = "new API", issue = "53485")]
+    pub fn is_sorted_by<F>(&self, mut compare: F) -> bool
+    where
+        F: FnMut(&T, &T) -> Option<Ordering>
+    {
+        self.iter().is_sorted_by(|a, b| compare(*a, *b))
+    }
+
+    /// Checks if the elements of this slice are sorted using the given key extraction function.
+    ///
+    /// Instead of comparing the slice's elements directly, this function compares the keys of the
+    /// elements, as determined by `f`. Apart from that, it's equivalent to [`is_sorted`]; see its
+    /// documentation for more information.
+    ///
+    /// [`is_sorted`]: #method.is_sorted
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// #![feature(is_sorted)]
+    ///
+    /// assert!(["c", "bb", "aaa"].is_sorted_by_key(|s| s.len()));
+    /// assert!(![-2i32, -1, 0, 3].is_sorted_by_key(|n| n.abs()));
+    /// ```
+    #[inline]
+    #[unstable(feature = "is_sorted", reason = "new API", issue = "53485")]
+    pub fn is_sorted_by_key<F, K>(&self, mut f: F) -> bool
+    where
+        F: FnMut(&T) -> K,
+        K: PartialOrd
+    {
+        self.is_sorted_by(|a, b| f(a).partial_cmp(&f(b)))
+    }
 }
 
 #[lang = "slice_u8"]
@@ -2312,7 +2383,6 @@
 }
 
 #[stable(feature = "rust1", since = "1.0.0")]
-#[rustc_on_unimplemented = "slice indices are of type `usize` or ranges of `usize`"]
 impl<T, I> ops::Index<I> for [T]
     where I: SliceIndex<[T]>
 {
@@ -2325,7 +2395,6 @@
 }
 
 #[stable(feature = "rust1", since = "1.0.0")]
-#[rustc_on_unimplemented = "slice indices are of type `usize` or ranges of `usize`"]
 impl<T, I> ops::IndexMut<I> for [T]
     where I: SliceIndex<[T]>
 {
@@ -2376,7 +2445,19 @@
 
 /// A helper trait used for indexing operations.
 #[stable(feature = "slice_get_slice", since = "1.28.0")]
-#[rustc_on_unimplemented = "slice indices are of type `usize` or ranges of `usize`"]
+#[rustc_on_unimplemented(
+    on(
+        T = "str",
+        label = "string indices are ranges of `usize`",
+    ),
+    on(
+        all(any(T = "str", T = "&str", T = "std::string::String"), _Self="{integer}"),
+        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 `{T}` cannot be indexed by `{Self}`",
+    label = "slice indices are of type `usize` or ranges of `usize`",
+)]
 pub trait SliceIndex<T: ?Sized>: private_slice_index::Sealed {
     /// The output type returned by methods.
     #[stable(feature = "slice_get_slice", since = "1.28.0")]
@@ -2773,7 +2854,13 @@
 
 // The shared definition of the `Iter` and `IterMut` iterators
 macro_rules! iterator {
-    (struct $name:ident -> $ptr:ty, $elem:ty, $raw_mut:tt, $( $mut_:tt )*) => {
+    (
+        struct $name:ident -> $ptr:ty,
+        $elem:ty,
+        $raw_mut:tt,
+        {$( $mut_:tt )*},
+        {$($extra:tt)*}
+    ) => {
         impl<'a, T> $name<'a, T> {
             // Helper function for creating a slice from the iterator.
             #[inline(always)]
@@ -2950,6 +3037,8 @@
                         i
                     })
             }
+
+            $($extra)*
         }
 
         #[stable(feature = "rust1", since = "1.0.0")]
@@ -3087,7 +3176,17 @@
     }
 }
 
-iterator!{struct Iter -> *const T, &'a T, const, /* no mut */}
+iterator!{struct Iter -> *const T, &'a T, const, {/* no mut */}, {
+    fn is_sorted_by<F>(self, mut compare: F) -> bool
+    where
+        Self: Sized,
+        F: FnMut(&Self::Item, &Self::Item) -> Option<Ordering>,
+    {
+        self.as_slice().windows(2).all(|w| {
+            compare(&&w[0], &&w[1]).map(|o| o != Ordering::Greater).unwrap_or(false)
+        })
+    }
+}}
 
 #[stable(feature = "rust1", since = "1.0.0")]
 impl<T> Clone for Iter<'_, T> {
@@ -3188,7 +3287,7 @@
     }
 }
 
-iterator!{struct IterMut -> *mut T, &'a mut T, mut, mut}
+iterator!{struct IterMut -> *mut T, &'a mut T, mut, {mut}, {}}
 
 /// An internal abstraction over the splitting iterators, so that
 /// splitn, splitn_mut etc can be implemented once.
diff --git a/src/libcore/str/mod.rs b/src/libcore/str/mod.rs
index bdde187..1ee8b77 100644
--- a/src/libcore/str/mod.rs
+++ b/src/libcore/str/mod.rs
@@ -1621,190 +1621,26 @@
         }
     }
 
-    /// Implements substring slicing with syntax `&self[begin .. end]`.
-    ///
-    /// Returns a slice of the given string from the byte range
-    /// [`begin`..`end`).
-    ///
-    /// This operation is `O(1)`.
-    ///
-    /// # Panics
-    ///
-    /// Panics if `begin` or `end` does not point to the starting
-    /// byte offset of a character (as defined by `is_char_boundary`).
-    /// Requires that `begin <= end` and `end <= len` where `len` is the
-    /// length of the string.
-    ///
-    /// # Examples
-    ///
-    /// ```
-    /// let s = "Löwe 老虎 Léopard";
-    /// assert_eq!(&s[0 .. 1], "L");
-    ///
-    /// assert_eq!(&s[1 .. 9], "öwe 老");
-    ///
-    /// // these will panic:
-    /// // byte 2 lies within `ö`:
-    /// // &s[2 ..3];
-    ///
-    /// // byte 8 lies within `老`
-    /// // &s[1 .. 8];
-    ///
-    /// // byte 100 is outside the string
-    /// // &s[3 .. 100];
-    /// ```
     #[stable(feature = "rust1", since = "1.0.0")]
-    impl ops::Index<ops::Range<usize>> for str {
-        type Output = str;
+    impl<I> ops::Index<I> for str
+    where
+        I: SliceIndex<str>,
+    {
+        type Output = I::Output;
+
         #[inline]
-        fn index(&self, index: ops::Range<usize>) -> &str {
+        fn index(&self, index: I) -> &I::Output {
             index.index(self)
         }
     }
 
-    /// Implements mutable substring slicing with syntax
-    /// `&mut self[begin .. end]`.
-    ///
-    /// Returns a mutable slice of the given string from the byte range
-    /// [`begin`..`end`).
-    ///
-    /// This operation is `O(1)`.
-    ///
-    /// # Panics
-    ///
-    /// Panics if `begin` or `end` does not point to the starting
-    /// byte offset of a character (as defined by `is_char_boundary`).
-    /// Requires that `begin <= end` and `end <= len` where `len` is the
-    /// length of the string.
-    #[stable(feature = "derefmut_for_string", since = "1.3.0")]
-    impl ops::IndexMut<ops::Range<usize>> for str {
-        #[inline]
-        fn index_mut(&mut self, index: ops::Range<usize>) -> &mut str {
-            index.index_mut(self)
-        }
-    }
-
-    /// Implements substring slicing with syntax `&self[.. end]`.
-    ///
-    /// Returns a slice of the string from the beginning to byte offset
-    /// `end`.
-    ///
-    /// Equivalent to `&self[0 .. end]`.
     #[stable(feature = "rust1", since = "1.0.0")]
-    impl ops::Index<ops::RangeTo<usize>> for str {
-        type Output = str;
-
+    impl<I> ops::IndexMut<I> for str
+    where
+        I: SliceIndex<str>,
+    {
         #[inline]
-        fn index(&self, index: ops::RangeTo<usize>) -> &str {
-            index.index(self)
-        }
-    }
-
-    /// Implements mutable substring slicing with syntax `&mut self[.. end]`.
-    ///
-    /// Returns a mutable slice of the string from the beginning to byte offset
-    /// `end`.
-    ///
-    /// Equivalent to `&mut self[0 .. end]`.
-    #[stable(feature = "derefmut_for_string", since = "1.3.0")]
-    impl ops::IndexMut<ops::RangeTo<usize>> for str {
-        #[inline]
-        fn index_mut(&mut self, index: ops::RangeTo<usize>) -> &mut str {
-            index.index_mut(self)
-        }
-    }
-
-    /// Implements substring slicing with syntax `&self[begin ..]`.
-    ///
-    /// Returns a slice of the string from byte offset `begin`
-    /// to the end of the string.
-    ///
-    /// Equivalent to `&self[begin .. len]`.
-    #[stable(feature = "rust1", since = "1.0.0")]
-    impl ops::Index<ops::RangeFrom<usize>> for str {
-        type Output = str;
-
-        #[inline]
-        fn index(&self, index: ops::RangeFrom<usize>) -> &str {
-            index.index(self)
-        }
-    }
-
-    /// Implements mutable substring slicing with syntax `&mut self[begin ..]`.
-    ///
-    /// Returns a mutable slice of the string from byte offset `begin`
-    /// to the end of the string.
-    ///
-    /// Equivalent to `&mut self[begin .. len]`.
-    #[stable(feature = "derefmut_for_string", since = "1.3.0")]
-    impl ops::IndexMut<ops::RangeFrom<usize>> for str {
-        #[inline]
-        fn index_mut(&mut self, index: ops::RangeFrom<usize>) -> &mut str {
-            index.index_mut(self)
-        }
-    }
-
-    /// Implements substring slicing with syntax `&self[..]`.
-    ///
-    /// Returns a slice of the whole string. This operation can
-    /// never panic.
-    ///
-    /// Equivalent to `&self[0 .. len]`.
-    #[stable(feature = "rust1", since = "1.0.0")]
-    impl ops::Index<ops::RangeFull> for str {
-        type Output = str;
-
-        #[inline]
-        fn index(&self, _index: ops::RangeFull) -> &str {
-            self
-        }
-    }
-
-    /// Implements mutable substring slicing with syntax `&mut self[..]`.
-    ///
-    /// Returns a mutable slice of the whole string. This operation can
-    /// never panic.
-    ///
-    /// Equivalent to `&mut self[0 .. len]`.
-    #[stable(feature = "derefmut_for_string", since = "1.3.0")]
-    impl ops::IndexMut<ops::RangeFull> for str {
-        #[inline]
-        fn index_mut(&mut self, _index: ops::RangeFull) -> &mut str {
-            self
-        }
-    }
-
-    #[stable(feature = "inclusive_range", since = "1.26.0")]
-    impl ops::Index<ops::RangeInclusive<usize>> for str {
-        type Output = str;
-
-        #[inline]
-        fn index(&self, index: ops::RangeInclusive<usize>) -> &str {
-            index.index(self)
-        }
-    }
-
-    #[stable(feature = "inclusive_range", since = "1.26.0")]
-    impl ops::Index<ops::RangeToInclusive<usize>> for str {
-        type Output = str;
-
-        #[inline]
-        fn index(&self, index: ops::RangeToInclusive<usize>) -> &str {
-            index.index(self)
-        }
-    }
-
-    #[stable(feature = "inclusive_range", since = "1.26.0")]
-    impl ops::IndexMut<ops::RangeInclusive<usize>> for str {
-        #[inline]
-        fn index_mut(&mut self, index: ops::RangeInclusive<usize>) -> &mut str {
-            index.index_mut(self)
-        }
-    }
-    #[stable(feature = "inclusive_range", since = "1.26.0")]
-    impl ops::IndexMut<ops::RangeToInclusive<usize>> for str {
-        #[inline]
-        fn index_mut(&mut self, index: ops::RangeToInclusive<usize>) -> &mut str {
+        fn index_mut(&mut self, index: I) -> &mut I::Output {
             index.index_mut(self)
         }
     }
@@ -1815,6 +1651,18 @@
         panic!("attempted to index str up to maximum usize");
     }
 
+    /// Implements substring slicing with syntax `&self[..]` or `&mut self[..]`.
+    ///
+    /// Returns a slice of the whole string, i.e., returns `&self` or `&mut
+    /// self`. Equivalent to `&self[0 .. len]` or `&mut self[0 .. len]`. Unlike
+    /// other indexing operations, this can never panic.
+    ///
+    /// This operation is `O(1)`.
+    ///
+    /// Prior to 1.20.0, these indexing operations were still supported by
+    /// direct implementation of `Index` and `IndexMut`.
+    ///
+    /// Equivalent to `&self[0 .. len]` or `&mut self[0 .. len]`.
     #[stable(feature = "str_checked_slicing", since = "1.20.0")]
     impl SliceIndex<str> for ops::RangeFull {
         type Output = str;
@@ -1844,6 +1692,41 @@
         }
     }
 
+    /// Implements substring slicing with syntax `&self[begin .. end]` or `&mut
+    /// self[begin .. end]`.
+    ///
+    /// Returns a slice of the given string from the byte range
+    /// [`begin`, `end`).
+    ///
+    /// This operation is `O(1)`.
+    ///
+    /// Prior to 1.20.0, these indexing operations were still supported by
+    /// direct implementation of `Index` and `IndexMut`.
+    ///
+    /// # Panics
+    ///
+    /// Panics if `begin` or `end` does not point to the starting byte offset of
+    /// a character (as defined by `is_char_boundary`), if `begin > end`, or if
+    /// `end > len`.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// let s = "Löwe 老虎 Léopard";
+    /// assert_eq!(&s[0 .. 1], "L");
+    ///
+    /// assert_eq!(&s[1 .. 9], "öwe 老");
+    ///
+    /// // these will panic:
+    /// // byte 2 lies within `ö`:
+    /// // &s[2 ..3];
+    ///
+    /// // byte 8 lies within `老`
+    /// // &s[1 .. 8];
+    ///
+    /// // byte 100 is outside the string
+    /// // &s[3 .. 100];
+    /// ```
     #[stable(feature = "str_checked_slicing", since = "1.20.0")]
     impl SliceIndex<str> for ops::Range<usize> {
         type Output = str;
@@ -1898,6 +1781,21 @@
         }
     }
 
+    /// Implements substring slicing with syntax `&self[.. end]` or `&mut
+    /// self[.. end]`.
+    ///
+    /// Returns a slice of the given string from the byte range [`0`, `end`).
+    /// Equivalent to `&self[0 .. end]` or `&mut self[0 .. end]`.
+    ///
+    /// This operation is `O(1)`.
+    ///
+    /// Prior to 1.20.0, these indexing operations were still supported by
+    /// direct implementation of `Index` and `IndexMut`.
+    ///
+    /// # Panics
+    ///
+    /// Panics if `end` does not point to the starting byte offset of a
+    /// character (as defined by `is_char_boundary`), or if `end > len`.
     #[stable(feature = "str_checked_slicing", since = "1.20.0")]
     impl SliceIndex<str> for ops::RangeTo<usize> {
         type Output = str;
@@ -1943,6 +1841,22 @@
         }
     }
 
+    /// Implements substring slicing with syntax `&self[begin ..]` or `&mut
+    /// self[begin ..]`.
+    ///
+    /// Returns a slice of the given string from the byte range [`begin`,
+    /// `len`). Equivalent to `&self[begin .. len]` or `&mut self[begin ..
+    /// len]`.
+    ///
+    /// This operation is `O(1)`.
+    ///
+    /// Prior to 1.20.0, these indexing operations were still supported by
+    /// direct implementation of `Index` and `IndexMut`.
+    ///
+    /// # Panics
+    ///
+    /// Panics if `begin` does not point to the starting byte offset of
+    /// a character (as defined by `is_char_boundary`), or if `begin >= len`.
     #[stable(feature = "str_checked_slicing", since = "1.20.0")]
     impl SliceIndex<str> for ops::RangeFrom<usize> {
         type Output = str;
@@ -1990,6 +1904,22 @@
         }
     }
 
+    /// Implements substring slicing with syntax `&self[begin ..= end]` or `&mut
+    /// self[begin ..= end]`.
+    ///
+    /// Returns a slice of the given string from the byte range
+    /// [`begin`, `end`]. Equivalent to `&self [begin .. end + 1]` or `&mut
+    /// self[begin .. end + 1]`, except if `end` has the maximum value for
+    /// `usize`.
+    ///
+    /// This operation is `O(1)`.
+    ///
+    /// # Panics
+    ///
+    /// Panics if `begin` does not point to the starting byte offset of
+    /// a character (as defined by `is_char_boundary`), if `end` does not point
+    /// to the ending byte offset of a character (`end + 1` is either a starting
+    /// byte offset or equal to `len`), if `begin > end`, or if `end >= len`.
     #[stable(feature = "inclusive_range", since = "1.26.0")]
     impl SliceIndex<str> for ops::RangeInclusive<usize> {
         type Output = str;
@@ -2023,8 +1953,20 @@
         }
     }
 
-
-
+    /// Implements substring slicing with syntax `&self[..= end]` or `&mut
+    /// self[..= end]`.
+    ///
+    /// Returns a slice of the given string from the byte range [0, `end`].
+    /// Equivalent to `&self [0 .. end + 1]`, except if `end` has the maximum
+    /// value for `usize`.
+    ///
+    /// This operation is `O(1)`.
+    ///
+    /// # Panics
+    ///
+    /// Panics if `end` does not point to the ending byte offset of a character
+    /// (`end + 1` is either a starting byte offset as defined by
+    /// `is_char_boundary`, or equal to `len`), or if `end >= len`.
     #[stable(feature = "inclusive_range", since = "1.26.0")]
     impl SliceIndex<str> for ops::RangeToInclusive<usize> {
         type Output = str;
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 3944bc7..0fa9974 100644
--- a/src/libcore/tests/iter.rs
+++ b/src/libcore/tests/iter.rs
@@ -2235,3 +2235,16 @@
     assert_eq!((0..10).flat_map(f).flat_map(g).sum::<usize>(),
                 (0..10).flat_map(|x| f(x).flat_map(g)).sum::<usize>());
 }
+
+#[test]
+fn test_is_sorted() {
+    assert!([1, 2, 2, 9].iter().is_sorted());
+    assert!(![1, 3, 2].iter().is_sorted());
+    assert!([0].iter().is_sorted());
+    assert!(std::iter::empty::<i32>().is_sorted());
+    assert!(![0.0, 1.0, std::f32::NAN].iter().is_sorted());
+    assert!([-2, -1, 0, 3].iter().is_sorted());
+    assert!(![-2i32, -1, 0, 3].iter().is_sorted_by_key(|n| n.abs()));
+    assert!(!["c", "bb", "aaa"].iter().is_sorted());
+    assert!(["c", "bb", "aaa"].iter().is_sorted_by_key(|s| s.len()));
+}
diff --git a/src/libcore/tests/lib.rs b/src/libcore/tests/lib.rs
index a9b8dec..3e8549f 100644
--- a/src/libcore/tests/lib.rs
+++ b/src/libcore/tests/lib.rs
@@ -10,6 +10,7 @@
 #![feature(flt2dec)]
 #![feature(fmt_internals)]
 #![feature(hashmap_internals)]
+#![feature(is_sorted)]
 #![feature(iter_copied)]
 #![feature(iter_nth_back)]
 #![feature(iter_once_with)]
diff --git a/src/libcore/tests/nonzero.rs b/src/libcore/tests/nonzero.rs
index c813bf2..4532568 100644
--- a/src/libcore/tests/nonzero.rs
+++ b/src/libcore/tests/nonzero.rs
@@ -1,4 +1,4 @@
-use core::num::NonZeroU32;
+use core::num::{NonZeroU32, NonZeroI32};
 use core::option::Option;
 use core::option::Option::{Some, None};
 use std::mem::size_of;
@@ -13,6 +13,7 @@
 #[test]
 fn test_size_nonzero_in_option() {
     assert_eq!(size_of::<NonZeroU32>(), size_of::<Option<NonZeroU32>>());
+    assert_eq!(size_of::<NonZeroI32>(), size_of::<Option<NonZeroI32>>());
 }
 
 #[test]
@@ -118,3 +119,10 @@
     let num: u32 = nz.into();
     assert_eq!(num, 1u32);
 }
+
+#[test]
+fn test_from_signed_nonzero() {
+    let nz = NonZeroI32::new(1).unwrap();
+    let num: i32 = nz.into();
+    assert_eq!(num, 1i32);
+}
diff --git a/src/libcore/tests/slice.rs b/src/libcore/tests/slice.rs
index 2c96efb..e210e83 100644
--- a/src/libcore/tests/slice.rs
+++ b/src/libcore/tests/slice.rs
@@ -1317,3 +1317,18 @@
     // 2 is greater than 1, so this range is invalid.
     bytes.copy_within(2..1, 0);
 }
+
+#[test]
+fn test_is_sorted() {
+    let empty: [i32; 0] = [];
+
+    assert!([1, 2, 2, 9].is_sorted());
+    assert!(![1, 3, 2].is_sorted());
+    assert!([0].is_sorted());
+    assert!(empty.is_sorted());
+    assert!(![0.0, 1.0, std::f32::NAN].is_sorted());
+    assert!([-2, -1, 0, 3].is_sorted());
+    assert!(![-2i32, -1, 0, 3].is_sorted_by_key(|n| n.abs()));
+    assert!(!["c", "bb", "aaa"].is_sorted());
+    assert!(["c", "bb", "aaa"].is_sorted_by_key(|s| s.len()));
+}
diff --git a/src/libfmt_macros/lib.rs b/src/libfmt_macros/lib.rs
index 32ae878..da440cd 100644
--- a/src/libfmt_macros/lib.rs
+++ b/src/libfmt_macros/lib.rs
@@ -72,6 +72,15 @@
     ArgumentNamed(&'a str),
 }
 
+impl Position<'_> {
+    pub fn index(&self) -> Option<usize> {
+        match self {
+            ArgumentIs(i) | ArgumentImplicitlyIs(i) => Some(*i),
+            _ => None,
+        }
+    }
+}
+
 /// Enum of alignments which are supported.
 #[derive(Copy, Clone, PartialEq)]
 pub enum Alignment {
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..905a3ce 100644
--- a/src/librustc/hir/lowering.rs
+++ b/src/librustc/hir/lowering.rs
@@ -31,6 +31,7 @@
 //! in the HIR, especially for multiple identifiers.
 
 use dep_graph::DepGraph;
+use errors::Applicability;
 use hir::{self, ParamName};
 use hir::HirVec;
 use hir::map::{DefKey, DefPathData, Definitions};
@@ -1806,7 +1807,7 @@
         explicit_owner: Option<NodeId>,
     ) -> hir::PathSegment {
         let (mut generic_args, infer_types) = if let Some(ref generic_args) = segment.args {
-            let msg = "parenthesized parameters may only be used with a trait";
+            let msg = "parenthesized type parameters may only be used with a `Fn` trait";
             match **generic_args {
                 GenericArgs::AngleBracketed(ref data) => {
                     self.lower_angle_bracketed_parameter_data(data, param_mode, itctx)
@@ -1823,10 +1824,25 @@
                         (hir::GenericArgs::none(), true)
                     }
                     ParenthesizedGenericArgs::Err => {
-                        struct_span_err!(self.sess, data.span, E0214, "{}", msg)
-                            .span_label(data.span, "only traits may use parentheses")
-                            .emit();
-                        (hir::GenericArgs::none(), true)
+                        let mut err = struct_span_err!(self.sess, data.span, E0214, "{}", msg);
+                        err.span_label(data.span, "only `Fn` traits may use parentheses");
+                        if let Ok(snippet) = self.sess.source_map().span_to_snippet(data.span) {
+                            // Do not suggest going from `Trait()` to `Trait<>`
+                            if data.inputs.len() > 0 {
+                                err.span_suggestion_with_applicability(
+                                    data.span,
+                                    "use angle brackets instead",
+                                    format!("<{}>", &snippet[1..snippet.len() - 1]),
+                                    Applicability::MaybeIncorrect,
+                                );
+                            }
+                        };
+                        err.emit();
+                        (self.lower_angle_bracketed_parameter_data(
+                            &data.as_angle_bracketed_args(),
+                            param_mode,
+                            itctx).0,
+                         false)
                     }
                 },
             }
@@ -1915,7 +1931,7 @@
 
     fn lower_parenthesized_parameter_data(
         &mut self,
-        data: &ParenthesisedArgs,
+        data: &ParenthesizedArgs,
     ) -> (hir::GenericArgs, bool) {
         // Switch to `PassThrough` mode for anonymous lifetimes: this
         // means that we permit things like `&Ref<T>`, where `Ref` has
@@ -1925,7 +1941,7 @@
         self.with_anonymous_lifetime_mode(
             AnonymousLifetimeMode::PassThrough,
             |this| {
-                let &ParenthesisedArgs { ref inputs, ref output, span } = data;
+                let &ParenthesizedArgs { ref inputs, ref output, span } = data;
                 let inputs = inputs
                     .iter()
                     .map(|ty| this.lower_ty_direct(ty, ImplTraitContext::disallowed()))
@@ -1957,7 +1973,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 +1983,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 +2000,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 +3791,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 +4347,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 +4374,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 +4551,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 +4569,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 +4800,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 +4809,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..c3e4f0c 100644
--- a/src/librustc/hir/map/mod.rs
+++ b/src/librustc/hir/map/mod.rs
@@ -455,11 +455,20 @@
             Node::AnonConst(_) => {
                 BodyOwnerKind::Const
             }
+            Node::Variant(&Spanned { node: VariantKind { data: VariantData::Tuple(..), .. }, .. }) |
+            Node::StructCtor(..) |
+            Node::Item(&Item { node: ItemKind::Fn(..), .. }) |
+            Node::TraitItem(&TraitItem { node: TraitItemKind::Method(..), .. }) |
+            Node::ImplItem(&ImplItem { node: ImplItemKind::Method(..), .. }) => {
+                BodyOwnerKind::Fn
+            }
             Node::Item(&Item { node: ItemKind::Static(_, m, _), .. }) => {
                 BodyOwnerKind::Static(m)
             }
-            // Default to function if it's not a constant or static.
-            _ => BodyOwnerKind::Fn
+            Node::Expr(&Expr { node: ExprKind::Closure(..), .. }) => {
+                BodyOwnerKind::Closure
+            }
+            node => bug!("{:#?} is not a body node", node),
         }
     }
 
@@ -509,6 +518,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..b58b1d3 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 {
@@ -1310,6 +1270,9 @@
     /// Functions and methods.
     Fn,
 
+    /// Closures
+    Closure,
+
     /// Constants and associated constants.
     Const,
 
@@ -1317,6 +1280,15 @@
     Static(Mutability),
 }
 
+impl BodyOwnerKind {
+    pub fn is_fn_or_closure(self) -> bool {
+        match self {
+            BodyOwnerKind::Fn | BodyOwnerKind::Closure => true,
+            BodyOwnerKind::Const | BodyOwnerKind::Static(_) => false,
+        }
+    }
+}
+
 /// A constant (expression) that's not an item or associated item,
 /// but needs its own `DefId` for type-checking, const-eval, etc.
 /// These are usually found nested inside types (e.g., array lengths)
@@ -1466,7 +1438,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 +2038,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..7e48554 100644
--- a/src/librustc/ich/impls_syntax.rs
+++ b/src/librustc/ich/impls_syntax.rs
@@ -164,6 +164,7 @@
 impl_stable_hash_for_spanned!(::syntax::ast::LitKind);
 impl_stable_hash_for!(enum ::syntax::ast::LitKind {
     Str(value, style),
+    Err(value),
     ByteStr(value),
     Byte(value),
     Char(value),
@@ -258,7 +259,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);
                 }
             }
@@ -329,6 +330,7 @@
             match *lit {
                 token::Lit::Byte(val) |
                 token::Lit::Char(val) |
+                token::Lit::Err(val) |
                 token::Lit::Integer(val) |
                 token::Lit::Float(val) |
                 token::Lit::Str_(val) |
diff --git a/src/librustc/infer/error_reporting/mod.rs b/src/librustc/infer/error_reporting/mod.rs
index 2995b25..35f6e6a 100644
--- a/src/librustc/infer/error_reporting/mod.rs
+++ b/src/librustc/infer/error_reporting/mod.rs
@@ -485,12 +485,29 @@
         }
     }
 
-    fn note_error_origin(&self, err: &mut DiagnosticBuilder<'tcx>, cause: &ObligationCause<'tcx>) {
+    fn note_error_origin(
+        &self,
+        err: &mut DiagnosticBuilder<'tcx>,
+        cause: &ObligationCause<'tcx>,
+        exp_found: Option<ty::error::ExpectedFound<Ty<'tcx>>>,
+    ) {
         match cause.code {
             ObligationCauseCode::MatchExpressionArmPattern { span, ty } => {
                 if ty.is_suggestable() {  // don't show type `_`
                     err.span_label(span, format!("this match expression has type `{}`", ty));
                 }
+                if let Some(ty::error::ExpectedFound { found, .. }) = exp_found {
+                    if ty.is_box() && ty.boxed_ty() == found {
+                        if let Ok(snippet) = self.tcx.sess.source_map().span_to_snippet(span) {
+                            err.span_suggestion_with_applicability(
+                                span,
+                                "consider dereferencing the boxed value",
+                                format!("*{}", snippet),
+                                Applicability::MachineApplicable,
+                            );
+                        }
+                    }
+                }
             }
             ObligationCauseCode::MatchExpressionArm { arm_span, source } => match source {
                 hir::MatchSource::IfLetDesugar { .. } => {
@@ -1013,7 +1030,7 @@
 
         // It reads better to have the error origin as the final
         // thing.
-        self.note_error_origin(diag, &cause);
+        self.note_error_origin(diag, &cause, exp_found);
     }
 
     /// When encountering a case where `.as_ref()` on a `Result` or `Option` would be appropriate,
diff --git a/src/librustc/infer/lexical_region_resolve/mod.rs b/src/librustc/infer/lexical_region_resolve/mod.rs
index 39ce8cc..c0952fe 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>,
@@ -236,6 +241,14 @@
 
         match *b_data {
             VarValue::Value(cur_region) => {
+                // Identical scopes can show up quite often, if the fixed point
+                // iteration converges slowly, skip them
+                if let (ReScope(a_scope), ReScope(cur_scope)) = (a_region, cur_region) {
+                    if a_scope == cur_scope {
+                        return false;
+                    }
+                }
+
                 let mut lub = self.lub_concrete_regions(a_region, cur_region);
                 if lub == cur_region {
                     return false;
@@ -275,12 +288,6 @@
     fn lub_concrete_regions(&self, a: Region<'tcx>, b: Region<'tcx>) -> Region<'tcx> {
         let tcx = self.tcx();
 
-        // Equal scopes can show up quite often, if the fixed point
-        // iteration converges slowly, skip them
-        if a == b {
-            return a;
-        }
-
         match (a, b) {
             (&ty::ReClosureBound(..), _)
             | (_, &ty::ReClosureBound(..))
@@ -722,18 +729,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/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..31f91a1 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
@@ -1263,8 +1268,8 @@
 
         // The body of the every fn is a root scope.
         self.cx.parent = self.cx.var_parent;
-        if let hir::BodyOwnerKind::Fn = self.tcx.hir().body_owner_kind(owner_id) {
-            self.visit_expr(&body.value);
+        if self.tcx.hir().body_owner_kind(owner_id).is_fn_or_closure() {
+            self.visit_expr(&body.value)
         } else {
             // Only functions have an outer terminating (drop) scope, while
             // temporaries in constant initializers may be 'static, but only
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 7363b8b..cf00bf3 100644
--- a/src/librustc/session/mod.rs
+++ b/src/librustc/session/mod.rs
@@ -67,8 +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 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.
@@ -1173,8 +1171,6 @@
         host_tlib_path,
         target_tlib_path,
         parse_sess: p_s,
-        // For a library crate, this is always none
-        entry_fn: Once::new(),
         sysroot,
         local_crate_source_file,
         working_dir,
diff --git a/src/librustc/traits/error_reporting.rs b/src/librustc/traits/error_reporting.rs
index 367a7ea..1c92e2d 100644
--- a/src/librustc/traits/error_reporting.rs
+++ b/src/librustc/traits/error_reporting.rs
@@ -471,7 +471,7 @@
     }
 
     fn report_similar_impl_candidates(&self,
-                                      mut impl_candidates: Vec<ty::TraitRef<'tcx>>,
+                                      impl_candidates: Vec<ty::TraitRef<'tcx>>,
                                       err: &mut DiagnosticBuilder<'_>)
     {
         if impl_candidates.is_empty() {
@@ -497,14 +497,18 @@
         });
 
         // Sort impl candidates so that ordering is consistent for UI tests.
-        let normalized_impl_candidates = &mut impl_candidates[0..end]
+        let mut normalized_impl_candidates = impl_candidates
             .iter()
             .map(normalize)
             .collect::<Vec<String>>();
+
+        // Sort before taking the `..end` range,
+        // because the ordering of `impl_candidates` may not be deterministic:
+        // https://github.com/rust-lang/rust/pull/57475#issuecomment-455519507
         normalized_impl_candidates.sort();
 
         err.help(&format!("the following implementations were found:{}{}",
-                          normalized_impl_candidates.join(""),
+                          normalized_impl_candidates[..end].join(""),
                           if len > 5 {
                               format!("\nand {} others", len - 4)
                           } else {
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 562cd75..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,
@@ -435,10 +401,13 @@
         }
 
         if !dep_node.kind.is_input() {
-            if let Some(dep_node_index) = self.try_mark_green_and_read(&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
                 ))
@@ -454,6 +423,7 @@
         self,
         key: Q::Key,
         job: JobOwner<'a, 'gcx, Q>,
+        prev_dep_node_index: SerializedDepNodeIndex,
         dep_node_index: DepNodeIndex,
         dep_node: &DepNode
     ) -> Q::Value
@@ -466,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.
@@ -624,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
@@ -1281,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); }
@@ -1362,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!()); }
@@ -1413,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 bf69089..c372892 100644
--- a/src/librustc_codegen_ssa/back/symbol_export.rs
+++ b/src/librustc_codegen_ssa/back/symbol_export.rs
@@ -194,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_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 3b7de37..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 {
@@ -1170,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);
 }
@@ -1191,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,
@@ -1201,7 +1178,6 @@
 where
     F: for<'a> FnOnce(
         TyCtxt<'a, 'tcx, 'tcx>,
-        ty::CrateAnalysis,
         mpsc::Receiver<Box<dyn Any + Send>>,
         CompileResult,
     ) -> R,
@@ -1210,10 +1186,6 @@
         rustc_incremental::load_query_result_cache(sess)
     });
 
-    time(sess, "looking for entry point", || {
-        middle::entry::find_entry_point(sess, &hir_map, name)
-    });
-
     let mut local_providers = ty::query::Providers::default();
     default_provide(&mut local_providers);
     codegen_backend.provide(&mut local_providers);
@@ -1243,6 +1215,10 @@
             // 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)
             });
@@ -1265,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);
                 }
             }
@@ -1318,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));
@@ -1329,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()));
         },
     )
 }
@@ -1530,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/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/emitter.rs b/src/librustc_errors/emitter.rs
index 0443b22..25d09a3 100644
--- a/src/librustc_errors/emitter.rs
+++ b/src/librustc_errors/emitter.rs
@@ -959,7 +959,7 @@
             Style::MainHeaderMsg
         };
 
-        if msp.primary_spans().is_empty() && msp.span_labels().is_empty() && is_secondary
+        if !msp.has_primary_spans() && !msp.has_span_labels() && is_secondary
            && !self.short_message {
             // This is a secondary message with no span info
             for _ in 0..max_line_num_len {
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 ddb397b..f6c381f 100644
--- a/src/librustc_lint/builtin.rs
+++ b/src/librustc_lint/builtin.rs
@@ -35,7 +35,8 @@
 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};
@@ -689,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 {
@@ -787,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,
@@ -1547,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 0d05cc1..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;
@@ -114,7 +115,6 @@
                        UnsafeCode,
                        AnonymousParameters,
                        UnusedDocComment,
-                       BadRepr,
                        EllipsisInclusiveRangePatterns,
                        NonCamelCaseTypes,
                        );
@@ -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 2de1637..afb0218 100644
--- a/src/librustc_metadata/encoder.rs
+++ b/src/librustc_metadata/encoder.rs
@@ -1128,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,
@@ -1141,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),
         };
@@ -1214,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 {
@@ -1226,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,
             },
 
@@ -1236,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/mod.rs b/src/librustc_mir/borrow_check/mod.rs
index 4563224..9d49814 100644
--- a/src/librustc_mir/borrow_check/mod.rs
+++ b/src/librustc_mir/borrow_check/mod.rs
@@ -163,10 +163,7 @@
         |bd, i| DebugFormatted::new(&bd.move_data().move_paths[i]),
     ));
 
-    let locals_are_invalidated_at_exit = match tcx.hir().body_owner_kind(id) {
-            hir::BodyOwnerKind::Const | hir::BodyOwnerKind::Static(_) => false,
-            hir::BodyOwnerKind::Fn => true,
-    };
+    let locals_are_invalidated_at_exit = tcx.hir().body_owner_kind(id).is_fn_or_closure();
     let borrow_set = Rc::new(BorrowSet::build(
             tcx, mir, locals_are_invalidated_at_exit, &mdpe.move_data));
 
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/borrow_check/nll/universal_regions.rs b/src/librustc_mir/borrow_check/nll/universal_regions.rs
index c63d45c..0a214e6 100644
--- a/src/librustc_mir/borrow_check/nll/universal_regions.rs
+++ b/src/librustc_mir/borrow_check/nll/universal_regions.rs
@@ -476,6 +476,7 @@
         let closure_base_def_id = tcx.closure_base_def_id(self.mir_def_id);
 
         match tcx.hir().body_owner_kind(self.mir_node_id) {
+            BodyOwnerKind::Closure |
             BodyOwnerKind::Fn => {
                 let defining_ty = if self.mir_def_id == closure_base_def_id {
                     tcx.type_of(closure_base_def_id)
diff --git a/src/librustc_mir/build/mod.rs b/src/librustc_mir/build/mod.rs
index 2bf2824..420ae11 100644
--- a/src/librustc_mir/build/mod.rs
+++ b/src/librustc_mir/build/mod.rs
@@ -75,7 +75,7 @@
         let cx = Cx::new(&infcx, id);
         let mut mir = if cx.tables().tainted_by_errors {
             build::construct_error(cx, body_id)
-        } else if let hir::BodyOwnerKind::Fn = cx.body_owner_kind {
+        } else if cx.body_owner_kind.is_fn_or_closure() {
             // fetch the fully liberated fn signature (that is, all bound
             // types/lifetimes replaced)
             let fn_hir_id = tcx.hir().node_to_hir_id(id);
diff --git a/src/librustc_mir/build/scope.rs b/src/librustc_mir/build/scope.rs
index b44c2cc..78abba5 100644
--- a/src/librustc_mir/build/scope.rs
+++ b/src/librustc_mir/build/scope.rs
@@ -613,6 +613,7 @@
             hir::BodyOwnerKind::Static(_) =>
                 // No need to free storage in this context.
                 None,
+            hir::BodyOwnerKind::Closure |
             hir::BodyOwnerKind::Fn =>
                 Some(self.topmost_scope()),
         }
diff --git a/src/librustc_mir/const_eval.rs b/src/librustc_mir/const_eval.rs
index f5f4048..105856f 100644
--- a/src/librustc_mir/const_eval.rs
+++ b/src/librustc_mir/const_eval.rs
@@ -72,6 +72,7 @@
     ecx.stack.push(interpret::Frame {
         block: mir::START_BLOCK,
         locals: IndexVec::new(),
+        local_layouts: IndexVec::new(),
         instance,
         span,
         mir,
diff --git a/src/librustc_mir/hair/constant.rs b/src/librustc_mir/hair/constant.rs
index 37d741d..f63c3e2 100644
--- a/src/librustc_mir/hair/constant.rs
+++ b/src/librustc_mir/hair/constant.rs
@@ -37,6 +37,14 @@
             let id = tcx.allocate_bytes(s.as_bytes());
             ConstValue::new_slice(Scalar::Ptr(id.into()), s.len() as u64, &tcx)
         },
+        LitKind::Err(ref s) => {
+            let s = s.as_str();
+            let id = tcx.allocate_bytes(s.as_bytes());
+            return Ok(ty::Const {
+                val: ConstValue::new_slice(Scalar::Ptr(id.into()), s.len() as u64, &tcx),
+                ty: tcx.types.err,
+            });
+        },
         LitKind::ByteStr(ref data) => {
             let id = tcx.allocate_bytes(data);
             ConstValue::Scalar(Scalar::Ptr(id.into()))
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/hair/cx/mod.rs b/src/librustc_mir/hair/cx/mod.rs
index 6113d88..f514cac 100644
--- a/src/librustc_mir/hair/cx/mod.rs
+++ b/src/librustc_mir/hair/cx/mod.rs
@@ -61,6 +61,7 @@
         let constness = match body_owner_kind {
             hir::BodyOwnerKind::Const |
             hir::BodyOwnerKind::Static(_) => hir::Constness::Const,
+            hir::BodyOwnerKind::Closure |
             hir::BodyOwnerKind::Fn => hir::Constness::NotConst,
         };
 
diff --git a/src/librustc_mir/interpret/eval_context.rs b/src/librustc_mir/interpret/eval_context.rs
index 19362b6..b2d3328 100644
--- a/src/librustc_mir/interpret/eval_context.rs
+++ b/src/librustc_mir/interpret/eval_context.rs
@@ -1,3 +1,4 @@
+use std::cell::Cell;
 use std::fmt::Write;
 use std::mem;
 
@@ -76,6 +77,7 @@
     /// `None` represents a local that is currently dead, while a live local
     /// can either directly contain `Scalar` or refer to some part of an `Allocation`.
     pub locals: IndexVec<mir::Local, LocalValue<Tag>>,
+    pub local_layouts: IndexVec<mir::Local, Cell<Option<TyLayout<'tcx>>>>,
 
     ////////////////////////////////////////////////////////////////////////////////
     // Current position within the function
@@ -290,9 +292,15 @@
         frame: &Frame<'mir, 'tcx, M::PointerTag, M::FrameExtra>,
         local: mir::Local
     ) -> EvalResult<'tcx, TyLayout<'tcx>> {
-        let local_ty = frame.mir.local_decls[local].ty;
-        let local_ty = self.monomorphize(local_ty, frame.instance.substs);
-        self.layout_of(local_ty)
+        let cell = &frame.local_layouts[local];
+        if cell.get().is_none() {
+            let local_ty = frame.mir.local_decls[local].ty;
+            let local_ty = self.monomorphize(local_ty, frame.instance.substs);
+            let layout = self.layout_of(local_ty)?;
+            cell.set(Some(layout));
+        }
+
+        Ok(cell.get().unwrap())
     }
 
     pub fn str_to_immediate(&mut self, s: &str) -> EvalResult<'tcx, Immediate<M::PointerTag>> {
@@ -426,6 +434,7 @@
             // empty local array, we fill it in below, after we are inside the stack frame and
             // all methods actually know about the frame
             locals: IndexVec::new(),
+            local_layouts: IndexVec::from_elem_n(Default::default(), mir.local_decls.len()),
             span,
             instance,
             stmt: 0,
@@ -464,11 +473,11 @@
                 },
             }
             // Finally, properly initialize all those that still have the dummy value
-            for (local, decl) in locals.iter_mut().zip(mir.local_decls.iter()) {
+            for (idx, local) in locals.iter_enumerated_mut() {
                 match *local {
                     LocalValue::Live(_) => {
                         // This needs to be peoperly initialized.
-                        let layout = self.layout_of(self.monomorphize(decl.ty, instance.substs))?;
+                        let layout = self.layout_of_local(self.frame(), idx)?;
                         *local = LocalValue::Live(self.uninit_operand(layout)?);
                     }
                     LocalValue::Dead => {
diff --git a/src/librustc_mir/interpret/operand.rs b/src/librustc_mir/interpret/operand.rs
index 04e0955..b264848 100644
--- a/src/librustc_mir/interpret/operand.rs
+++ b/src/librustc_mir/interpret/operand.rs
@@ -457,36 +457,30 @@
     }
 
     /// This is used by [priroda](https://github.com/oli-obk/priroda) to get an OpTy from a local
-    ///
-    /// When you know the layout of the local in advance, you can pass it as last argument
-    pub fn access_local(
+    fn access_local(
         &self,
         frame: &super::Frame<'mir, 'tcx, M::PointerTag, M::FrameExtra>,
         local: mir::Local,
-        layout: Option<TyLayout<'tcx>>,
     ) -> EvalResult<'tcx, OpTy<'tcx, M::PointerTag>> {
         assert_ne!(local, mir::RETURN_PLACE);
         let op = *frame.locals[local].access()?;
-        let layout = from_known_layout(layout,
-                    || self.layout_of_local(frame, local))?;
+        let layout = self.layout_of_local(frame, local)?;
         Ok(OpTy { op, layout })
     }
 
     // Evaluate a place with the goal of reading from it.  This lets us sometimes
-    // avoid allocations.  If you already know the layout, you can pass it in
-    // to avoid looking it up again.
+    // avoid allocations.
     fn eval_place_to_op(
         &self,
         mir_place: &mir::Place<'tcx>,
-        layout: Option<TyLayout<'tcx>>,
     ) -> EvalResult<'tcx, OpTy<'tcx, M::PointerTag>> {
         use rustc::mir::Place::*;
         let op = match *mir_place {
             Local(mir::RETURN_PLACE) => return err!(ReadFromReturnPointer),
-            Local(local) => self.access_local(self.frame(), local, layout)?,
+            Local(local) => self.access_local(self.frame(), local)?,
 
             Projection(ref proj) => {
-                let op = self.eval_place_to_op(&proj.base, None)?;
+                let op = self.eval_place_to_op(&proj.base)?;
                 self.operand_projection(op, &proj.elem)?
             }
 
@@ -510,7 +504,7 @@
             // FIXME: do some more logic on `move` to invalidate the old location
             Copy(ref place) |
             Move(ref place) =>
-                self.eval_place_to_op(place, layout)?,
+                self.eval_place_to_op(place)?,
 
             Constant(ref constant) => {
                 let layout = from_known_layout(layout, || {
diff --git a/src/librustc_mir/interpret/snapshot.rs b/src/librustc_mir/interpret/snapshot.rs
index f9ce7b4..5310526 100644
--- a/src/librustc_mir/interpret/snapshot.rs
+++ b/src/librustc_mir/interpret/snapshot.rs
@@ -314,13 +314,14 @@
     stmt: usize,
 }
 
-impl_stable_hash_for!(impl<'tcx, 'mir: 'tcx> for struct Frame<'mir, 'tcx> {
+impl_stable_hash_for!(impl<'mir, 'tcx: 'mir> for struct Frame<'mir, 'tcx> {
     mir,
     instance,
     span,
     return_to_block,
     return_place -> (return_place.as_ref().map(|r| &**r)),
     locals,
+    local_layouts -> _,
     block,
     stmt,
     extra,
@@ -339,6 +340,7 @@
             return_to_block,
             return_place,
             locals,
+            local_layouts: _,
             block,
             stmt,
             extra: _,
diff --git a/src/librustc_mir/interpret/validity.rs b/src/librustc_mir/interpret/validity.rs
index a5fb445..8f5a5bf 100644
--- a/src/librustc_mir/interpret/validity.rs
+++ b/src/librustc_mir/interpret/validity.rs
@@ -449,8 +449,13 @@
         }
         // At least one value is excluded. Get the bits.
         let value = try_validation!(value.not_undef(),
-            value, self.path,
-            format!("something in the range {:?}", layout.valid_range));
+            value,
+            self.path,
+            format!(
+                "something {}",
+                wrapping_range_format(&layout.valid_range, max_hi),
+            )
+        );
         let bits = match value {
             Scalar::Ptr(ptr) => {
                 if lo == 1 && hi == max_hi {
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/check_unsafety.rs b/src/librustc_mir/transform/check_unsafety.rs
index eb151b5..ab8da2f 100644
--- a/src/librustc_mir/transform/check_unsafety.rs
+++ b/src/librustc_mir/transform/check_unsafety.rs
@@ -4,6 +4,7 @@
 
 use rustc::ty::query::Providers;
 use rustc::ty::{self, TyCtxt};
+use rustc::ty::cast::CastTy;
 use rustc::hir;
 use rustc::hir::Node;
 use rustc::hir::def_id::DefId;
@@ -20,6 +21,7 @@
 
 pub struct UnsafetyChecker<'a, 'tcx: 'a> {
     mir: &'a Mir<'tcx>,
+    const_context: bool,
     min_const_fn: bool,
     source_scope_local_data: &'a IndexVec<SourceScope, SourceScopeLocalData>,
     violations: Vec<UnsafetyViolation>,
@@ -33,14 +35,20 @@
 
 impl<'a, 'gcx, 'tcx> UnsafetyChecker<'a, 'tcx> {
     fn new(
+        const_context: bool,
         min_const_fn: bool,
         mir: &'a Mir<'tcx>,
         source_scope_local_data: &'a IndexVec<SourceScope, SourceScopeLocalData>,
         tcx: TyCtxt<'a, 'tcx, 'tcx>,
         param_env: ty::ParamEnv<'tcx>,
     ) -> Self {
+        // sanity check
+        if min_const_fn {
+            assert!(const_context);
+        }
         Self {
             mir,
+            const_context,
             min_const_fn,
             source_scope_local_data,
             violations: vec![],
@@ -124,29 +132,70 @@
                     rvalue: &Rvalue<'tcx>,
                     location: Location)
     {
-        if let &Rvalue::Aggregate(box ref aggregate, _) = rvalue {
-            match aggregate {
-                &AggregateKind::Array(..) |
-                &AggregateKind::Tuple => {}
-                &AggregateKind::Adt(ref def, ..) => {
-                    match self.tcx.layout_scalar_valid_range(def.did) {
-                        (Bound::Unbounded, Bound::Unbounded) => {},
-                        _ => self.require_unsafe(
-                            "initializing type with `rustc_layout_scalar_valid_range` attr",
-                            "initializing a layout restricted type's field with a value outside \
-                            the valid range is undefined behavior",
-                            UnsafetyViolationKind::GeneralAndConstFn,
-                        ),
+        match rvalue {
+            Rvalue::Aggregate(box ref aggregate, _) => {
+                match aggregate {
+                    &AggregateKind::Array(..) |
+                    &AggregateKind::Tuple => {}
+                    &AggregateKind::Adt(ref def, ..) => {
+                        match self.tcx.layout_scalar_valid_range(def.did) {
+                            (Bound::Unbounded, Bound::Unbounded) => {},
+                            _ => self.require_unsafe(
+                                "initializing type with `rustc_layout_scalar_valid_range` attr",
+                                "initializing a layout restricted type's field with a value \
+                                outside the valid range is undefined behavior",
+                                UnsafetyViolationKind::GeneralAndConstFn,
+                            ),
+                        }
+                    }
+                    &AggregateKind::Closure(def_id, _) |
+                    &AggregateKind::Generator(def_id, _, _) => {
+                        let UnsafetyCheckResult {
+                            violations, unsafe_blocks
+                        } = self.tcx.unsafety_check_result(def_id);
+                        self.register_violations(&violations, &unsafe_blocks);
                     }
                 }
-                &AggregateKind::Closure(def_id, _) |
-                &AggregateKind::Generator(def_id, _, _) => {
-                    let UnsafetyCheckResult {
-                        violations, unsafe_blocks
-                    } = self.tcx.unsafety_check_result(def_id);
-                    self.register_violations(&violations, &unsafe_blocks);
+            },
+            // casting pointers to ints is unsafe in const fn because the const evaluator cannot
+            // possibly know what the result of various operations like `address / 2` would be
+            // pointers during const evaluation have no integral address, only an abstract one
+            Rvalue::Cast(CastKind::Misc, ref operand, cast_ty)
+            if self.const_context && self.tcx.features().const_raw_ptr_to_usize_cast => {
+                let operand_ty = operand.ty(self.mir, self.tcx);
+                let cast_in = CastTy::from_ty(operand_ty).expect("bad input type for cast");
+                let cast_out = CastTy::from_ty(cast_ty).expect("bad output type for cast");
+                match (cast_in, cast_out) {
+                    (CastTy::Ptr(_), CastTy::Int(_)) |
+                    (CastTy::FnPtr, CastTy::Int(_)) => {
+                        self.register_violations(&[UnsafetyViolation {
+                            source_info: self.source_info,
+                            description: Symbol::intern("cast of pointer to int").as_interned_str(),
+                            details: Symbol::intern("casting pointers to integers in constants")
+                                     .as_interned_str(),
+                            kind: UnsafetyViolationKind::General,
+                        }], &[]);
+                    },
+                    _ => {},
                 }
             }
+            // raw pointer and fn pointer operations are unsafe as it is not clear whether one
+            // pointer would be "less" or "equal" to another, because we cannot know where llvm
+            // or the linker will place various statics in memory. Without this information the
+            // result of a comparison of addresses would differ between runtime and compile-time.
+            Rvalue::BinaryOp(_, ref lhs, _)
+            if self.const_context && self.tcx.features().const_compare_raw_pointers => {
+                if let ty::RawPtr(_) | ty::FnPtr(..) = lhs.ty(self.mir, self.tcx).sty {
+                    self.register_violations(&[UnsafetyViolation {
+                        source_info: self.source_info,
+                        description: Symbol::intern("pointer operation").as_interned_str(),
+                        details: Symbol::intern("operations on pointers in constants")
+                                 .as_interned_str(),
+                        kind: UnsafetyViolationKind::General,
+                    }], &[]);
+                }
+            }
+            _ => {},
         }
         self.super_rvalue(rvalue, location);
     }
@@ -484,8 +533,16 @@
     };
 
     let param_env = tcx.param_env(def_id);
+
+    let id = tcx.hir().as_local_node_id(def_id).unwrap();
+    let (const_context, min_const_fn) = match tcx.hir().body_owner_kind(id) {
+        hir::BodyOwnerKind::Closure => (false, false),
+        hir::BodyOwnerKind::Fn => (tcx.is_const_fn(def_id), tcx.is_min_const_fn(def_id)),
+        hir::BodyOwnerKind::Const |
+        hir::BodyOwnerKind::Static(_) => (true, false),
+    };
     let mut checker = UnsafetyChecker::new(
-        tcx.is_min_const_fn(def_id),
+        const_context, min_const_fn,
         mir, source_scope_local_data, tcx, param_env);
     checker.visit_mir(mir);
 
diff --git a/src/librustc_mir/transform/inline.rs b/src/librustc_mir/transform/inline.rs
index 8b970c1..9f0907a 100644
--- a/src/librustc_mir/transform/inline.rs
+++ b/src/librustc_mir/transform/inline.rs
@@ -1,6 +1,5 @@
 //! Inlining pass for MIR functions
 
-use rustc::hir;
 use rustc::hir::CodegenFnAttrFlags;
 use rustc::hir::def_id::DefId;
 
@@ -74,15 +73,12 @@
 
         // Only do inlining into fn bodies.
         let id = self.tcx.hir().as_local_node_id(self.source.def_id).unwrap();
-        let body_owner_kind = self.tcx.hir().body_owner_kind(id);
-
-        if let (hir::BodyOwnerKind::Fn, None) = (body_owner_kind, self.source.promoted) {
-
+        if self.tcx.hir().body_owner_kind(id).is_fn_or_closure() && self.source.promoted.is_none() {
             for (bb, bb_data) in caller_mir.basic_blocks().iter_enumerated() {
                 if let Some(callsite) = self.get_valid_function_call(bb,
-                                                                     bb_data,
-                                                                     caller_mir,
-                                                                     param_env) {
+                                                                    bb_data,
+                                                                    caller_mir,
+                                                                    param_env) {
                     callsites.push_back(callsite);
                 }
             }
diff --git a/src/librustc_mir/transform/qualify_consts.rs b/src/librustc_mir/transform/qualify_consts.rs
index 78cf715..2d94190 100644
--- a/src/librustc_mir/transform/qualify_consts.rs
+++ b/src/librustc_mir/transform/qualify_consts.rs
@@ -1152,6 +1152,7 @@
         let id = tcx.hir().as_local_node_id(def_id).unwrap();
         let mut const_promoted_temps = None;
         let mode = match tcx.hir().body_owner_kind(id) {
+            hir::BodyOwnerKind::Closure => Mode::Fn,
             hir::BodyOwnerKind::Fn => {
                 if tcx.is_const_fn(def_id) {
                     Mode::ConstFn
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_mir/util/pretty.rs b/src/librustc_mir/util/pretty.rs
index fca208b..f4685e0 100644
--- a/src/librustc_mir/util/pretty.rs
+++ b/src/librustc_mir/util/pretty.rs
@@ -573,6 +573,7 @@
     let body_owner_kind = tcx.hir().body_owner_kind(id);
     match (body_owner_kind, src.promoted) {
         (_, Some(i)) => write!(w, "{:?} in", i)?,
+        (hir::BodyOwnerKind::Closure, _) |
         (hir::BodyOwnerKind::Fn, _) => write!(w, "fn")?,
         (hir::BodyOwnerKind::Const, _) => write!(w, "const")?,
         (hir::BodyOwnerKind::Static(hir::MutImmutable), _) => write!(w, "static")?,
@@ -585,6 +586,7 @@
     })?;
 
     match (body_owner_kind, src.promoted) {
+        (hir::BodyOwnerKind::Closure, None) |
         (hir::BodyOwnerKind::Fn, None) => {
             write!(w, "(")?;
 
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..c11b1af 100644
--- a/src/librustc_passes/rvalue_promotion.rs
+++ b/src/librustc_passes/rvalue_promotion.rs
@@ -191,6 +191,7 @@
         self.in_static = false;
 
         match self.tcx.hir().body_owner_kind(item_id) {
+            hir::BodyOwnerKind::Closure |
             hir::BodyOwnerKind::Fn => self.in_fn = true,
             hir::BodyOwnerKind::Static(_) => self.in_static = true,
             _ => {}
@@ -220,26 +221,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/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 a25009c..4c9347a 100644
--- a/src/librustc_resolve/lib.rs
+++ b/src/librustc_resolve/lib.rs
@@ -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);
                                 },
                                 _ => {
@@ -4598,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,
@@ -4823,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();
@@ -4965,11 +5013,7 @@
                 ))
             }
 
-            if b.span.is_dummy() {
-                err.note(&note_msg);
-            } else {
-                err.span_note(b.span, &note_msg);
-            }
+            err.span_note(b.span, &note_msg);
             for (i, help_msg) in help_msgs.iter().enumerate() {
                 let or = if i == 0 { "" } else { "or " };
                 err.help(&format!("{}{}", or, help_msg));
@@ -5084,10 +5128,10 @@
                           container));
 
         err.span_label(span, format!("`{}` re{} here", name, new_participle));
-        if !old_binding.span.is_dummy() {
-            err.span_label(self.session.source_map().def_span(old_binding.span),
-                           format!("previous {} of the {} `{}` here", old_noun, old_kind, name));
-        }
+        err.span_label(
+            self.session.source_map().def_span(old_binding.span),
+            format!("previous {} of the {} `{}` here", old_noun, old_kind, name),
+        );
 
         // See https://github.com/rust-lang/rust/issues/32354
         if old_binding.is_import() || new_binding.is_import() {
@@ -5305,12 +5349,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..e47da3c 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>;
 
@@ -327,6 +367,7 @@
 
     ("aarch64-unknown-freebsd", aarch64_unknown_freebsd),
     ("i686-unknown-freebsd", i686_unknown_freebsd),
+    ("powerpc64-unknown-freebsd", powerpc64_unknown_freebsd),
     ("x86_64-unknown-freebsd", x86_64_unknown_freebsd),
 
     ("i686-unknown-dragonfly", i686_unknown_dragonfly),
@@ -690,7 +731,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 +822,7 @@
             requires_uwtable: false,
             simd_types_indirect: true,
             override_export_symbols: None,
+            merge_functions: MergeFunctions::Aliases,
         }
     }
 }
@@ -875,6 +925,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 +1127,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 +1339,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_target/spec/powerpc64_unknown_freebsd.rs b/src/librustc_target/spec/powerpc64_unknown_freebsd.rs
new file mode 100644
index 0000000..cc7b87b
--- /dev/null
+++ b/src/librustc_target/spec/powerpc64_unknown_freebsd.rs
@@ -0,0 +1,22 @@
+use spec::{LinkerFlavor, Target, TargetResult};
+
+pub fn target() -> TargetResult {
+    let mut base = super::freebsd_base::opts();
+    base.cpu = "ppc64".to_string();
+    base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-m64".to_string());
+    base.max_atomic_width = Some(64);
+
+    Ok(Target {
+        llvm_target: "powerpc64-unknown-freebsd".to_string(),
+        target_endian: "big".to_string(),
+        target_pointer_width: "64".to_string(),
+        target_c_int_width: "32".to_string(),
+        data_layout: "E-m:e-i64:64-n32:64".to_string(),
+        arch: "powerpc64".to_string(),
+        target_os: "freebsd".to_string(),
+        target_env: String::new(),
+        target_vendor: "unknown".to_string(),
+        linker_flavor: LinkerFlavor::Gcc,
+        options: base,
+    })
+}
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/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/demand.rs b/src/librustc_typeck/check/demand.rs
index c0cedd7..d985bda 100644
--- a/src/librustc_typeck/check/demand.rs
+++ b/src/librustc_typeck/check/demand.rs
@@ -454,12 +454,13 @@
         false
     }
 
-    pub fn check_for_cast(&self,
-                      err: &mut DiagnosticBuilder<'tcx>,
-                      expr: &hir::Expr,
-                      checked_ty: Ty<'tcx>,
-                      expected_ty: Ty<'tcx>)
-                      -> bool {
+    pub fn check_for_cast(
+        &self,
+        err: &mut DiagnosticBuilder<'tcx>,
+        expr: &hir::Expr,
+        checked_ty: Ty<'tcx>,
+        expected_ty: Ty<'tcx>,
+    ) -> bool {
         let parent_id = self.tcx.hir().get_parent_node(expr.id);
         if let Some(parent) = self.tcx.hir().find(parent_id) {
             // Shouldn't suggest `.into()` on `const`s.
@@ -487,17 +488,40 @@
         // For now, don't suggest casting with `as`.
         let can_cast = false;
 
+        let mut prefix = String::new();
+        if let Some(hir::Node::Expr(hir::Expr {
+            node: hir::ExprKind::Struct(_, fields, _),
+            ..
+        })) = self.tcx.hir().find(self.tcx.hir().get_parent_node(expr.id)) {
+            // `expr` is a literal field for a struct, only suggest if appropriate
+            for field in fields {
+                if field.expr.id == expr.id && field.is_shorthand {
+                    // This is a field literal
+                    prefix = format!("{}: ", field.ident);
+                    break;
+                }
+            }
+            if &prefix == "" {
+                // Likely a field was meant, but this field wasn't found. Do not suggest anything.
+                return false;
+            }
+        }
+
         let needs_paren = expr.precedence().order() < (PREC_POSTFIX as i8);
 
         if let Ok(src) = self.tcx.sess.source_map().span_to_snippet(expr.span) {
             let msg = format!("you can cast an `{}` to `{}`", checked_ty, expected_ty);
-            let cast_suggestion = format!("{}{}{} as {}",
-                                          if needs_paren { "(" } else { "" },
-                                          src,
-                                          if needs_paren { ")" } else { "" },
-                                          expected_ty);
+            let cast_suggestion = format!(
+                "{}{}{}{} as {}",
+                prefix,
+                if needs_paren { "(" } else { "" },
+                src,
+                if needs_paren { ")" } else { "" },
+                expected_ty,
+            );
             let into_suggestion = format!(
-                "{}{}{}.into()",
+                "{}{}{}{}.into()",
+                prefix,
                 if needs_paren { "(" } else { "" },
                 src,
                 if needs_paren { ")" } else { "" },
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..ad4bc3c 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()));
             }
         }
     }
@@ -3121,7 +3121,8 @@
                 opt_ty.unwrap_or_else(
                     || tcx.mk_float_var(self.next_float_var_id()))
             }
-            ast::LitKind::Bool(_) => tcx.types.bool
+            ast::LitKind::Bool(_) => tcx.types.bool,
+            ast::LitKind::Err(_) => tcx.types.err,
         }
     }
 
@@ -4347,11 +4348,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 +4729,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 +4845,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 +4858,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 +5086,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 +5193,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 +5210,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 +5234,9 @@
                 if ty.sty == expected.sty {
                     err.span_label(sp, format!("expected `{}` because of return type",
                                                expected));
+                    return true;
                 }
+                false
             }
         }
     }
@@ -5273,7 +5280,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/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/highlight.rs b/src/librustdoc/html/highlight.rs
index 87e979b..e43251b 100644
--- a/src/librustdoc/html/highlight.rs
+++ b/src/librustdoc/html/highlight.rs
@@ -25,40 +25,51 @@
     tooltip: Option<(&str, &str)>,
 ) -> String {
     debug!("highlighting: ================\n{}\n==============", src);
-    let sess = parse::ParseSess::new(FilePathMapping::empty());
-    let fm = sess.source_map().new_source_file(FileName::Custom("stdin".to_string()),
-                                               src.to_string());
-
     let mut out = Vec::new();
     if let Some((tooltip, class)) = tooltip {
         write!(out, "<div class='information'><div class='tooltip {}'>ⓘ<span \
                      class='tooltiptext'>{}</span></div></div>",
                class, tooltip).unwrap();
     }
-    write_header(class, &mut out).unwrap();
 
-    let lexer = match lexer::StringReader::new_without_err(&sess, fm, None, "Output from rustc:") {
-        Ok(l) => l,
-        Err(_) => {
-            let first_line = src.lines().next().unwrap_or_else(|| "");
-            let mut err = sess.span_diagnostic
-                              .struct_warn(&format!("Invalid doc comment starting with: `{}`\n\
-                                                     (Ignoring this codeblock)",
-                                                    first_line));
-            err.emit();
-            return String::new();
+    let sess = parse::ParseSess::new(FilePathMapping::empty());
+    let fm = sess.source_map().new_source_file(
+        FileName::Custom(String::from("rustdoc-highlighting")),
+        src.to_owned(),
+    );
+    let highlight_result =
+        lexer::StringReader::new_or_buffered_errs(&sess, fm, None).and_then(|lexer| {
+            let mut classifier = Classifier::new(lexer, sess.source_map());
+
+            let mut highlighted_source = vec![];
+            if classifier.write_source(&mut highlighted_source).is_err() {
+                Err(classifier.lexer.buffer_fatal_errors())
+            } else {
+                Ok(String::from_utf8_lossy(&highlighted_source).into_owned())
+            }
+        });
+
+    match highlight_result {
+        Ok(highlighted_source) => {
+            write_header(class, &mut out).unwrap();
+            write!(out, "{}", highlighted_source).unwrap();
+            if let Some(extension) = extension {
+                write!(out, "{}", extension).unwrap();
+            }
+            write_footer(&mut out).unwrap();
         }
-    };
-    let mut classifier = Classifier::new(lexer, sess.source_map());
-    if classifier.write_source(&mut out).is_err() {
-        classifier.lexer.emit_fatal_errors();
-        return format!("<pre>{}</pre>", src);
+        Err(errors) => {
+            // If errors are encountered while trying to highlight, cancel the errors and just emit
+            // the unhighlighted source. The errors will have already been reported in the
+            // `check-code-block-syntax` pass.
+            for mut error in errors {
+                error.cancel();
+            }
+
+            write!(out, "<pre><code>{}</code></pre>", src).unwrap();
+        }
     }
 
-    if let Some(extension) = extension {
-        write!(out, "{}", extension).unwrap();
-    }
-    write_footer(&mut out).unwrap();
     String::from_utf8_lossy(&out[..]).into_owned()
 }
 
@@ -151,6 +162,17 @@
     }
 }
 
+enum HighlightError {
+    LexError,
+    IoError(io::Error),
+}
+
+impl From<io::Error> for HighlightError {
+    fn from(err: io::Error) -> Self {
+        HighlightError::IoError(err)
+    }
+}
+
 impl<'a> Classifier<'a> {
     fn new(lexer: lexer::StringReader<'a>, source_map: &'a SourceMap) -> Classifier<'a> {
         Classifier {
@@ -162,17 +184,11 @@
         }
     }
 
-    /// Gets the next token out of the lexer, emitting fatal errors if lexing fails.
-    fn try_next_token(&mut self) -> io::Result<TokenAndSpan> {
+    /// Gets the next token out of the lexer.
+    fn try_next_token(&mut self) -> Result<TokenAndSpan, HighlightError> {
         match self.lexer.try_next_token() {
             Ok(tas) => Ok(tas),
-            Err(_) => {
-                let mut err = self.lexer.sess.span_diagnostic
-                                  .struct_warn("Backing out of syntax highlighting");
-                err.note("You probably did not intend to render this as a rust code-block");
-                err.emit();
-                Err(io::Error::new(io::ErrorKind::Other, ""))
-            }
+            Err(_) => Err(HighlightError::LexError),
         }
     }
 
@@ -185,7 +201,7 @@
     /// source.
     fn write_source<W: Writer>(&mut self,
                                    out: &mut W)
-                                   -> io::Result<()> {
+                                   -> Result<(), HighlightError> {
         loop {
             let next = self.try_next_token()?;
             if next.tok == token::Eof {
@@ -202,7 +218,7 @@
     fn write_token<W: Writer>(&mut self,
                               out: &mut W,
                               tas: TokenAndSpan)
-                              -> io::Result<()> {
+                              -> Result<(), HighlightError> {
         let klass = match tas.tok {
             token::Shebang(s) => {
                 out.string(Escape(&s.as_str()), Class::None)?;
@@ -296,7 +312,7 @@
             token::Literal(lit, _suf) => {
                 match lit {
                     // Text literals.
-                    token::Byte(..) | token::Char(..) |
+                    token::Byte(..) | token::Char(..) | token::Err(..) |
                         token::ByteStr(..) | token::ByteStrRaw(..) |
                         token::Str_(..) | token::StrRaw(..) => Class::String,
 
@@ -341,7 +357,9 @@
 
         // Anything that didn't return above is the simple case where we the
         // class just spans a single token, so we can use the `string` method.
-        out.string(Escape(&self.snip(tas.sp)), klass)
+        out.string(Escape(&self.snip(tas.sp)), klass)?;
+
+        Ok(())
     }
 
     // Helper function to get a snippet from the source_map.
diff --git a/src/librustdoc/html/layout.rs b/src/librustdoc/html/layout.rs
index 987cec6..c34dcbb 100644
--- a/src/librustdoc/html/layout.rs
+++ b/src/librustdoc/html/layout.rs
@@ -177,7 +177,10 @@
     root_path = page.root_path,
     css_class = page.css_class,
     logo      = if layout.logo.is_empty() {
-        String::new()
+        format!("<a href='{}{}/index.html'>\
+                 <img src='{static_root_path}rust-logo{suffix}.png' alt='logo' width='100'></a>",
+                static_root_path=static_root_path,
+                suffix=page.resource_suffix)
     } else {
         format!("<a href='{}{}/index.html'>\
                  <img src='{}' alt='logo' width='100'></a>",
@@ -188,7 +191,9 @@
     description = page.description,
     keywords = page.keywords,
     favicon   = if layout.favicon.is_empty() {
-        String::new()
+        format!(r#"<link rel="shortcut icon" href="{static_root_path}favicon{suffix}.ico">"#,
+                static_root_path=static_root_path,
+                suffix=page.resource_suffix)
     } else {
         format!(r#"<link rel="shortcut icon" href="{}">"#, layout.favicon)
     },
diff --git a/src/librustdoc/html/markdown.rs b/src/librustdoc/html/markdown.rs
index 05a9a2d..6b7f540 100644
--- a/src/librustdoc/html/markdown.rs
+++ b/src/librustdoc/html/markdown.rs
@@ -919,6 +919,115 @@
     links
 }
 
+#[derive(Debug)]
+crate struct RustCodeBlock {
+    /// The range in the markdown that the code block occupies. Note that this includes the fences
+    /// for fenced code blocks.
+    pub range: Range<usize>,
+    /// The range in the markdown that the code within the code block occupies.
+    pub code: Range<usize>,
+    pub is_fenced: bool,
+    pub syntax: Option<String>,
+}
+
+/// Returns a range of bytes for each code block in the markdown that is tagged as `rust` or
+/// untagged (and assumed to be rust).
+crate fn rust_code_blocks(md: &str) -> Vec<RustCodeBlock> {
+    let mut code_blocks = vec![];
+
+    if md.is_empty() {
+        return code_blocks;
+    }
+
+    let mut opts = Options::empty();
+    opts.insert(OPTION_ENABLE_TABLES);
+    opts.insert(OPTION_ENABLE_FOOTNOTES);
+    let mut p = Parser::new_ext(md, opts);
+
+    let mut code_block_start = 0;
+    let mut code_start = 0;
+    let mut is_fenced = false;
+    let mut previous_offset = 0;
+    let mut in_rust_code_block = false;
+    while let Some(event) = p.next() {
+        let offset = p.get_offset();
+
+        match event {
+            Event::Start(Tag::CodeBlock(syntax)) => {
+                let lang_string = if syntax.is_empty() {
+                    LangString::all_false()
+                } else {
+                    LangString::parse(&*syntax, ErrorCodes::Yes)
+                };
+
+                if lang_string.rust {
+                    in_rust_code_block = true;
+
+                    code_start = offset;
+                    code_block_start = match md[previous_offset..offset].find("```") {
+                        Some(fence_idx) => {
+                            is_fenced = true;
+                            previous_offset + fence_idx
+                        }
+                        None => offset,
+                    };
+                }
+            }
+            Event::End(Tag::CodeBlock(syntax)) if in_rust_code_block => {
+                in_rust_code_block = false;
+
+                let code_block_end = if is_fenced {
+                    let fence_str = &md[previous_offset..offset]
+                        .chars()
+                        .rev()
+                        .collect::<String>();
+                    fence_str
+                        .find("```")
+                        .map(|fence_idx| offset - fence_idx)
+                        .unwrap_or_else(|| offset)
+                } else if md
+                    .as_bytes()
+                    .get(offset)
+                    .map(|b| *b == b'\n')
+                    .unwrap_or_default()
+                {
+                    offset - 1
+                } else {
+                    offset
+                };
+
+                let code_end = if is_fenced {
+                    previous_offset
+                } else {
+                    code_block_end
+                };
+
+                code_blocks.push(RustCodeBlock {
+                    is_fenced,
+                    range: Range {
+                        start: code_block_start,
+                        end: code_block_end,
+                    },
+                    code: Range {
+                        start: code_start,
+                        end: code_end,
+                    },
+                    syntax: if !syntax.is_empty() {
+                        Some(syntax.into_owned())
+                    } else {
+                        None
+                    },
+                });
+            }
+            _ => (),
+        }
+
+        previous_offset = offset;
+    }
+
+    code_blocks
+}
+
 #[derive(Clone, Default, Debug)]
 pub struct IdMap {
     map: FxHashMap<String, usize>,
diff --git a/src/librustdoc/html/render.rs b/src/librustdoc/html/render.rs
index 31e06cb..86fb514 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[{}] = {};",
@@ -789,6 +789,14 @@
         themes.insert(theme.to_owned());
     }
 
+    if (*cx.shared).layout.logo.is_empty() {
+        write(cx.dst.join(&format!("rust-logo{}.png", cx.shared.resource_suffix)),
+              static_files::RUST_LOGO)?;
+    }
+    if (*cx.shared).layout.favicon.is_empty() {
+        write(cx.dst.join(&format!("favicon{}.ico", cx.shared.resource_suffix)),
+              static_files::RUST_FAVICON)?;
+    }
     write(cx.dst.join(&format!("brush{}.svg", cx.shared.resource_suffix)),
           static_files::BRUSH_SVG)?;
     write(cx.dst.join(&format!("wheel{}.svg", cx.shared.resource_suffix)),
@@ -914,12 +922,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 +973,7 @@
                                                  .unwrap_or_else(|| String::new()));
             }
         }
-        Ok((ret, krates))
+        Ok((ret, krates, variables))
     }
 
     fn show_item(item: &IndexItem, krate: &str) -> String {
@@ -948,7 +988,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 +1075,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 +1205,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 +1261,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)
     }
@@ -1995,8 +2076,6 @@
         themes.push(PathBuf::from("settings.css"));
         let mut layout = self.shared.layout.clone();
         layout.krate = String::new();
-        layout.logo = String::new();
-        layout.favicon = String::new();
         try_err!(layout::render(&mut w, &layout,
                                 &page, &sidebar, &settings,
                                 self.shared.css_file_extension.is_some(),
diff --git a/src/librustdoc/html/static/favicon.ico b/src/librustdoc/html/static/favicon.ico
new file mode 100644
index 0000000..b8ad237
--- /dev/null
+++ b/src/librustdoc/html/static/favicon.ico
Binary files differ
diff --git a/src/librustdoc/html/static/main.js b/src/librustdoc/html/static/main.js
index ceadbd5..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;
diff --git a/src/librustdoc/html/static/rust-logo.png b/src/librustdoc/html/static/rust-logo.png
new file mode 100644
index 0000000..74b4bd6
--- /dev/null
+++ b/src/librustdoc/html/static/rust-logo.png
Binary files differ
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/html/static_files.rs b/src/librustdoc/html/static_files.rs
index f340590..a1d8cfa 100644
--- a/src/librustdoc/html/static_files.rs
+++ b/src/librustdoc/html/static_files.rs
@@ -51,6 +51,11 @@
 /// The contents of `LICENSE-MIT.txt`, the text of the MIT License.
 pub static LICENSE_MIT: &'static [u8] = include_bytes!("static/LICENSE-MIT.txt");
 
+/// The contents of `rust-logo.png`, the default icon of the documentation.
+pub static RUST_LOGO: &'static [u8] = include_bytes!("static/rust-logo.png");
+/// The contents of `favicon.ico`, the default favicon of the documentation.
+pub static RUST_FAVICON: &'static [u8] = include_bytes!("static/favicon.ico");
+
 /// The built-in themes given to every documentation site.
 pub mod themes {
     /// The "light" theme, selected by default when no setting is available. Used as the basis for
diff --git a/src/librustdoc/lib.rs b/src/librustdoc/lib.rs
index 1b6d7e8..f4149b5 100644
--- a/src/librustdoc/lib.rs
+++ b/src/librustdoc/lib.rs
@@ -3,6 +3,7 @@
        html_root_url = "https://doc.rust-lang.org/nightly/",
        html_playground_url = "https://play.rust-lang.org/")]
 
+#![feature(bind_by_move_pattern_guards)]
 #![feature(rustc_private)]
 #![feature(box_patterns)]
 #![feature(box_syntax)]
@@ -341,6 +342,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/passes/check_code_block_syntax.rs b/src/librustdoc/passes/check_code_block_syntax.rs
new file mode 100644
index 0000000..a013cc3
--- /dev/null
+++ b/src/librustdoc/passes/check_code_block_syntax.rs
@@ -0,0 +1,109 @@
+use errors::Applicability;
+use syntax::parse::lexer::{TokenAndSpan, StringReader as Lexer};
+use syntax::parse::{ParseSess, token};
+use syntax::source_map::FilePathMapping;
+use syntax_pos::FileName;
+
+use clean;
+use core::DocContext;
+use fold::DocFolder;
+use html::markdown::{self, RustCodeBlock};
+use passes::Pass;
+
+pub const CHECK_CODE_BLOCK_SYNTAX: Pass =
+    Pass::early("check-code-block-syntax", check_code_block_syntax,
+                "validates syntax inside Rust code blocks");
+
+pub fn check_code_block_syntax(krate: clean::Crate, cx: &DocContext) -> clean::Crate {
+    SyntaxChecker { cx }.fold_crate(krate)
+}
+
+struct SyntaxChecker<'a, 'tcx: 'a, 'rcx: 'a> {
+    cx: &'a DocContext<'a, 'tcx, 'rcx>,
+}
+
+impl<'a, 'tcx, 'rcx> SyntaxChecker<'a, 'tcx, 'rcx> {
+    fn check_rust_syntax(&self, item: &clean::Item, dox: &str, code_block: RustCodeBlock) {
+        let sess = ParseSess::new(FilePathMapping::empty());
+        let source_file = sess.source_map().new_source_file(
+            FileName::Custom(String::from("doctest")),
+            dox[code_block.code].to_owned(),
+        );
+
+        let errors = Lexer::new_or_buffered_errs(&sess, source_file, None).and_then(|mut lexer| {
+            while let Ok(TokenAndSpan { tok, .. }) = lexer.try_next_token() {
+                if tok == token::Eof {
+                    break;
+                }
+            }
+
+            let errors = lexer.buffer_fatal_errors();
+
+            if !errors.is_empty() {
+                Err(errors)
+            } else {
+                Ok(())
+            }
+        });
+
+        if let Err(errors) = errors {
+            let mut diag = if let Some(sp) =
+                super::source_span_for_markdown_range(self.cx, &dox, &code_block.range, &item.attrs)
+            {
+                let mut diag = self
+                    .cx
+                    .sess()
+                    .struct_span_warn(sp, "could not parse code block as Rust code");
+
+                for mut err in errors {
+                    diag.note(&format!("error from rustc: {}", err.message()));
+                    err.cancel();
+                }
+
+                if code_block.syntax.is_none() && code_block.is_fenced {
+                    let sp = sp.from_inner_byte_pos(0, 3);
+                    diag.span_suggestion_with_applicability(
+                        sp,
+                        "mark blocks that do not contain Rust code as text",
+                        String::from("```text"),
+                        Applicability::MachineApplicable,
+                    );
+                }
+
+                diag
+            } else {
+                // We couldn't calculate the span of the markdown block that had the error, so our
+                // diagnostics are going to be a bit lacking.
+                let mut diag = self.cx.sess().struct_span_warn(
+                    super::span_of_attrs(&item.attrs),
+                    "doc comment contains an invalid Rust code block",
+                );
+
+                for mut err in errors {
+                    // Don't bother reporting the error, because we can't show where it happened.
+                    err.cancel();
+                }
+
+                if code_block.syntax.is_none() && code_block.is_fenced {
+                    diag.help("mark blocks that do not contain Rust code as text: ```text");
+                }
+
+                diag
+            };
+
+            diag.emit();
+        }
+    }
+}
+
+impl<'a, 'tcx, 'rcx> DocFolder for SyntaxChecker<'a, 'tcx, 'rcx> {
+    fn fold_item(&mut self, item: clean::Item) -> Option<clean::Item> {
+        if let Some(dox) = &item.attrs.collapsed_doc_value() {
+            for code_block in markdown::rust_code_blocks(&dox) {
+                self.check_rust_syntax(&item, &dox, code_block);
+            }
+        }
+
+        self.fold_item_recur(item)
+    }
+}
diff --git a/src/librustdoc/passes/collect_intra_doc_links.rs b/src/librustdoc/passes/collect_intra_doc_links.rs
index fdc1c06..3d6096b 100644
--- a/src/librustdoc/passes/collect_intra_doc_links.rs
+++ b/src/librustdoc/passes/collect_intra_doc_links.rs
@@ -6,7 +6,7 @@
 use syntax::ast::{self, Ident, NodeId};
 use syntax::feature_gate::UnstableFeatures;
 use syntax::symbol::Symbol;
-use syntax_pos::{self, DUMMY_SP};
+use syntax_pos::DUMMY_SP;
 
 use std::ops::Range;
 
@@ -16,6 +16,7 @@
 
 use clean::*;
 use passes::{look_for_tests, Pass};
+use super::span_of_attrs;
 
 pub const COLLECT_INTRA_DOC_LINKS: Pass =
     Pass::early("collect-intra-doc-links", collect_intra_doc_links,
@@ -440,28 +441,11 @@
     None
 }
 
-pub fn span_of_attrs(attrs: &Attributes) -> syntax_pos::Span {
-    if attrs.doc_strings.is_empty() {
-        return DUMMY_SP;
-    }
-    let start = attrs.doc_strings[0].span();
-    let end = attrs.doc_strings.last().expect("No doc strings provided").span();
-    start.to(end)
-}
-
 /// Reports a resolution failure diagnostic.
 ///
-/// Ideally we can report the diagnostic with the actual span in the source where the link failure
-/// occurred. However, there's a mismatch between the span in the source code and the span in the
-/// markdown, so we have to do a bit of work to figure out the correspondence.
-///
-/// It's not too hard to find the span for sugared doc comments (`///` and `/**`), because the
-/// source will match the markdown exactly, excluding the comment markers. However, it's much more
-/// difficult to calculate the spans for unsugared docs, because we have to deal with escaping and
-/// other source features. So, we attempt to find the exact source span of the resolution failure
-/// in sugared docs, but use the span of the documentation attributes themselves for unsugared
-/// docs. Because this span might be overly large, we display the markdown line containing the
-/// failure as a note.
+/// If we cannot find the exact source span of the resolution failure, we use the span of the
+/// documentation attributes themselves. This is a little heavy-handed, so we display the markdown
+/// line containing the failure as a note as well.
 fn resolution_failure(
     cx: &DocContext,
     attrs: &Attributes,
@@ -473,54 +457,7 @@
     let msg = format!("`[{}]` cannot be resolved, ignoring it...", path_str);
 
     let mut diag = if let Some(link_range) = link_range {
-        let src = cx.sess().source_map().span_to_snippet(sp);
-        let is_all_sugared_doc = attrs.doc_strings.iter().all(|frag| match frag {
-            DocFragment::SugaredDoc(..) => true,
-            _ => false,
-        });
-
-        if let (Ok(src), true) = (src, is_all_sugared_doc) {
-            // The number of markdown lines up to and including the resolution failure.
-            let num_lines = dox[..link_range.start].lines().count();
-
-            // We use `split_terminator('\n')` instead of `lines()` when counting bytes to ensure
-            // that DOS-style line endings do not cause the spans to be calculated incorrectly.
-            let mut src_lines = src.split_terminator('\n');
-            let mut md_lines = dox.split_terminator('\n').take(num_lines).peekable();
-
-            // The number of bytes from the start of the source span to the resolution failure that
-            // are *not* part of the markdown, like comment markers.
-            let mut extra_src_bytes = 0;
-
-            while let Some(md_line) = md_lines.next() {
-                loop {
-                    let source_line = src_lines
-                        .next()
-                        .expect("could not find markdown line in source");
-
-                    match source_line.find(md_line) {
-                        Some(offset) => {
-                            extra_src_bytes += if md_lines.peek().is_some() {
-                                source_line.len() - md_line.len()
-                            } else {
-                                offset
-                            };
-                            break;
-                        }
-                        None => {
-                            // Since this is a source line that doesn't include a markdown line,
-                            // we have to count the newline that we split from earlier.
-                            extra_src_bytes += source_line.len() + 1;
-                        }
-                    }
-                }
-            }
-
-            let sp = sp.from_inner_byte_pos(
-                link_range.start + extra_src_bytes,
-                link_range.end + extra_src_bytes,
-            );
-
+        if let Some(sp) = super::source_span_for_markdown_range(cx, dox, &link_range, attrs) {
             let mut diag = cx.tcx.struct_span_lint_node(
                 lint::builtin::INTRA_DOC_LINK_RESOLUTION_FAILURE,
                 NodeId::from_u32(0),
diff --git a/src/librustdoc/passes/mod.rs b/src/librustdoc/passes/mod.rs
index e897b9a..c9a3a2c 100644
--- a/src/librustdoc/passes/mod.rs
+++ b/src/librustdoc/passes/mod.rs
@@ -8,6 +8,8 @@
 use std::mem;
 use std::fmt;
 use syntax::ast::NodeId;
+use syntax_pos::{DUMMY_SP, Span};
+use std::ops::Range;
 
 use clean::{self, GetDefId, Item};
 use core::{DocContext, DocAccessLevels};
@@ -16,8 +18,6 @@
 
 use html::markdown::{find_testable_code, ErrorCodes, LangString};
 
-use self::collect_intra_doc_links::span_of_attrs;
-
 mod collapse_docs;
 pub use self::collapse_docs::COLLAPSE_DOCS;
 
@@ -45,6 +45,9 @@
 mod collect_trait_impls;
 pub use self::collect_trait_impls::COLLECT_TRAIT_IMPLS;
 
+mod check_code_block_syntax;
+pub use self::check_code_block_syntax::CHECK_CODE_BLOCK_SYNTAX;
+
 /// Represents a single pass.
 #[derive(Copy, Clone)]
 pub enum Pass {
@@ -135,6 +138,7 @@
     STRIP_PRIV_IMPORTS,
     PROPAGATE_DOC_CFG,
     COLLECT_INTRA_DOC_LINKS,
+    CHECK_CODE_BLOCK_SYNTAX,
     COLLECT_TRAIT_IMPLS,
 ];
 
@@ -145,6 +149,7 @@
     "strip-hidden",
     "strip-private",
     "collect-intra-doc-links",
+    "check-code-block-syntax",
     "collapse-docs",
     "unindent-comments",
     "propagate-doc-cfg",
@@ -156,6 +161,7 @@
     "check-private-items-doc-tests",
     "strip-priv-imports",
     "collect-intra-doc-links",
+    "check-code-block-syntax",
     "collapse-docs",
     "unindent-comments",
     "propagate-doc-cfg",
@@ -396,3 +402,94 @@
         }
     }
 }
+
+/// Return a span encompassing all the given attributes.
+crate fn span_of_attrs(attrs: &clean::Attributes) -> Span {
+    if attrs.doc_strings.is_empty() {
+        return DUMMY_SP;
+    }
+    let start = attrs.doc_strings[0].span();
+    let end = attrs.doc_strings.last().expect("No doc strings provided").span();
+    start.to(end)
+}
+
+/// Attempts to match a range of bytes from parsed markdown to a `Span` in the source code.
+///
+/// This method will return `None` if we cannot construct a span from the source map or if the
+/// attributes are not all sugared doc comments. It's difficult to calculate the correct span in
+/// that case due to escaping and other source features.
+crate fn source_span_for_markdown_range(
+    cx: &DocContext,
+    markdown: &str,
+    md_range: &Range<usize>,
+    attrs: &clean::Attributes,
+) -> Option<Span> {
+    let is_all_sugared_doc = attrs.doc_strings.iter().all(|frag| match frag {
+        clean::DocFragment::SugaredDoc(..) => true,
+        _ => false,
+    });
+
+    if !is_all_sugared_doc {
+        return None;
+    }
+
+    let snippet = cx
+        .sess()
+        .source_map()
+        .span_to_snippet(span_of_attrs(attrs))
+        .ok()?;
+
+    let starting_line = markdown[..md_range.start].lines().count() - 1;
+    let ending_line = markdown[..md_range.end].lines().count() - 1;
+
+    // We use `split_terminator('\n')` instead of `lines()` when counting bytes so that we only
+    // we can treat CRLF and LF line endings the same way.
+    let mut src_lines = snippet.split_terminator('\n');
+    let md_lines = markdown.split_terminator('\n');
+
+    // The number of bytes from the source span to the markdown span that are not part
+    // of the markdown, like comment markers.
+    let mut start_bytes = 0;
+    let mut end_bytes = 0;
+
+    'outer: for (line_no, md_line) in md_lines.enumerate() {
+        loop {
+            let source_line = src_lines.next().expect("could not find markdown in source");
+            match source_line.find(md_line) {
+                Some(offset) => {
+                    if line_no == starting_line {
+                        start_bytes += offset;
+
+                        if starting_line == ending_line {
+                            break 'outer;
+                        }
+                    } else if line_no == ending_line {
+                        end_bytes += offset;
+                        break 'outer;
+                    } else if line_no < starting_line {
+                        start_bytes += source_line.len() - md_line.len();
+                    } else {
+                        end_bytes += source_line.len() - md_line.len();
+                    }
+                    break;
+                }
+                None => {
+                    // Since this is a source line that doesn't include a markdown line,
+                    // we have to count the newline that we split from earlier.
+                    if line_no <= starting_line {
+                        start_bytes += source_line.len() + 1;
+                    } else {
+                        end_bytes += source_line.len() + 1;
+                    }
+                }
+            }
+        }
+    }
+
+    let sp = span_of_attrs(attrs).from_inner_byte_pos(
+        md_range.start + start_bytes,
+        md_range.end + start_bytes + end_bytes,
+    );
+
+    Some(sp)
+}
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/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/unix/fast_thread_local.rs b/src/libstd/sys/unix/fast_thread_local.rs
index d48d701d..742ffd1 100644
--- a/src/libstd/sys/unix/fast_thread_local.rs
+++ b/src/libstd/sys/unix/fast_thread_local.rs
@@ -33,30 +33,57 @@
     register_dtor_fallback(t, dtor);
 }
 
-// macOS's analog of the above linux function is this _tlv_atexit function.
-// The disassembly of thread_local globals in C++ (at least produced by
-// clang) will have this show up in the output.
+// This implementation is very similar to register_dtor_fallback in
+// sys_common/thread_local.rs. The main difference is that we want to hook into
+// macOS's analog of the above linux function, _tlv_atexit. OSX will run the
+// registered dtors before any TLS slots get freed, and when the main thread
+// exits.
+//
+// Unfortunately, calling _tlv_atexit while tls dtors are running is UB. The
+// workaround below is to register, via _tlv_atexit, a custom DTOR list once per
+// thread. thread_local dtors are pushed to the DTOR list without calling
+// _tlv_atexit.
 #[cfg(target_os = "macos")]
 pub unsafe fn register_dtor(t: *mut u8, dtor: unsafe extern fn(*mut u8)) {
+    use cell::Cell;
+    use ptr;
+
+    #[thread_local]
+    static REGISTERED: Cell<bool> = Cell::new(false);
+    if !REGISTERED.get() {
+        _tlv_atexit(run_dtors, ptr::null_mut());
+        REGISTERED.set(true);
+    }
+
+    type List = Vec<(*mut u8, unsafe extern fn(*mut u8))>;
+
+    #[thread_local]
+    static DTORS: Cell<*mut List> = Cell::new(ptr::null_mut());
+    if DTORS.get().is_null() {
+        let v: Box<List> = box Vec::new();
+        DTORS.set(Box::into_raw(v));
+    }
+
     extern {
         fn _tlv_atexit(dtor: unsafe extern fn(*mut u8),
                        arg: *mut u8);
     }
-    _tlv_atexit(dtor, t);
+
+    let list: &mut List = &mut *DTORS.get();
+    list.push((t, dtor));
+
+    unsafe extern fn run_dtors(_: *mut u8) {
+        let mut ptr = DTORS.replace(ptr::null_mut());
+        while !ptr.is_null() {
+            let list = Box::from_raw(ptr);
+            for (ptr, dtor) in list.into_iter() {
+                dtor(ptr);
+            }
+            ptr = DTORS.replace(ptr::null_mut());
+        }
+    }
 }
 
 pub fn requires_move_before_drop() -> bool {
-    // The macOS implementation of TLS apparently had an odd aspect to it
-    // where the pointer we have may be overwritten while this destructor
-    // is running. Specifically if a TLS destructor re-accesses TLS it may
-    // trigger a re-initialization of all TLS variables, paving over at
-    // least some destroyed ones with initial values.
-    //
-    // This means that if we drop a TLS value in place on macOS that we could
-    // revert the value to its original state halfway through the
-    // destructor, which would be bad!
-    //
-    // Hence, we use `ptr::read` on macOS (to move to a "safe" location)
-    // instead of drop_in_place.
-    cfg!(target_os = "macos")
+    false
 }
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/libstd/thread/local.rs b/src/libstd/thread/local.rs
index efd231e..5d2eb5f 100644
--- a/src/libstd/thread/local.rs
+++ b/src/libstd/thread/local.rs
@@ -69,9 +69,6 @@
 ///    destroyed, but not all platforms have this guard. Those platforms that do
 ///    not guard typically have a synthetic limit after which point no more
 ///    destructors are run.
-/// 3. On macOS, initializing TLS during destruction of other TLS slots can
-///    sometimes cancel *all* destructors for the current thread, whether or not
-///    the slots have already had their destructors run or not.
 ///
 /// [`with`]: ../../std/thread/struct.LocalKey.html#method.with
 /// [`thread_local!`]: ../../std/macro.thread_local.html
@@ -604,11 +601,8 @@
     }
 
     // Note that this test will deadlock if TLS destructors aren't run (this
-    // requires the destructor to be run to pass the test). macOS has a known bug
-    // where dtors-in-dtors may cancel other destructors, so we just ignore this
-    // test on macOS.
+    // requires the destructor to be run to pass the test).
     #[test]
-    #[cfg_attr(target_os = "macos", ignore)]
     fn dtors_in_dtors_in_dtors() {
         struct S1(Sender<()>);
         thread_local!(static K1: UnsafeCell<Option<S1>> = UnsafeCell::new(None));
diff --git a/src/libsyntax/ast.rs b/src/libsyntax/ast.rs
index 99ab9fb..798f14d 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;
@@ -136,7 +136,7 @@
     /// The `<'a, A,B,C>` in `foo::bar::baz::<'a, A,B,C>`
     AngleBracketed(AngleBracketedArgs),
     /// The `(A,B)` and `C` in `Foo(A,B) -> C`
-    Parenthesized(ParenthesisedArgs),
+    Parenthesized(ParenthesizedArgs),
 }
 
 impl GenericArgs {
@@ -173,7 +173,7 @@
     }
 }
 
-impl Into<Option<P<GenericArgs>>> for ParenthesisedArgs {
+impl Into<Option<P<GenericArgs>>> for ParenthesizedArgs {
     fn into(self) -> Option<P<GenericArgs>> {
         Some(P(GenericArgs::Parenthesized(self)))
     }
@@ -181,7 +181,7 @@
 
 /// A path like `Foo(A,B) -> C`
 #[derive(Clone, RustcEncodable, RustcDecodable, Debug)]
-pub struct ParenthesisedArgs {
+pub struct ParenthesizedArgs {
     /// Overall span
     pub span: Span,
 
@@ -192,6 +192,16 @@
     pub output: Option<P<Ty>>,
 }
 
+impl ParenthesizedArgs {
+    pub fn as_angle_bracketed_args(&self) -> AngleBracketedArgs {
+        AngleBracketedArgs {
+            span: self.span,
+            args: self.inputs.iter().cloned().map(|input| GenericArg::Type(input)).collect(),
+            bindings: vec![],
+        }
+    }
+}
+
 // hack to ensure that we don't try to access the private parts of `NodeId` in this module
 mod node_id_inner {
     use rustc_data_structures::indexed_vec::Idx;
@@ -1216,7 +1226,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 +1238,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,
 }
 
@@ -1285,6 +1295,8 @@
     FloatUnsuffixed(Symbol),
     /// A boolean literal.
     Bool(bool),
+    /// A recovered character literal that contains mutliple `char`s, most likely a typo.
+    Err(Symbol),
 }
 
 impl LitKind {
@@ -1321,6 +1333,7 @@
             | LitKind::ByteStr(..)
             | LitKind::Byte(..)
             | LitKind::Char(..)
+            | LitKind::Err(..)
             | LitKind::Int(_, LitIntType::Unsuffixed)
             | LitKind::FloatUnsuffixed(..)
             | LitKind::Bool(..) => true,
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..e5ce6a3 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),
         };
@@ -661,6 +666,7 @@
             } else {
                 "false"
             })), false),
+            LitKind::Err(val) => Token::Literal(token::Lit::Err(val), None),
         }
     }
 
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..df3b49c 100644
--- a/src/libsyntax/ext/quote.rs
+++ b/src/libsyntax/ext/quote.rs
@@ -646,6 +646,7 @@
 
         token::Literal(token::Byte(i), suf) => return mk_lit!("Byte", suf, i),
         token::Literal(token::Char(i), suf) => return mk_lit!("Char", suf, i),
+        token::Literal(token::Err(_i), _suf) => return cx.expr(sp, ast::ExprKind::Err),
         token::Literal(token::Integer(i), suf) => return mk_lit!("Integer", suf, i),
         token::Literal(token::Float(i), suf) => return mk_lit!("Float", suf, i),
         token::Literal(token::Str_(i), suf) => return mk_lit!("Str_", suf, i),
@@ -748,7 +749,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 ed278e8..9b54e8f 100644
--- a/src/libsyntax/feature_gate.rs
+++ b/src/libsyntax/feature_gate.rs
@@ -19,6 +19,7 @@
 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};
@@ -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()
+                }
             }
         }
     }
@@ -1926,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..fdcbbb9 100644
--- a/src/libsyntax/fold.rs
+++ b/src/libsyntax/fold.rs
@@ -207,8 +207,8 @@
         noop_fold_angle_bracketed_parameter_data(p, self)
     }
 
-    fn fold_parenthesized_parameter_data(&mut self, p: ParenthesisedArgs)
-                                         -> ParenthesisedArgs
+    fn fold_parenthesized_parameter_data(&mut self, p: ParenthesizedArgs)
+                                         -> ParenthesizedArgs
     {
         noop_fold_parenthesized_parameter_data(p, self)
     }
@@ -504,12 +504,12 @@
     }
 }
 
-pub fn noop_fold_parenthesized_parameter_data<T: Folder>(data: ParenthesisedArgs,
+pub fn noop_fold_parenthesized_parameter_data<T: Folder>(data: ParenthesizedArgs,
                                                          fld: &mut T)
-                                                         -> ParenthesisedArgs
+                                                         -> ParenthesizedArgs
 {
-    let ParenthesisedArgs { inputs, output, span } = data;
-    ParenthesisedArgs {
+    let ParenthesizedArgs { inputs, output, span } = data;
+    ParenthesizedArgs {
         inputs: inputs.move_map(|ty| fld.fold_ty(ty)),
         output: output.map(|ty| fld.fold_ty(ty)),
         span: fld.new_span(span)
@@ -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 0e1c3b4..8827e04 100644
--- a/src/libsyntax/parse/lexer/mod.rs
+++ b/src/libsyntax/parse/lexer/mod.rs
@@ -238,19 +238,6 @@
         sr
     }
 
-    pub fn new_without_err(sess: &'a ParseSess,
-                           source_file: Lrc<syntax_pos::SourceFile>,
-                           override_span: Option<Span>,
-                           prepend_error_text: &str) -> Result<Self, ()> {
-        let mut sr = StringReader::new_raw(sess, source_file, override_span);
-        if sr.advance_token().is_err() {
-            eprintln!("{}", prepend_error_text);
-            sr.emit_fatal_errors();
-            return Err(());
-        }
-        Ok(sr)
-    }
-
     pub fn new_or_buffered_errs(sess: &'a ParseSess,
                                 source_file: Lrc<syntax_pos::SourceFile>,
                                 override_span: Option<Span>) -> Result<Self, Vec<Diagnostic>> {
@@ -1408,9 +1395,10 @@
                     // lifetimes shouldn't end with a single quote
                     // if we find one, then this is an invalid character literal
                     if self.ch_is('\'') {
-                        self.fatal_span_verbose(start_with_quote, self.next_pos,
-                                String::from("character literal may only contain one codepoint"))
-                            .raise();
+                        self.err_span_(start_with_quote, self.next_pos,
+                                "character literal may only contain one codepoint");
+                        self.bump();
+                        return Ok(token::Literal(token::Err(Symbol::intern("??")), None))
 
                     }
 
@@ -1445,7 +1433,7 @@
                                     format!("\"{}\"", &self.src[start..end]),
                                     Applicability::MachineApplicable
                                 ).emit();
-                            return Ok(token::Literal(token::Str_(Symbol::intern("??")), None))
+                            return Ok(token::Literal(token::Err(Symbol::intern("??")), None))
                         }
                         if self.ch_is('\n') || self.is_eof() || self.ch_is('/') {
                             // Only attempt to infer single line string literals. If we encounter
diff --git a/src/libsyntax/parse/mod.rs b/src/libsyntax/parse/mod.rs
index ea20553..8d03969 100644
--- a/src/libsyntax/parse/mod.rs
+++ b/src/libsyntax/parse/mod.rs
@@ -466,6 +466,7 @@
     match lit {
        token::Byte(i) => (true, Some(LitKind::Byte(byte_lit(&i.as_str()).0))),
        token::Char(i) => (true, Some(LitKind::Char(char_lit(&i.as_str(), diag).0))),
+       token::Err(i) => (true, Some(LitKind::Err(i))),
 
         // There are some valid suffixes for integer and float literals,
         // so all the handling is done internally.
@@ -817,7 +818,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,
@@ -826,7 +827,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,
@@ -836,7 +837,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 823c786..09ea099 100644
--- a/src/libsyntax/parse/parser.rs
+++ b/src/libsyntax/parse/parser.rs
@@ -1,5 +1,5 @@
 use rustc_target::spec::abi::{self, Abi};
-use ast::{AngleBracketedArgs, ParenthesisedArgs, AttrStyle, BareFnTy};
+use ast::{AngleBracketedArgs, ParenthesizedArgs, AttrStyle, BareFnTy};
 use ast::{GenericBound, TraitBoundModifier};
 use ast::Unsafety;
 use ast::{Mod, AnonConst, Arg, Arm, Guard, Attribute, BindingMode, TraitItemKind};
@@ -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),
         }
@@ -2176,11 +2176,11 @@
               style != PathStyle::Mod && self.check(&token::ModSep)
                                       && self.look_ahead(1, |t| is_args_start(t)) {
             // Generic arguments are found - `<`, `(`, `::<` or `::(`.
-            let lo = self.span;
             if self.eat(&token::ModSep) && style == PathStyle::Type && enable_warning {
                 self.diagnostic().struct_span_warn(self.prev_span, "unnecessary path disambiguator")
                                  .span_label(self.prev_span, "try removing `::`").emit();
             }
+            let lo = self.span;
 
             let args = if self.eat_lt() {
                 // `<'a, T, A = U>`
@@ -2203,7 +2203,7 @@
                 } else {
                     None
                 };
-                ParenthesisedArgs { inputs, output, span }.into()
+                ParenthesizedArgs { inputs, output, span }.into()
             };
 
             PathSegment { ident, args, id: ast::DUMMY_NODE_ID }
@@ -2330,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,
             _ => {
@@ -2350,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,
@@ -4063,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();
@@ -4482,13 +4483,17 @@
     }
 
     /// Emit an expected item after attributes error.
-    fn expected_item_err(&self, attrs: &[Attribute]) {
+    fn expected_item_err(&mut self, attrs: &[Attribute]) -> PResult<'a,  ()> {
         let message = match attrs.last() {
             Some(&Attribute { is_sugared_doc: true, .. }) => "expected item after doc comment",
             _ => "expected item after attributes",
         };
 
-        self.span_err(self.prev_span, message);
+        let mut err = self.diagnostic().struct_span_err(self.prev_span, message);
+        if attrs.last().unwrap().is_sugared_doc {
+            err.span_label(self.prev_span, "this doc comment doesn't document anything");
+        }
+        Err(err)
     }
 
     /// Parse a statement. This stops just before trailing semicolons on everything but items.
@@ -4641,7 +4646,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)) {
@@ -5234,22 +5239,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() {
@@ -6913,7 +6909,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)
@@ -7640,7 +7640,7 @@
             }
             None => {
                 if !attrs.is_empty()  {
-                    self.expected_item_err(&attrs);
+                    self.expected_item_err(&attrs)?;
                 }
 
                 self.unexpected()
@@ -7703,7 +7703,7 @@
         }
 
         if !attributes_allowed && !attrs.is_empty() {
-            self.expected_item_err(&attrs);
+            self.expected_item_err(&attrs)?;
         }
         Ok(None)
     }
@@ -7766,7 +7766,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?"),
@@ -7785,10 +7785,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);
             }
@@ -7797,7 +7796,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/parse/token.rs b/src/libsyntax/parse/token.rs
index 25a4da3..f06e975 100644
--- a/src/libsyntax/parse/token.rs
+++ b/src/libsyntax/parse/token.rs
@@ -60,6 +60,7 @@
 pub enum Lit {
     Byte(ast::Name),
     Char(ast::Name),
+    Err(ast::Name),
     Integer(ast::Name),
     Float(ast::Name),
     Str_(ast::Name),
@@ -73,6 +74,7 @@
         match *self {
             Byte(_) => "byte literal",
             Char(_) => "char literal",
+            Err(_) => "invalid literal",
             Integer(_) => "integer literal",
             Float(_) => "float literal",
             Str_(_) | StrRaw(..) => "string literal",
@@ -471,8 +473,7 @@
 
             Le | EqEq | Ne | Ge | AndAnd | OrOr | Tilde | BinOpEq(..) | At | DotDotDot |
             DotDotEq | Comma | Semi | ModSep | RArrow | LArrow | FatArrow | Pound | Dollar |
-            Question | OpenDelim(..) | CloseDelim(..) => return None,
-
+            Question | OpenDelim(..) | CloseDelim(..) |
             Literal(..) | Ident(..) | Lifetime(..) | Interpolated(..) | DocComment(..) |
             Whitespace | Comment | Shebang(..) | Eof => return None,
         })
diff --git a/src/libsyntax/print/pprust.rs b/src/libsyntax/print/pprust.rs
index 2ad3d3a..7cecf4b 100644
--- a/src/libsyntax/print/pprust.rs
+++ b/src/libsyntax/print/pprust.rs
@@ -224,6 +224,7 @@
             let mut out = match lit {
                 token::Byte(b)           => format!("b'{}'", b),
                 token::Char(c)           => format!("'{}'", c),
+                token::Err(c)            => format!("'{}'", c),
                 token::Float(c)          |
                 token::Integer(c)        => c.to_string(),
                 token::Str_(s)           => format!("\"{}\"", s),
@@ -603,6 +604,14 @@
         }
         match lit.node {
             ast::LitKind::Str(st, style) => self.print_string(&st.as_str(), style),
+            ast::LitKind::Err(st) => {
+                let st = st.as_str().escape_debug();
+                let mut res = String::with_capacity(st.len() + 2);
+                res.push('\'');
+                res.push_str(&st);
+                res.push('\'');
+                self.writer().word(res)
+            }
             ast::LitKind::Byte(byte) => {
                 let mut res = String::from("b'");
                 res.extend(ascii::escape_default(byte).map(|c| c as char));
@@ -807,7 +816,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/ptr.rs b/src/libsyntax/ptr.rs
index bb1744e..3effe53 100644
--- a/src/libsyntax/ptr.rs
+++ b/src/libsyntax/ptr.rs
@@ -101,6 +101,7 @@
                 // Recreate self from the raw pointer.
                 Some(P { ptr: Box::from_raw(p) })
             } else {
+                drop(Box::from_raw(p));
                 None
             }
         }
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/concat.rs b/src/libsyntax_ext/concat.rs
index 807f190..f148f8e 100644
--- a/src/libsyntax_ext/concat.rs
+++ b/src/libsyntax_ext/concat.rs
@@ -23,6 +23,7 @@
         match e.node {
             ast::ExprKind::Lit(ref lit) => match lit.node {
                 ast::LitKind::Str(ref s, _)
+                | ast::LitKind::Err(ref s)
                 | ast::LitKind::Float(ref s, _)
                 | ast::LitKind::FloatUnsuffixed(ref s) => {
                     accumulator.push_str(&s.as_str());
diff --git a/src/libsyntax_ext/format.rs b/src/libsyntax_ext/format.rs
index 3e3bca7..215df42 100644
--- a/src/libsyntax_ext/format.rs
+++ b/src/libsyntax_ext/format.rs
@@ -493,7 +493,10 @@
 
                 let fill = arg.format.fill.unwrap_or(' ');
 
-                if *arg != simple_arg || fill != ' ' {
+                let pos_simple =
+                    arg.position.index() == simple_arg.position.index();
+
+                if !pos_simple || arg.format != simple_arg.format || fill != ' ' {
                     self.all_pieces_simple = false;
                 }
 
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/lib.rs b/src/libsyntax_pos/lib.rs
index 6a41a93..d9d7f9b 100644
--- a/src/libsyntax_pos/lib.rs
+++ b/src/libsyntax_pos/lib.rs
@@ -668,6 +668,11 @@
         &self.primary_spans
     }
 
+    /// Returns whether any of the primary spans is displayable.
+    pub fn has_primary_spans(&self) -> bool {
+        self.primary_spans.iter().any(|sp| !sp.is_dummy())
+    }
+
     /// Returns `true` if this contains only a dummy primary span with any hygienic context.
     pub fn is_dummy(&self) -> bool {
         let mut is_dummy = true;
@@ -726,6 +731,11 @@
 
         span_labels
     }
+
+    /// Returns whether any of the span labels is displayable.
+    pub fn has_span_labels(&self) -> bool {
+        self.span_labels.iter().any(|(sp, _)| !sp.is_dummy())
+    }
 }
 
 impl From<Span> for MultiSpan {
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-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/try_from.rs b/src/test/run-pass/try_from.rs
new file mode 100644
index 0000000..4522ce3
--- /dev/null
+++ b/src/test/run-pass/try_from.rs
@@ -0,0 +1,37 @@
+// This test relies on `TryFrom` being blanket impl for all `T: Into`
+// and `TryInto` being blanket impl for all `U: TryFrom`
+
+// This test was added to show the motivation for doing this
+// over `TryFrom` being blanket impl for all `T: From`
+
+#![feature(try_from, never_type)]
+
+use std::convert::TryInto;
+
+struct Foo<T> {
+    t: T,
+}
+
+// This fails to compile due to coherence restrictions
+// as of Rust version 1.32.x, therefore it could not be used
+// instead of the `Into` version of the impl, and serves as
+// motivation for a blanket impl for all `T: Into`, instead
+// of a blanket impl for all `T: From`
+/*
+impl<T> From<Foo<T>> for Box<T> {
+    fn from(foo: Foo<T>) -> Box<T> {
+        Box::new(foo.t)
+    }
+}
+*/
+
+impl<T> Into<Vec<T>> for Foo<T> {
+    fn into(self) -> Vec<T> {
+        vec![self.t]
+    }
+}
+
+pub fn main() {
+    let _: Result<Vec<i32>, !> = Foo { t: 10 }.try_into();
+}
+
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-ui/invalid-syntax.rs b/src/test/rustdoc-ui/invalid-syntax.rs
index 537816b..924e038 100644
--- a/src/test/rustdoc-ui/invalid-syntax.rs
+++ b/src/test/rustdoc-ui/invalid-syntax.rs
@@ -1,7 +1,66 @@
 // compile-pass
-// compile-flags: --error-format=human
 
 /// ```
 /// \__________pkt->size___________/          \_result->size_/ \__pkt->size__/
 /// ```
 pub fn foo() {}
+
+/// ```
+///    |
+/// LL | use foobar::Baz;
+///    |     ^^^^^^ did you mean `baz::foobar`?
+/// ```
+pub fn bar() {}
+
+/// ```
+/// valid
+/// ```
+///
+/// ```
+/// \_
+/// ```
+///
+/// ```text
+/// "invalid
+/// ```
+pub fn valid_and_invalid() {}
+
+/// This is a normal doc comment, but...
+///
+/// There's a code block with bad syntax in it:
+///
+/// ```rust
+/// \_
+/// ```
+///
+/// Good thing we tested it!
+pub fn baz() {}
+
+/// Indented block start
+///
+///     code with bad syntax
+///     \_
+///
+/// Indented block end
+pub fn quux() {}
+
+/// Unclosed fence
+///
+/// ```
+/// slkdjf
+pub fn xyzzy() {}
+
+/// Indented code that contains a fence
+///
+///     ```
+pub fn blah() {}
+
+/// ```edition2018
+/// \_
+/// ```
+pub fn blargh() {}
+
+#[doc = "```"]
+/// \_
+#[doc = "```"]
+pub fn crazy_attrs() {}
diff --git a/src/test/rustdoc-ui/invalid-syntax.stderr b/src/test/rustdoc-ui/invalid-syntax.stderr
index b566133..1080038 100644
--- a/src/test/rustdoc-ui/invalid-syntax.stderr
+++ b/src/test/rustdoc-ui/invalid-syntax.stderr
@@ -1,10 +1,97 @@
-Output from rustc:
-error: unknown start of token: /
- --> <stdin>:1:1
-  |
-1 | /__________pkt->size___________/          /_result->size_/ /__pkt->size__/
-  | ^
+warning: could not parse code block as Rust code
+  --> $DIR/invalid-syntax.rs:3:5
+   |
+LL |   /// ```
+   |  _____^
+LL | | /// /__________pkt->size___________/          /_result->size_/ /__pkt->size__/
+LL | | /// ```
+   | |_______^
+   |
+   = note: error from rustc: unknown start of token: /
+help: mark blocks that do not contain Rust code as text
+   |
+LL | /// ```text
+   |     ^^^^^^^
 
-warning: Invalid doc comment starting with: `/__________pkt->size___________/          /_result->size_/ /__pkt->size__/`
-(Ignoring this codeblock)
+warning: could not parse code block as Rust code
+  --> $DIR/invalid-syntax.rs:8:5
+   |
+LL |   /// ```
+   |  _____^
+LL | | ///    |
+LL | | /// LL | use foobar::Baz;
+LL | | ///    |     ^^^^^^ did you mean `baz::foobar`?
+LL | | /// ```
+   | |_______^
+   |
+   = note: error from rustc: unknown start of token: `
+help: mark blocks that do not contain Rust code as text
+   |
+LL | /// ```text
+   |     ^^^^^^^
+
+warning: could not parse code block as Rust code
+  --> $DIR/invalid-syntax.rs:19:5
+   |
+LL |   /// ```
+   |  _____^
+LL | | /// /_
+LL | | /// ```
+   | |_______^
+   |
+   = note: error from rustc: unknown start of token: /
+help: mark blocks that do not contain Rust code as text
+   |
+LL | /// ```text
+   |     ^^^^^^^
+
+warning: could not parse code block as Rust code
+  --> $DIR/invalid-syntax.rs:32:5
+   |
+LL |   /// ```rust
+   |  _____^
+LL | | /// /_
+LL | | /// ```
+   | |_______^
+   |
+   = note: error from rustc: unknown start of token: /
+
+warning: could not parse code block as Rust code
+  --> $DIR/invalid-syntax.rs:41:9
+   |
+LL |   ///     code with bad syntax
+   |  _________^
+LL | | ///     /_
+   | |__________^
+   |
+   = note: error from rustc: unknown start of token: /
+
+warning: could not parse code block as Rust code
+  --> $DIR/invalid-syntax.rs:55:9
+   |
+LL | ///     ```
+   |         ^^^
+   |
+   = note: error from rustc: unknown start of token: `
+
+warning: could not parse code block as Rust code
+  --> $DIR/invalid-syntax.rs:58:5
+   |
+LL |   /// ```edition2018
+   |  _____^
+LL | | /// /_
+LL | | /// ```
+   | |_______^
+   |
+   = note: error from rustc: unknown start of token: /
+
+warning: doc comment contains an invalid Rust code block
+  --> $DIR/invalid-syntax.rs:63:1
+   |
+LL | / #[doc = "```"]
+LL | | /// /_
+LL | | #[doc = "```"]
+   | |______________^
+   |
+   = help: mark blocks that do not contain Rust code as text: ```text
 
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/bad-codeblock-syntax.rs b/src/test/rustdoc/bad-codeblock-syntax.rs
new file mode 100644
index 0000000..0ab2f68
--- /dev/null
+++ b/src/test/rustdoc/bad-codeblock-syntax.rs
@@ -0,0 +1,27 @@
+// @has bad_codeblock_syntax/fn.foo.html
+// @has - '//*[@class="docblock"]/pre/code' '\_'
+/// ```
+/// \_
+/// ```
+pub fn foo() {}
+
+// @has bad_codeblock_syntax/fn.bar.html
+// @has - '//*[@class="docblock"]/pre/code' '`baz::foobar`'
+/// ```
+/// `baz::foobar`
+/// ```
+pub fn bar() {}
+
+// @has bad_codeblock_syntax/fn.quux.html
+// @has - '//*[@class="docblock"]/pre/code' '\_'
+/// ```rust
+/// \_
+/// ```
+pub fn quux() {}
+
+// @has bad_codeblock_syntax/fn.ok.html
+// @has - '//*[@class="docblock"]/pre/code[@class="language-text"]' '\_'
+/// ```text
+/// \_
+/// ```
+pub fn ok() {}
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/cast/cast-ptr-to-int-const.rs b/src/test/ui/cast/cast-ptr-to-int-const.rs
index 70b4869..ac153cb 100644
--- a/src/test/ui/cast/cast-ptr-to-int-const.rs
+++ b/src/test/ui/cast/cast-ptr-to-int-const.rs
@@ -1,7 +1,11 @@
 // gate-test-const_raw_ptr_to_usize_cast
 
 fn main() {
-    const X: u32 = main as u32; //~ ERROR casting pointers to integers in constants is unstable
+    const X: u32 = unsafe {
+        main as u32 //~ ERROR casting pointers to integers in constants is unstable
+    };
     const Y: u32 = 0;
-    const Z: u32 = &Y as *const u32 as u32; //~ ERROR is unstable
+    const Z: u32 = unsafe {
+        &Y as *const u32 as u32 //~ ERROR is unstable
+    };
 }
diff --git a/src/test/ui/cast/cast-ptr-to-int-const.stderr b/src/test/ui/cast/cast-ptr-to-int-const.stderr
index 3cce07d..d04595e 100644
--- a/src/test/ui/cast/cast-ptr-to-int-const.stderr
+++ b/src/test/ui/cast/cast-ptr-to-int-const.stderr
@@ -1,16 +1,16 @@
 error[E0658]: casting pointers to integers in constants is unstable (see issue #51910)
-  --> $DIR/cast-ptr-to-int-const.rs:4:20
+  --> $DIR/cast-ptr-to-int-const.rs:5:9
    |
-LL |     const X: u32 = main as u32; //~ ERROR casting pointers to integers in constants is unstable
-   |                    ^^^^^^^^^^^
+LL |         main as u32 //~ ERROR casting pointers to integers in constants is unstable
+   |         ^^^^^^^^^^^
    |
    = help: add #![feature(const_raw_ptr_to_usize_cast)] to the crate attributes to enable
 
 error[E0658]: casting pointers to integers in constants is unstable (see issue #51910)
-  --> $DIR/cast-ptr-to-int-const.rs:6:20
+  --> $DIR/cast-ptr-to-int-const.rs:9:9
    |
-LL |     const Z: u32 = &Y as *const u32 as u32; //~ ERROR is unstable
-   |                    ^^^^^^^^^^^^^^^^^^^^^^^
+LL |         &Y as *const u32 as u32 //~ ERROR is unstable
+   |         ^^^^^^^^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(const_raw_ptr_to_usize_cast)] to the crate attributes to enable
 
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/consts/const-eval/const_raw_ptr_ops.rs b/src/test/ui/consts/const-eval/const_raw_ptr_ops.rs
index 63bac17..4426668 100644
--- a/src/test/ui/consts/const-eval/const_raw_ptr_ops.rs
+++ b/src/test/ui/consts/const-eval/const_raw_ptr_ops.rs
@@ -3,13 +3,13 @@
 fn main() {}
 
 // unconst and bad, will thus error in miri
-const X: bool = &1 as *const i32 == &2 as *const i32; //~ ERROR any use of this value will cause
+const X: bool = unsafe { &1 as *const i32 == &2 as *const i32 }; //~ ERROR any use of this
 // unconst and fine
-const X2: bool = 42 as *const i32 == 43 as *const i32;
+const X2: bool = unsafe { 42 as *const i32 == 43 as *const i32 };
 // unconst and fine
-const Y: usize = 42usize as *const i32 as usize + 1;
+const Y: usize = unsafe { 42usize as *const i32 as usize + 1 };
 // unconst and bad, will thus error in miri
-const Y2: usize = &1 as *const i32 as usize + 1; //~ ERROR any use of this value will cause
+const Y2: usize = unsafe { &1 as *const i32 as usize + 1 }; //~ ERROR any use of this
 // unconst and fine
 const Z: i32 = unsafe { *(&1 as *const i32) };
 // unconst and bad, will thus error in miri
diff --git a/src/test/ui/consts/const-eval/const_raw_ptr_ops.stderr b/src/test/ui/consts/const-eval/const_raw_ptr_ops.stderr
index ea11359..6be54c0 100644
--- a/src/test/ui/consts/const-eval/const_raw_ptr_ops.stderr
+++ b/src/test/ui/consts/const-eval/const_raw_ptr_ops.stderr
@@ -1,20 +1,20 @@
 error: any use of this value will cause an error
   --> $DIR/const_raw_ptr_ops.rs:6:1
    |
-LL | const X: bool = &1 as *const i32 == &2 as *const i32; //~ ERROR any use of this value will cause
-   | ^^^^^^^^^^^^^^^^------------------------------------^
-   |                 |
-   |                 "pointer arithmetic or comparison" needs an rfc before being allowed inside constants
+LL | const X: bool = unsafe { &1 as *const i32 == &2 as *const i32 }; //~ ERROR any use of this
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^------------------------------------^^^
+   |                          |
+   |                          "pointer arithmetic or comparison" needs an rfc before being allowed inside constants
    |
    = note: #[deny(const_err)] on by default
 
 error: any use of this value will cause an error
   --> $DIR/const_raw_ptr_ops.rs:12:1
    |
-LL | const Y2: usize = &1 as *const i32 as usize + 1; //~ ERROR any use of this value will cause
-   | ^^^^^^^^^^^^^^^^^^-----------------------------^
-   |                   |
-   |                   "pointer arithmetic or comparison" needs an rfc before being allowed inside constants
+LL | const Y2: usize = unsafe { &1 as *const i32 as usize + 1 }; //~ ERROR any use of this
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^-----------------------------^^^
+   |                            |
+   |                            "pointer arithmetic or comparison" needs an rfc before being allowed inside constants
 
 error: any use of this value will cause an error
   --> $DIR/const_raw_ptr_ops.rs:16:1
diff --git a/src/test/ui/consts/const-eval/ub-nonnull.rs b/src/test/ui/consts/const-eval/ub-nonnull.rs
index 7fbcab8..3e0b094 100644
--- a/src/test/ui/consts/const-eval/ub-nonnull.rs
+++ b/src/test/ui/consts/const-eval/ub-nonnull.rs
@@ -13,6 +13,13 @@
 const NULL_USIZE: NonZeroUsize = unsafe { mem::transmute(0usize) };
 //~^ ERROR it is undefined behavior to use this value
 
+union Transmute {
+    uninit: (),
+    out: NonZeroU8,
+}
+const UNINIT: NonZeroU8 = unsafe { Transmute { uninit: () }.out };
+//~^ ERROR it is undefined behavior to use this value
+
 // Also test other uses of rustc_layout_scalar_valid_range_start
 
 #[rustc_layout_scalar_valid_range_start(10)]
diff --git a/src/test/ui/consts/const-eval/ub-nonnull.stderr b/src/test/ui/consts/const-eval/ub-nonnull.stderr
index 5f8e0c7..6230712 100644
--- a/src/test/ui/consts/const-eval/ub-nonnull.stderr
+++ b/src/test/ui/consts/const-eval/ub-nonnull.stderr
@@ -23,7 +23,15 @@
    = note: The rules on what exactly is undefined behavior aren't clear, so this check might be overzealous. Please open an issue on the rust compiler repository if you believe it should not be considered undefined behavior
 
 error[E0080]: it is undefined behavior to use this value
-  --> $DIR/ub-nonnull.rs:21:1
+  --> $DIR/ub-nonnull.rs:20:1
+   |
+LL | const UNINIT: NonZeroU8 = unsafe { Transmute { uninit: () }.out };
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered uninitialized bytes, but expected something greater or equal to 1
+   |
+   = note: The rules on what exactly is undefined behavior aren't clear, so this check might be overzealous. Please open an issue on the rust compiler repository if you believe it should not be considered undefined behavior
+
+error[E0080]: it is undefined behavior to use this value
+  --> $DIR/ub-nonnull.rs:28:1
    |
 LL | const BAD_RANGE1: RestrictedRange1 = unsafe { RestrictedRange1(42) };
    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered 42, but expected something in the range 10..=30
@@ -31,13 +39,13 @@
    = note: The rules on what exactly is undefined behavior aren't clear, so this check might be overzealous. Please open an issue on the rust compiler repository if you believe it should not be considered undefined behavior
 
 error[E0080]: it is undefined behavior to use this value
-  --> $DIR/ub-nonnull.rs:27:1
+  --> $DIR/ub-nonnull.rs:34:1
    |
 LL | const BAD_RANGE2: RestrictedRange2 = unsafe { RestrictedRange2(20) };
    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered 20, but expected something less or equal to 10, or greater or equal to 30
    |
    = note: The rules on what exactly is undefined behavior aren't clear, so this check might be overzealous. Please open an issue on the rust compiler repository if you believe it should not be considered undefined behavior
 
-error: aborting due to 5 previous errors
+error: aborting due to 6 previous errors
 
 For more information about this error, try `rustc --explain E0080`.
diff --git a/src/test/ui/consts/const-size_of-cycle.stderr b/src/test/ui/consts/const-size_of-cycle.stderr
index 8f9498e8..8f8eb38 100644
--- a/src/test/ui/consts/const-size_of-cycle.stderr
+++ b/src/test/ui/consts/const-size_of-cycle.stderr
@@ -9,8 +9,8 @@
    |
 LL |     intrinsics::size_of::<T>()
    |     ^^^^^^^^^^^^^^^^^^^^^^^^^^
-note: ...which requires computing layout of `Foo`...
-note: ...which requires normalizing `ParamEnvAnd { param_env: ParamEnv { caller_bounds: [], reveal: All, def_id: None }, value: [u8; _] }`...
+   = note: ...which requires computing layout of `Foo`...
+   = note: ...which requires normalizing `ParamEnvAnd { param_env: ParamEnv { caller_bounds: [], reveal: All, def_id: None }, value: [u8; _] }`...
 note: ...which requires const-evaluating + checking `Foo::bytes::{{constant}}`...
   --> $DIR/const-size_of-cycle.rs:6:17
    |
diff --git a/src/test/ui/consts/min_const_fn/cmp_fn_pointers.rs b/src/test/ui/consts/min_const_fn/cmp_fn_pointers.rs
index d8abd97..c2600f8 100644
--- a/src/test/ui/consts/min_const_fn/cmp_fn_pointers.rs
+++ b/src/test/ui/consts/min_const_fn/cmp_fn_pointers.rs
@@ -1,5 +1,5 @@
 const fn cmp(x: fn(), y: fn()) -> bool { //~ ERROR function pointers in const fn are unstable
-    x == y
+    unsafe { x == y }
 }
 
 fn main() {}
diff --git a/src/test/ui/consts/min_const_fn/min_const_fn.nll.stderr b/src/test/ui/consts/min_const_fn/min_const_fn.nll.stderr
index 91b0760..763c69e 100644
--- a/src/test/ui/consts/min_const_fn/min_const_fn.nll.stderr
+++ b/src/test/ui/consts/min_const_fn/min_const_fn.nll.stderr
@@ -95,97 +95,109 @@
    |                                          ^^^^^^^^^^
 
 error: casting pointers to ints is unstable in const fn
-  --> $DIR/min_const_fn.rs:94:42
+  --> $DIR/min_const_fn.rs:94:63
+   |
+LL | const fn foo30_with_unsafe(x: *const u32) -> usize { unsafe { x as usize } }
+   |                                                               ^^^^^^^^^^
+
+error: casting pointers to ints is unstable in const fn
+  --> $DIR/min_const_fn.rs:96:42
    |
 LL | const fn foo30_2(x: *mut u32) -> usize { x as usize }
    |                                          ^^^^^^^^^^
 
+error: casting pointers to ints is unstable in const fn
+  --> $DIR/min_const_fn.rs:98:63
+   |
+LL | const fn foo30_2_with_unsafe(x: *mut u32) -> usize { unsafe { x as usize } }
+   |                                                               ^^^^^^^^^^
+
 error: `if`, `match`, `&&` and `||` are not stable in const fn
-  --> $DIR/min_const_fn.rs:96:38
+  --> $DIR/min_const_fn.rs:100:38
    |
 LL | const fn foo30_4(b: bool) -> usize { if b { 1 } else { 42 } }
    |                                      ^^^^^^^^^^^^^^^^^^^^^^
 
 error: `if`, `match`, `&&` and `||` are not stable in const fn
-  --> $DIR/min_const_fn.rs:98:29
+  --> $DIR/min_const_fn.rs:102:29
    |
 LL | const fn foo30_5(b: bool) { while b { } } //~ ERROR not stable in const fn
    |                             ^^^^^^^^^^^
 
 error: `if`, `match`, `&&` and `||` are not stable in const fn
-  --> $DIR/min_const_fn.rs:100:44
+  --> $DIR/min_const_fn.rs:104:44
    |
 LL | const fn foo36(a: bool, b: bool) -> bool { a && b }
    |                                            ^^^^^^
 
 error: `if`, `match`, `&&` and `||` are not stable in const fn
-  --> $DIR/min_const_fn.rs:102:44
+  --> $DIR/min_const_fn.rs:106:44
    |
 LL | const fn foo37(a: bool, b: bool) -> bool { a || b }
    |                                            ^^^^^^
 
 error: mutable references in const fn are unstable
-  --> $DIR/min_const_fn.rs:104:14
+  --> $DIR/min_const_fn.rs:108:14
    |
 LL | const fn inc(x: &mut i32) { *x += 1 }
    |              ^
 
 error: trait bounds other than `Sized` on const fn parameters are unstable
-  --> $DIR/min_const_fn.rs:109:6
+  --> $DIR/min_const_fn.rs:113:6
    |
 LL | impl<T: std::fmt::Debug> Foo<T> {
    |      ^
 
 error: trait bounds other than `Sized` on const fn parameters are unstable
-  --> $DIR/min_const_fn.rs:114:6
+  --> $DIR/min_const_fn.rs:118:6
    |
 LL | impl<T: std::fmt::Debug + Sized> Foo<T> {
    |      ^
 
 error: trait bounds other than `Sized` on const fn parameters are unstable
-  --> $DIR/min_const_fn.rs:119:6
+  --> $DIR/min_const_fn.rs:123:6
    |
 LL | impl<T: Sync + Sized> Foo<T> {
    |      ^
 
 error: `impl Trait` in const fn is unstable
-  --> $DIR/min_const_fn.rs:125:24
+  --> $DIR/min_const_fn.rs:129:24
    |
 LL | const fn no_rpit2() -> AlanTuring<impl std::fmt::Debug> { AlanTuring(0) }
    |                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 error: trait bounds other than `Sized` on const fn parameters are unstable
-  --> $DIR/min_const_fn.rs:127:34
+  --> $DIR/min_const_fn.rs:131:34
    |
 LL | const fn no_apit2(_x: AlanTuring<impl std::fmt::Debug>) {}
    |                                  ^^^^^^^^^^^^^^^^^^^^
 
 error: trait bounds other than `Sized` on const fn parameters are unstable
-  --> $DIR/min_const_fn.rs:129:22
+  --> $DIR/min_const_fn.rs:133:22
    |
 LL | const fn no_apit(_x: impl std::fmt::Debug) {} //~ ERROR trait bounds other than `Sized`
    |                      ^^^^^^^^^^^^^^^^^^^^
 
 error: `impl Trait` in const fn is unstable
-  --> $DIR/min_const_fn.rs:130:23
+  --> $DIR/min_const_fn.rs:134:23
    |
 LL | const fn no_rpit() -> impl std::fmt::Debug {} //~ ERROR `impl Trait` in const fn is unstable
    |                       ^^^^^^^^^^^^^^^^^^^^
 
 error: trait bounds other than `Sized` on const fn parameters are unstable
-  --> $DIR/min_const_fn.rs:131:23
+  --> $DIR/min_const_fn.rs:135:23
    |
 LL | const fn no_dyn_trait(_x: &dyn std::fmt::Debug) {} //~ ERROR trait bounds other than `Sized`
    |                       ^^
 
 error: trait bounds other than `Sized` on const fn parameters are unstable
-  --> $DIR/min_const_fn.rs:132:32
+  --> $DIR/min_const_fn.rs:136:32
    |
 LL | const fn no_dyn_trait_ret() -> &'static dyn std::fmt::Debug { &() }
    |                                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 warning[E0515]: cannot return reference to temporary value
-  --> $DIR/min_const_fn.rs:132:63
+  --> $DIR/min_const_fn.rs:136:63
    |
 LL | const fn no_dyn_trait_ret() -> &'static dyn std::fmt::Debug { &() }
    |                                                               ^--
@@ -197,24 +209,24 @@
    = warning: this represents potential undefined behavior in your code and this warning will become a hard error in the future
 
 error: trait bounds other than `Sized` on const fn parameters are unstable
-  --> $DIR/min_const_fn.rs:137:41
+  --> $DIR/min_const_fn.rs:141:41
    |
 LL | const fn really_no_traits_i_mean_it() { (&() as &std::fmt::Debug, ()).1 }
    |                                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 error: function pointers in const fn are unstable
-  --> $DIR/min_const_fn.rs:140:21
+  --> $DIR/min_const_fn.rs:144:21
    |
 LL | const fn no_fn_ptrs(_x: fn()) {}
    |                     ^^
 
 error: function pointers in const fn are unstable
-  --> $DIR/min_const_fn.rs:142:27
+  --> $DIR/min_const_fn.rs:146:27
    |
 LL | const fn no_fn_ptrs2() -> fn() { fn foo() {} foo }
    |                           ^^^^
 
-error: aborting due to 34 previous errors
+error: aborting due to 36 previous errors
 
 Some errors occurred: E0493, E0515.
 For more information about an error, try `rustc --explain E0493`.
diff --git a/src/test/ui/consts/min_const_fn/min_const_fn.rs b/src/test/ui/consts/min_const_fn/min_const_fn.rs
index 05cf3d5..ee3ffcd 100644
--- a/src/test/ui/consts/min_const_fn/min_const_fn.rs
+++ b/src/test/ui/consts/min_const_fn/min_const_fn.rs
@@ -90,9 +90,13 @@
 const fn foo25() -> u32 { BAR } //~ ERROR cannot access `static` items in const fn
 const fn foo26() -> &'static u32 { &BAR } //~ ERROR cannot access `static` items
 const fn foo30(x: *const u32) -> usize { x as usize }
-//~^ ERROR casting pointers to int
+//~^ ERROR casting pointers to ints is unstable
+const fn foo30_with_unsafe(x: *const u32) -> usize { unsafe { x as usize } }
+//~^ ERROR casting pointers to ints is unstable
 const fn foo30_2(x: *mut u32) -> usize { x as usize }
-//~^ ERROR casting pointers to int
+//~^ ERROR casting pointers to ints is unstable
+const fn foo30_2_with_unsafe(x: *mut u32) -> usize { unsafe { x as usize } }
+//~^ ERROR casting pointers to ints is unstable
 const fn foo30_4(b: bool) -> usize { if b { 1 } else { 42 } }
 //~^ ERROR `if`, `match`, `&&` and `||` are not stable in const fn
 const fn foo30_5(b: bool) { while b { } } //~ ERROR not stable in const fn
diff --git a/src/test/ui/consts/min_const_fn/min_const_fn.stderr b/src/test/ui/consts/min_const_fn/min_const_fn.stderr
index 2cae714..52c60c5 100644
--- a/src/test/ui/consts/min_const_fn/min_const_fn.stderr
+++ b/src/test/ui/consts/min_const_fn/min_const_fn.stderr
@@ -95,113 +95,125 @@
    |                                          ^^^^^^^^^^
 
 error: casting pointers to ints is unstable in const fn
-  --> $DIR/min_const_fn.rs:94:42
+  --> $DIR/min_const_fn.rs:94:63
+   |
+LL | const fn foo30_with_unsafe(x: *const u32) -> usize { unsafe { x as usize } }
+   |                                                               ^^^^^^^^^^
+
+error: casting pointers to ints is unstable in const fn
+  --> $DIR/min_const_fn.rs:96:42
    |
 LL | const fn foo30_2(x: *mut u32) -> usize { x as usize }
    |                                          ^^^^^^^^^^
 
+error: casting pointers to ints is unstable in const fn
+  --> $DIR/min_const_fn.rs:98:63
+   |
+LL | const fn foo30_2_with_unsafe(x: *mut u32) -> usize { unsafe { x as usize } }
+   |                                                               ^^^^^^^^^^
+
 error: `if`, `match`, `&&` and `||` are not stable in const fn
-  --> $DIR/min_const_fn.rs:96:38
+  --> $DIR/min_const_fn.rs:100:38
    |
 LL | const fn foo30_4(b: bool) -> usize { if b { 1 } else { 42 } }
    |                                      ^^^^^^^^^^^^^^^^^^^^^^
 
 error: `if`, `match`, `&&` and `||` are not stable in const fn
-  --> $DIR/min_const_fn.rs:98:29
+  --> $DIR/min_const_fn.rs:102:29
    |
 LL | const fn foo30_5(b: bool) { while b { } } //~ ERROR not stable in const fn
    |                             ^^^^^^^^^^^
 
 error: `if`, `match`, `&&` and `||` are not stable in const fn
-  --> $DIR/min_const_fn.rs:100:44
+  --> $DIR/min_const_fn.rs:104:44
    |
 LL | const fn foo36(a: bool, b: bool) -> bool { a && b }
    |                                            ^^^^^^
 
 error: `if`, `match`, `&&` and `||` are not stable in const fn
-  --> $DIR/min_const_fn.rs:102:44
+  --> $DIR/min_const_fn.rs:106:44
    |
 LL | const fn foo37(a: bool, b: bool) -> bool { a || b }
    |                                            ^^^^^^
 
 error: mutable references in const fn are unstable
-  --> $DIR/min_const_fn.rs:104:14
+  --> $DIR/min_const_fn.rs:108:14
    |
 LL | const fn inc(x: &mut i32) { *x += 1 }
    |              ^
 
 error: trait bounds other than `Sized` on const fn parameters are unstable
-  --> $DIR/min_const_fn.rs:109:6
+  --> $DIR/min_const_fn.rs:113:6
    |
 LL | impl<T: std::fmt::Debug> Foo<T> {
    |      ^
 
 error: trait bounds other than `Sized` on const fn parameters are unstable
-  --> $DIR/min_const_fn.rs:114:6
+  --> $DIR/min_const_fn.rs:118:6
    |
 LL | impl<T: std::fmt::Debug + Sized> Foo<T> {
    |      ^
 
 error: trait bounds other than `Sized` on const fn parameters are unstable
-  --> $DIR/min_const_fn.rs:119:6
+  --> $DIR/min_const_fn.rs:123:6
    |
 LL | impl<T: Sync + Sized> Foo<T> {
    |      ^
 
 error: `impl Trait` in const fn is unstable
-  --> $DIR/min_const_fn.rs:125:24
+  --> $DIR/min_const_fn.rs:129:24
    |
 LL | const fn no_rpit2() -> AlanTuring<impl std::fmt::Debug> { AlanTuring(0) }
    |                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 error: trait bounds other than `Sized` on const fn parameters are unstable
-  --> $DIR/min_const_fn.rs:127:34
+  --> $DIR/min_const_fn.rs:131:34
    |
 LL | const fn no_apit2(_x: AlanTuring<impl std::fmt::Debug>) {}
    |                                  ^^^^^^^^^^^^^^^^^^^^
 
 error: trait bounds other than `Sized` on const fn parameters are unstable
-  --> $DIR/min_const_fn.rs:129:22
+  --> $DIR/min_const_fn.rs:133:22
    |
 LL | const fn no_apit(_x: impl std::fmt::Debug) {} //~ ERROR trait bounds other than `Sized`
    |                      ^^^^^^^^^^^^^^^^^^^^
 
 error: `impl Trait` in const fn is unstable
-  --> $DIR/min_const_fn.rs:130:23
+  --> $DIR/min_const_fn.rs:134:23
    |
 LL | const fn no_rpit() -> impl std::fmt::Debug {} //~ ERROR `impl Trait` in const fn is unstable
    |                       ^^^^^^^^^^^^^^^^^^^^
 
 error: trait bounds other than `Sized` on const fn parameters are unstable
-  --> $DIR/min_const_fn.rs:131:23
+  --> $DIR/min_const_fn.rs:135:23
    |
 LL | const fn no_dyn_trait(_x: &dyn std::fmt::Debug) {} //~ ERROR trait bounds other than `Sized`
    |                       ^^
 
 error: trait bounds other than `Sized` on const fn parameters are unstable
-  --> $DIR/min_const_fn.rs:132:32
+  --> $DIR/min_const_fn.rs:136:32
    |
 LL | const fn no_dyn_trait_ret() -> &'static dyn std::fmt::Debug { &() }
    |                                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 error: trait bounds other than `Sized` on const fn parameters are unstable
-  --> $DIR/min_const_fn.rs:137:41
+  --> $DIR/min_const_fn.rs:141:41
    |
 LL | const fn really_no_traits_i_mean_it() { (&() as &std::fmt::Debug, ()).1 }
    |                                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 error: function pointers in const fn are unstable
-  --> $DIR/min_const_fn.rs:140:21
+  --> $DIR/min_const_fn.rs:144:21
    |
 LL | const fn no_fn_ptrs(_x: fn()) {}
    |                     ^^
 
 error: function pointers in const fn are unstable
-  --> $DIR/min_const_fn.rs:142:27
+  --> $DIR/min_const_fn.rs:146:27
    |
 LL | const fn no_fn_ptrs2() -> fn() { fn foo() {} foo }
    |                           ^^^^
 
-error: aborting due to 34 previous errors
+error: aborting due to 36 previous errors
 
 For more information about this error, try `rustc --explain E0493`.
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/issue-21659-show-relevant-trait-impls-2.stderr b/src/test/ui/did_you_mean/issue-21659-show-relevant-trait-impls-2.stderr
index 140f98b..d6d5ce4 100644
--- a/src/test/ui/did_you_mean/issue-21659-show-relevant-trait-impls-2.stderr
+++ b/src/test/ui/did_you_mean/issue-21659-show-relevant-trait-impls-2.stderr
@@ -8,7 +8,7 @@
              <Bar as Foo<i16>>
              <Bar as Foo<i32>>
              <Bar as Foo<i8>>
-             <Bar as Foo<u8>>
+             <Bar as Foo<u16>>
            and 2 others
 
 error: aborting due to previous error
diff --git a/src/test/ui/did_you_mean/issue-39802-show-5-trait-impls.stderr b/src/test/ui/did_you_mean/issue-39802-show-5-trait-impls.stderr
index 2346698..3411958 100644
--- a/src/test/ui/did_you_mean/issue-39802-show-5-trait-impls.stderr
+++ b/src/test/ui/did_you_mean/issue-39802-show-5-trait-impls.stderr
@@ -40,10 +40,10 @@
    |     ^^^^^^^^^^^^^^^ the trait `Foo<i32>` is not implemented for `bool`
    |
    = help: the following implementations were found:
+             <bool as Foo<bool>>
+             <bool as Foo<i8>>
              <bool as Foo<u16>>
              <bool as Foo<u32>>
-             <bool as Foo<u64>>
-             <bool as Foo<u8>>
            and 2 others
 note: required by `Foo::bar`
   --> $DIR/issue-39802-show-5-trait-impls.rs:2:5
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/e0119/conflict-with-std.stderr b/src/test/ui/e0119/conflict-with-std.stderr
index d94e4dc..c2ae321 100644
--- a/src/test/ui/e0119/conflict-with-std.stderr
+++ b/src/test/ui/e0119/conflict-with-std.stderr
@@ -25,7 +25,7 @@
    |
    = note: conflicting implementation in crate `core`:
            - impl<T, U> std::convert::TryFrom<U> for T
-             where T: std::convert::From<U>;
+             where U: std::convert::Into<T>;
 
 error: aborting due to 3 previous errors
 
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/E0214.stderr b/src/test/ui/error-codes/E0214.stderr
index 08a98b1..a10f2c0 100644
--- a/src/test/ui/error-codes/E0214.stderr
+++ b/src/test/ui/error-codes/E0214.stderr
@@ -1,8 +1,11 @@
-error[E0214]: parenthesized parameters may only be used with a trait
+error[E0214]: parenthesized type parameters may only be used with a `Fn` trait
   --> $DIR/E0214.rs:2:15
    |
 LL |     let v: Vec(&str) = vec!["foo"];
-   |               ^^^^^^ only traits may use parentheses
+   |               ^^^^^^
+   |               |
+   |               only `Fn` traits may use parentheses
+   |               help: use angle brackets instead: `<&str>`
 
 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/E0395.rs b/src/test/ui/error-codes/E0395.rs
index c2de56c..9657bbd 100644
--- a/src/test/ui/error-codes/E0395.rs
+++ b/src/test/ui/error-codes/E0395.rs
@@ -3,6 +3,6 @@
 static FOO: i32 = 42;
 static BAR: i32 = 42;
 
-static BAZ: bool = { (&FOO as *const i32) == (&BAR as *const i32) }; //~ ERROR issue #53020
+static BAZ: bool = unsafe { (&FOO as *const i32) == (&BAR as *const i32) }; //~ ERROR issue #53020
 fn main() {
 }
diff --git a/src/test/ui/error-codes/E0395.stderr b/src/test/ui/error-codes/E0395.stderr
index 45e1ba0..cc7d94e 100644
--- a/src/test/ui/error-codes/E0395.stderr
+++ b/src/test/ui/error-codes/E0395.stderr
@@ -1,8 +1,8 @@
 error[E0658]: comparing raw pointers inside static (see issue #53020)
-  --> $DIR/E0395.rs:6:22
+  --> $DIR/E0395.rs:6:29
    |
-LL | static BAZ: bool = { (&FOO as *const i32) == (&BAR as *const i32) }; //~ ERROR issue #53020
-   |                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+LL | static BAZ: bool = unsafe { (&FOO as *const i32) == (&BAR as *const i32) }; //~ ERROR issue #53020
+   |                             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(const_compare_raw_pointers)] to the crate attributes to enable
 
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/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-is_sorted.rs b/src/test/ui/feature-gates/feature-gate-is_sorted.rs
new file mode 100644
index 0000000..078ecc5
--- /dev/null
+++ b/src/test/ui/feature-gates/feature-gate-is_sorted.rs
@@ -0,0 +1,13 @@
+fn main() {
+    // Assert `Iterator` methods are feature gated
+    assert!([1, 2, 2, 9].iter().is_sorted());
+    //~^ ERROR: use of unstable library feature 'is_sorted': new API
+    assert!(![-2i32, -1, 0, 3].iter().is_sorted_by_key(|n| n.abs()));
+    //~^ ERROR: use of unstable library feature 'is_sorted': new API
+
+    // Assert `[T]` methods are feature gated
+    assert!([1, 2, 2, 9].is_sorted());
+    //~^ ERROR: use of unstable library feature 'is_sorted': new API
+    assert!(![-2i32, -1, 0, 3].is_sorted_by_key(|n| n.abs()));
+    //~^ ERROR: use of unstable library feature 'is_sorted': new API
+}
diff --git a/src/test/ui/feature-gates/feature-gate-is_sorted.stderr b/src/test/ui/feature-gates/feature-gate-is_sorted.stderr
new file mode 100644
index 0000000..8230c1e
--- /dev/null
+++ b/src/test/ui/feature-gates/feature-gate-is_sorted.stderr
@@ -0,0 +1,35 @@
+error[E0658]: use of unstable library feature 'is_sorted': new API (see issue #53485)
+  --> $DIR/feature-gate-is_sorted.rs:3:33
+   |
+LL |     assert!([1, 2, 2, 9].iter().is_sorted());
+   |                                 ^^^^^^^^^
+   |
+   = help: add #![feature(is_sorted)] to the crate attributes to enable
+
+error[E0658]: use of unstable library feature 'is_sorted': new API (see issue #53485)
+  --> $DIR/feature-gate-is_sorted.rs:5:39
+   |
+LL |     assert!(![-2i32, -1, 0, 3].iter().is_sorted_by_key(|n| n.abs()));
+   |                                       ^^^^^^^^^^^^^^^^
+   |
+   = help: add #![feature(is_sorted)] to the crate attributes to enable
+
+error[E0658]: use of unstable library feature 'is_sorted': new API (see issue #53485)
+  --> $DIR/feature-gate-is_sorted.rs:9:26
+   |
+LL |     assert!([1, 2, 2, 9].is_sorted());
+   |                          ^^^^^^^^^
+   |
+   = help: add #![feature(is_sorted)] to the crate attributes to enable
+
+error[E0658]: use of unstable library feature 'is_sorted': new API (see issue #53485)
+  --> $DIR/feature-gate-is_sorted.rs:11:32
+   |
+LL |     assert!(![-2i32, -1, 0, 3].is_sorted_by_key(|n| n.abs()));
+   |                                ^^^^^^^^^^^^^^^^
+   |
+   = help: add #![feature(is_sorted)] to the crate attributes to enable
+
+error: aborting due to 4 previous errors
+
+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/impl-trait/auto-trait-leak.stderr b/src/test/ui/impl-trait/auto-trait-leak.stderr
index 4acc400..b936fed 100644
--- a/src/test/ui/impl-trait/auto-trait-leak.stderr
+++ b/src/test/ui/impl-trait/auto-trait-leak.stderr
@@ -9,7 +9,7 @@
    |
 LL | fn cycle1() -> impl Clone {
    | ^^^^^^^^^^^^^^^^^^^^^^^^^
-note: ...which requires evaluating trait selection obligation `impl std::clone::Clone: std::marker::Send`...
+   = note: ...which requires evaluating trait selection obligation `impl std::clone::Clone: std::marker::Send`...
 note: ...which requires processing `cycle2::{{impl-Trait}}`...
   --> $DIR/auto-trait-leak.rs:23:16
    |
@@ -20,7 +20,7 @@
    |
 LL | fn cycle2() -> impl Clone {
    | ^^^^^^^^^^^^^^^^^^^^^^^^^
-note: ...which requires evaluating trait selection obligation `impl std::clone::Clone: std::marker::Send`...
+   = note: ...which requires evaluating trait selection obligation `impl std::clone::Clone: std::marker::Send`...
    = note: ...which again requires processing `cycle1::{{impl-Trait}}`, completing the cycle
 note: cycle used when checking item types in top-level module
   --> $DIR/auto-trait-leak.rs:3:1
@@ -45,7 +45,7 @@
    |
 LL | fn cycle1() -> impl Clone {
    | ^^^^^^^^^^^^^^^^^^^^^^^^^
-note: ...which requires evaluating trait selection obligation `impl std::clone::Clone: std::marker::Send`...
+   = note: ...which requires evaluating trait selection obligation `impl std::clone::Clone: std::marker::Send`...
 note: ...which requires processing `cycle2::{{impl-Trait}}`...
   --> $DIR/auto-trait-leak.rs:23:16
    |
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/index-help.stderr b/src/test/ui/index-help.stderr
index c8b23d8..4c585a9 100644
--- a/src/test/ui/index-help.stderr
+++ b/src/test/ui/index-help.stderr
@@ -1,4 +1,4 @@
-error[E0277]: the trait bound `i32: std::slice::SliceIndex<[{integer}]>` is not satisfied
+error[E0277]: the type `[{integer}]` cannot be indexed by `i32`
   --> $DIR/index-help.rs:3:5
    |
 LL |     x[0i32]; //~ ERROR E0277
diff --git a/src/test/ui/indexing-requires-a-uint.rs b/src/test/ui/indexing-requires-a-uint.rs
index 2db3c58..dbe9b44 100644
--- a/src/test/ui/indexing-requires-a-uint.rs
+++ b/src/test/ui/indexing-requires-a-uint.rs
@@ -3,7 +3,7 @@
 
 fn main() {
     fn bar<T>(_: T) {}
-    [0][0u8]; //~ ERROR: the trait bound `u8: std::slice::SliceIndex<[{integer}]>` is not satisfied
+    [0][0u8]; //~ ERROR: the type `[{integer}]` cannot be indexed by `u8`
 
     [0][0]; // should infer to be a usize
 
diff --git a/src/test/ui/indexing-requires-a-uint.stderr b/src/test/ui/indexing-requires-a-uint.stderr
index 767f1af..363c3d0 100644
--- a/src/test/ui/indexing-requires-a-uint.stderr
+++ b/src/test/ui/indexing-requires-a-uint.stderr
@@ -1,7 +1,7 @@
-error[E0277]: the trait bound `u8: std::slice::SliceIndex<[{integer}]>` is not satisfied
+error[E0277]: the type `[{integer}]` cannot be indexed by `u8`
   --> $DIR/indexing-requires-a-uint.rs:6:5
    |
-LL |     [0][0u8]; //~ ERROR: the trait bound `u8: std::slice::SliceIndex<[{integer}]>` is not satisfied
+LL |     [0][0u8]; //~ ERROR: the type `[{integer}]` cannot be indexed by `u8`
    |     ^^^^^^^^ slice indices are of type `usize` or ranges of `usize`
    |
    = help: the trait `std::slice::SliceIndex<[{integer}]>` is not implemented for `u8`
diff --git a/src/test/ui/integral-indexing.rs b/src/test/ui/integral-indexing.rs
index 7bdbc45..f076dfc 100644
--- a/src/test/ui/integral-indexing.rs
+++ b/src/test/ui/integral-indexing.rs
@@ -3,14 +3,14 @@
     let s: String = "abcdef".to_string();
     v[3_usize];
     v[3];
-    v[3u8];  //~ERROR : std::slice::SliceIndex<[isize]>` is not satisfied
-    v[3i8];  //~ERROR : std::slice::SliceIndex<[isize]>` is not satisfied
-    v[3u32]; //~ERROR : std::slice::SliceIndex<[isize]>` is not satisfied
-    v[3i32]; //~ERROR : std::slice::SliceIndex<[isize]>` is not satisfied
+    v[3u8];  //~ERROR : the type `[isize]` cannot be indexed by `u8`
+    v[3i8];  //~ERROR : the type `[isize]` cannot be indexed by `i8`
+    v[3u32]; //~ERROR : the type `[isize]` cannot be indexed by `u32`
+    v[3i32]; //~ERROR : the type `[isize]` cannot be indexed by `i32`
     s.as_bytes()[3_usize];
     s.as_bytes()[3];
-    s.as_bytes()[3u8];  //~ERROR : std::slice::SliceIndex<[u8]>` is not satisfied
-    s.as_bytes()[3i8];  //~ERROR : std::slice::SliceIndex<[u8]>` is not satisfied
-    s.as_bytes()[3u32]; //~ERROR : std::slice::SliceIndex<[u8]>` is not satisfied
-    s.as_bytes()[3i32]; //~ERROR : std::slice::SliceIndex<[u8]>` is not satisfied
+    s.as_bytes()[3u8];  //~ERROR : the type `[u8]` cannot be indexed by `u8`
+    s.as_bytes()[3i8];  //~ERROR : the type `[u8]` cannot be indexed by `i8`
+    s.as_bytes()[3u32]; //~ERROR : the type `[u8]` cannot be indexed by `u32`
+    s.as_bytes()[3i32]; //~ERROR : the type `[u8]` cannot be indexed by `i32`
 }
diff --git a/src/test/ui/integral-indexing.stderr b/src/test/ui/integral-indexing.stderr
index 7f2dddc..efbad86 100644
--- a/src/test/ui/integral-indexing.stderr
+++ b/src/test/ui/integral-indexing.stderr
@@ -1,70 +1,70 @@
-error[E0277]: the trait bound `u8: std::slice::SliceIndex<[isize]>` is not satisfied
+error[E0277]: the type `[isize]` cannot be indexed by `u8`
   --> $DIR/integral-indexing.rs:6:5
    |
-LL |     v[3u8];  //~ERROR : std::slice::SliceIndex<[isize]>` is not satisfied
+LL |     v[3u8];  //~ERROR : the type `[isize]` cannot be indexed by `u8`
    |     ^^^^^^ slice indices are of type `usize` or ranges of `usize`
    |
    = help: the trait `std::slice::SliceIndex<[isize]>` is not implemented for `u8`
    = note: required because of the requirements on the impl of `std::ops::Index<u8>` for `std::vec::Vec<isize>`
 
-error[E0277]: the trait bound `i8: std::slice::SliceIndex<[isize]>` is not satisfied
+error[E0277]: the type `[isize]` cannot be indexed by `i8`
   --> $DIR/integral-indexing.rs:7:5
    |
-LL |     v[3i8];  //~ERROR : std::slice::SliceIndex<[isize]>` is not satisfied
+LL |     v[3i8];  //~ERROR : the type `[isize]` cannot be indexed by `i8`
    |     ^^^^^^ slice indices are of type `usize` or ranges of `usize`
    |
    = help: the trait `std::slice::SliceIndex<[isize]>` is not implemented for `i8`
    = note: required because of the requirements on the impl of `std::ops::Index<i8>` for `std::vec::Vec<isize>`
 
-error[E0277]: the trait bound `u32: std::slice::SliceIndex<[isize]>` is not satisfied
+error[E0277]: the type `[isize]` cannot be indexed by `u32`
   --> $DIR/integral-indexing.rs:8:5
    |
-LL |     v[3u32]; //~ERROR : std::slice::SliceIndex<[isize]>` is not satisfied
+LL |     v[3u32]; //~ERROR : the type `[isize]` cannot be indexed by `u32`
    |     ^^^^^^^ slice indices are of type `usize` or ranges of `usize`
    |
    = help: the trait `std::slice::SliceIndex<[isize]>` is not implemented for `u32`
    = note: required because of the requirements on the impl of `std::ops::Index<u32>` for `std::vec::Vec<isize>`
 
-error[E0277]: the trait bound `i32: std::slice::SliceIndex<[isize]>` is not satisfied
+error[E0277]: the type `[isize]` cannot be indexed by `i32`
   --> $DIR/integral-indexing.rs:9:5
    |
-LL |     v[3i32]; //~ERROR : std::slice::SliceIndex<[isize]>` is not satisfied
+LL |     v[3i32]; //~ERROR : the type `[isize]` cannot be indexed by `i32`
    |     ^^^^^^^ slice indices are of type `usize` or ranges of `usize`
    |
    = help: the trait `std::slice::SliceIndex<[isize]>` is not implemented for `i32`
    = note: required because of the requirements on the impl of `std::ops::Index<i32>` for `std::vec::Vec<isize>`
 
-error[E0277]: the trait bound `u8: std::slice::SliceIndex<[u8]>` is not satisfied
+error[E0277]: the type `[u8]` cannot be indexed by `u8`
   --> $DIR/integral-indexing.rs:12:5
    |
-LL |     s.as_bytes()[3u8];  //~ERROR : std::slice::SliceIndex<[u8]>` is not satisfied
+LL |     s.as_bytes()[3u8];  //~ERROR : the type `[u8]` cannot be indexed by `u8`
    |     ^^^^^^^^^^^^^^^^^ slice indices are of type `usize` or ranges of `usize`
    |
    = help: the trait `std::slice::SliceIndex<[u8]>` is not implemented for `u8`
    = note: required because of the requirements on the impl of `std::ops::Index<u8>` for `[u8]`
 
-error[E0277]: the trait bound `i8: std::slice::SliceIndex<[u8]>` is not satisfied
+error[E0277]: the type `[u8]` cannot be indexed by `i8`
   --> $DIR/integral-indexing.rs:13:5
    |
-LL |     s.as_bytes()[3i8];  //~ERROR : std::slice::SliceIndex<[u8]>` is not satisfied
+LL |     s.as_bytes()[3i8];  //~ERROR : the type `[u8]` cannot be indexed by `i8`
    |     ^^^^^^^^^^^^^^^^^ slice indices are of type `usize` or ranges of `usize`
    |
    = help: the trait `std::slice::SliceIndex<[u8]>` is not implemented for `i8`
    = note: required because of the requirements on the impl of `std::ops::Index<i8>` for `[u8]`
 
-error[E0277]: the trait bound `u32: std::slice::SliceIndex<[u8]>` is not satisfied
+error[E0277]: the type `[u8]` cannot be indexed by `u32`
   --> $DIR/integral-indexing.rs:14:5
    |
-LL |     s.as_bytes()[3u32]; //~ERROR : std::slice::SliceIndex<[u8]>` is not satisfied
+LL |     s.as_bytes()[3u32]; //~ERROR : the type `[u8]` cannot be indexed by `u32`
    |     ^^^^^^^^^^^^^^^^^^ slice indices are of type `usize` or ranges of `usize`
    |
    = help: the trait `std::slice::SliceIndex<[u8]>` is not implemented for `u32`
    = note: required because of the requirements on the impl of `std::ops::Index<u32>` for `[u8]`
 
-error[E0277]: the trait bound `i32: std::slice::SliceIndex<[u8]>` is not satisfied
+error[E0277]: the type `[u8]` cannot be indexed by `i32`
   --> $DIR/integral-indexing.rs:15:5
    |
-LL |     s.as_bytes()[3i32]; //~ERROR : std::slice::SliceIndex<[u8]>` is not satisfied
+LL |     s.as_bytes()[3i32]; //~ERROR : the type `[u8]` cannot be indexed by `i32`
    |     ^^^^^^^^^^^^^^^^^^ slice indices are of type `usize` or ranges of `usize`
    |
    = help: the trait `std::slice::SliceIndex<[u8]>` is not implemented for `i32`
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-17458.rs b/src/test/ui/issues/issue-17458.rs
index d7a1752..444e94d 100644
--- a/src/test/ui/issues/issue-17458.rs
+++ b/src/test/ui/issues/issue-17458.rs
@@ -1,4 +1,4 @@
-static X: usize = 0 as *const usize as usize;
+static X: usize = unsafe { 0 as *const usize as usize };
 //~^ ERROR: casting pointers to integers in statics is unstable
 
 fn main() {
diff --git a/src/test/ui/issues/issue-17458.stderr b/src/test/ui/issues/issue-17458.stderr
index 0492141..a1a8ed9 100644
--- a/src/test/ui/issues/issue-17458.stderr
+++ b/src/test/ui/issues/issue-17458.stderr
@@ -1,8 +1,8 @@
 error[E0658]: casting pointers to integers in statics is unstable (see issue #51910)
-  --> $DIR/issue-17458.rs:1:19
+  --> $DIR/issue-17458.rs:1:28
    |
-LL | static X: usize = 0 as *const usize as usize;
-   |                   ^^^^^^^^^^^^^^^^^^^^^^^^^^
+LL | static X: usize = unsafe { 0 as *const usize as usize };
+   |                            ^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(const_raw_ptr_to_usize_cast)] to the crate attributes to enable
 
diff --git a/src/test/ui/issues/issue-18294.rs b/src/test/ui/issues/issue-18294.rs
index df4fd16..1c2229f 100644
--- a/src/test/ui/issues/issue-18294.rs
+++ b/src/test/ui/issues/issue-18294.rs
@@ -1,5 +1,5 @@
 fn main() {
     const X: u32 = 1;
-    const Y: usize = &X as *const u32 as usize; //~ ERROR is unstable
+    const Y: usize = unsafe { &X as *const u32 as usize }; //~ ERROR is unstable
     println!("{}", Y);
 }
diff --git a/src/test/ui/issues/issue-18294.stderr b/src/test/ui/issues/issue-18294.stderr
index 2af7f45..f3e8ab1 100644
--- a/src/test/ui/issues/issue-18294.stderr
+++ b/src/test/ui/issues/issue-18294.stderr
@@ -1,8 +1,8 @@
 error[E0658]: casting pointers to integers in constants is unstable (see issue #51910)
-  --> $DIR/issue-18294.rs:3:22
+  --> $DIR/issue-18294.rs:3:31
    |
-LL |     const Y: usize = &X as *const u32 as usize; //~ ERROR is unstable
-   |                      ^^^^^^^^^^^^^^^^^^^^^^^^^
+LL |     const Y: usize = unsafe { &X as *const u32 as usize }; //~ ERROR is unstable
+   |                               ^^^^^^^^^^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(const_raw_ptr_to_usize_cast)] to the crate attributes to enable
 
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-23589.rs b/src/test/ui/issues/issue-23589.rs
index a59710a..1c640af 100644
--- a/src/test/ui/issues/issue-23589.rs
+++ b/src/test/ui/issues/issue-23589.rs
@@ -1,4 +1,5 @@
 fn main() {
     let v: Vec(&str) = vec!['1', '2'];
-    //~^ ERROR parenthesized parameters may only be used with a trait
+    //~^ ERROR parenthesized type parameters may only be used with a `Fn` trait
+    //~| ERROR mismatched types
 }
diff --git a/src/test/ui/issues/issue-23589.stderr b/src/test/ui/issues/issue-23589.stderr
index e6e07c1..bc2007b 100644
--- a/src/test/ui/issues/issue-23589.stderr
+++ b/src/test/ui/issues/issue-23589.stderr
@@ -1,9 +1,22 @@
-error[E0214]: parenthesized parameters may only be used with a trait
+error[E0214]: parenthesized type parameters may only be used with a `Fn` trait
   --> $DIR/issue-23589.rs:2:15
    |
 LL |     let v: Vec(&str) = vec!['1', '2'];
-   |               ^^^^^^ only traits may use parentheses
+   |               ^^^^^^
+   |               |
+   |               only `Fn` traits may use parentheses
+   |               help: use angle brackets instead: `<&str>`
 
-error: aborting due to previous error
+error[E0308]: mismatched types
+  --> $DIR/issue-23589.rs:2:29
+   |
+LL |     let v: Vec(&str) = vec!['1', '2'];
+   |                             ^^^ expected &str, found char
+   |
+   = note: expected type `&str`
+              found type `char`
 
-For more information about this error, try `rustc --explain E0214`.
+error: aborting due to 2 previous errors
+
+Some errors occurred: E0214, E0308.
+For more information about an error, try `rustc --explain E0214`.
diff --git a/src/test/ui/issues/issue-25826.rs b/src/test/ui/issues/issue-25826.rs
index e602265..36a69cf 100644
--- a/src/test/ui/issues/issue-25826.rs
+++ b/src/test/ui/issues/issue-25826.rs
@@ -1,6 +1,6 @@
 fn id<T>(t: T) -> T { t }
 fn main() {
-    const A: bool = id::<u8> as *const () < id::<u16> as *const ();
+    const A: bool = unsafe { id::<u8> as *const () < id::<u16> as *const () };
     //~^ ERROR comparing raw pointers inside constant
     println!("{}", A);
 }
diff --git a/src/test/ui/issues/issue-25826.stderr b/src/test/ui/issues/issue-25826.stderr
index 73ebf29..dc547f7c 100644
--- a/src/test/ui/issues/issue-25826.stderr
+++ b/src/test/ui/issues/issue-25826.stderr
@@ -1,8 +1,8 @@
 error[E0658]: comparing raw pointers inside constant (see issue #53020)
-  --> $DIR/issue-25826.rs:3:21
+  --> $DIR/issue-25826.rs:3:30
    |
-LL |     const A: bool = id::<u8> as *const () < id::<u16> as *const ();
-   |                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+LL |     const A: bool = unsafe { id::<u8> as *const () < id::<u16> as *const () };
+   |                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(const_compare_raw_pointers)] to the crate attributes to enable
 
diff --git a/src/test/ui/issues/issue-26548.stderr b/src/test/ui/issues/issue-26548.stderr
index 84604f3..ff197ee 100644
--- a/src/test/ui/issues/issue-26548.stderr
+++ b/src/test/ui/issues/issue-26548.stderr
@@ -1,6 +1,6 @@
 error[E0391]: cycle detected when computing layout of `std::option::Option<S>`
    |
-note: ...which requires computing layout of `S`...
+   = note: ...which requires computing layout of `S`...
    = note: ...which again requires computing layout of `std::option::Option<S>`, completing the cycle
 note: cycle used when processing `main`
   --> $DIR/issue-26548.rs:9:1
diff --git a/src/test/ui/issues/issue-32995-2.rs b/src/test/ui/issues/issue-32995-2.rs
index a4e333e..2234f68 100644
--- a/src/test/ui/issues/issue-32995-2.rs
+++ b/src/test/ui/issues/issue-32995-2.rs
@@ -2,11 +2,11 @@
 
 fn main() {
     { fn f<X: ::std::marker()::Send>() {} }
-    //~^ ERROR parenthesized parameters may only be used with a trait
+    //~^ ERROR parenthesized type parameters may only be used with a `Fn` trait
     //~| WARN previously accepted
 
     { fn f() -> impl ::std::marker()::Send { } }
-    //~^ ERROR parenthesized parameters may only be used with a trait
+    //~^ ERROR parenthesized type parameters may only be used with a `Fn` trait
     //~| WARN previously accepted
 }
 
@@ -14,5 +14,5 @@
 struct X;
 
 impl ::std::marker()::Copy for X {}
-//~^ ERROR parenthesized parameters may only be used with a trait
+//~^ ERROR parenthesized type parameters may only be used with a `Fn` trait
 //~| WARN previously accepted
diff --git a/src/test/ui/issues/issue-32995-2.stderr b/src/test/ui/issues/issue-32995-2.stderr
index 0ac12b7..104b76c 100644
--- a/src/test/ui/issues/issue-32995-2.stderr
+++ b/src/test/ui/issues/issue-32995-2.stderr
@@ -1,4 +1,4 @@
-error: parenthesized parameters may only be used with a trait
+error: parenthesized type parameters may only be used with a `Fn` trait
   --> $DIR/issue-32995-2.rs:4:28
    |
 LL |     { fn f<X: ::std::marker()::Send>() {} }
@@ -8,7 +8,7 @@
    = 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 #42238 <https://github.com/rust-lang/rust/issues/42238>
 
-error: parenthesized parameters may only be used with a trait
+error: parenthesized type parameters may only be used with a `Fn` trait
   --> $DIR/issue-32995-2.rs:8:35
    |
 LL |     { fn f() -> impl ::std::marker()::Send { } }
@@ -17,7 +17,7 @@
    = 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 #42238 <https://github.com/rust-lang/rust/issues/42238>
 
-error: parenthesized parameters may only be used with a trait
+error: parenthesized type parameters may only be used with a `Fn` trait
   --> $DIR/issue-32995-2.rs:16:19
    |
 LL | impl ::std::marker()::Copy for X {}
diff --git a/src/test/ui/issues/issue-32995.rs b/src/test/ui/issues/issue-32995.rs
index 726cc85..c32fb63 100644
--- a/src/test/ui/issues/issue-32995.rs
+++ b/src/test/ui/issues/issue-32995.rs
@@ -2,32 +2,32 @@
 
 fn main() {
     let x: usize() = 1;
-    //~^ ERROR parenthesized parameters may only be used with a trait
+    //~^ ERROR parenthesized type parameters may only be used with a `Fn` trait
     //~| WARN previously accepted
 
     let b: ::std::boxed()::Box<_> = Box::new(1);
-    //~^ ERROR parenthesized parameters may only be used with a trait
+    //~^ ERROR parenthesized type parameters may only be used with a `Fn` trait
     //~| WARN previously accepted
 
     let p = ::std::str::()::from_utf8(b"foo").unwrap();
-    //~^ ERROR parenthesized parameters may only be used with a trait
+    //~^ ERROR parenthesized type parameters may only be used with a `Fn` trait
     //~| WARN previously accepted
 
     let p = ::std::str::from_utf8::()(b"foo").unwrap();
-    //~^ ERROR parenthesized parameters may only be used with a trait
+    //~^ ERROR parenthesized type parameters may only be used with a `Fn` trait
     //~| WARN previously accepted
 
     let o : Box<::std::marker()::Send> = Box::new(1);
-    //~^ ERROR parenthesized parameters may only be used with a trait
+    //~^ ERROR parenthesized type parameters may only be used with a `Fn` trait
     //~| WARN previously accepted
 
     let o : Box<Send + ::std::marker()::Sync> = Box::new(1);
-    //~^ ERROR parenthesized parameters may only be used with a trait
+    //~^ ERROR parenthesized type parameters may only be used with a `Fn` trait
     //~| WARN previously accepted
 }
 
 fn foo<X:Default>() {
     let d : X() = Default::default();
-    //~^ ERROR parenthesized parameters may only be used with a trait
+    //~^ ERROR parenthesized type parameters may only be used with a `Fn` trait
     //~| WARN previously accepted
 }
diff --git a/src/test/ui/issues/issue-32995.stderr b/src/test/ui/issues/issue-32995.stderr
index 12551bb..97b4b7fa 100644
--- a/src/test/ui/issues/issue-32995.stderr
+++ b/src/test/ui/issues/issue-32995.stderr
@@ -1,4 +1,4 @@
-error: parenthesized parameters may only be used with a trait
+error: parenthesized type parameters may only be used with a `Fn` trait
   --> $DIR/issue-32995.rs:4:17
    |
 LL |     let x: usize() = 1;
@@ -8,7 +8,7 @@
    = 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 #42238 <https://github.com/rust-lang/rust/issues/42238>
 
-error: parenthesized parameters may only be used with a trait
+error: parenthesized type parameters may only be used with a `Fn` trait
   --> $DIR/issue-32995.rs:8:24
    |
 LL |     let b: ::std::boxed()::Box<_> = Box::new(1);
@@ -17,25 +17,25 @@
    = 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 #42238 <https://github.com/rust-lang/rust/issues/42238>
 
-error: parenthesized parameters may only be used with a trait
-  --> $DIR/issue-32995.rs:12:23
+error: parenthesized type parameters may only be used with a `Fn` trait
+  --> $DIR/issue-32995.rs:12:25
    |
 LL |     let p = ::std::str::()::from_utf8(b"foo").unwrap();
-   |                       ^^^^
+   |                         ^^
    |
    = 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 #42238 <https://github.com/rust-lang/rust/issues/42238>
 
-error: parenthesized parameters may only be used with a trait
-  --> $DIR/issue-32995.rs:16:34
+error: parenthesized type parameters may only be used with a `Fn` trait
+  --> $DIR/issue-32995.rs:16:36
    |
 LL |     let p = ::std::str::from_utf8::()(b"foo").unwrap();
-   |                                  ^^^^
+   |                                    ^^
    |
    = 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 #42238 <https://github.com/rust-lang/rust/issues/42238>
 
-error: parenthesized parameters may only be used with a trait
+error: parenthesized type parameters may only be used with a `Fn` trait
   --> $DIR/issue-32995.rs:20:30
    |
 LL |     let o : Box<::std::marker()::Send> = Box::new(1);
@@ -44,7 +44,7 @@
    = 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 #42238 <https://github.com/rust-lang/rust/issues/42238>
 
-error: parenthesized parameters may only be used with a trait
+error: parenthesized type parameters may only be used with a `Fn` trait
   --> $DIR/issue-32995.rs:24:37
    |
 LL |     let o : Box<Send + ::std::marker()::Sync> = Box::new(1);
@@ -53,7 +53,7 @@
    = 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 #42238 <https://github.com/rust-lang/rust/issues/42238>
 
-error: parenthesized parameters may only be used with a trait
+error: parenthesized type parameters may only be used with a `Fn` trait
   --> $DIR/issue-32995.rs:30:14
    |
 LL |     let d : X() = Default::default();
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-44415.stderr b/src/test/ui/issues/issue-44415.stderr
index 441f1b2..3f377fd 100644
--- a/src/test/ui/issues/issue-44415.stderr
+++ b/src/test/ui/issues/issue-44415.stderr
@@ -9,8 +9,8 @@
    |
 LL |     bytes: [u8; unsafe { intrinsics::size_of::<Foo>() }],
    |                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-note: ...which requires computing layout of `Foo`...
-note: ...which requires normalizing `ParamEnvAnd { param_env: ParamEnv { caller_bounds: [], reveal: All, def_id: None }, value: [u8; _] }`...
+   = note: ...which requires computing layout of `Foo`...
+   = note: ...which requires normalizing `ParamEnvAnd { param_env: ParamEnv { caller_bounds: [], reveal: All, def_id: None }, value: [u8; _] }`...
 note: ...which requires const-evaluating + checking `Foo::bytes::{{constant}}`...
   --> $DIR/issue-44415.rs:6:17
    |
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-54582.rs b/src/test/ui/issues/issue-54582.rs
new file mode 100644
index 0000000..c2dbf36
--- /dev/null
+++ b/src/test/ui/issues/issue-54582.rs
@@ -0,0 +1,16 @@
+// run-pass
+
+pub trait Stage: Sync {}
+
+pub enum Enum {
+    A,
+    B,
+}
+
+impl Stage for Enum {}
+
+pub static ARRAY: [(&Stage, &str); 1] = [
+    (&Enum::A, ""),
+];
+
+fn main() {}
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/issues/issue-57741-1.rs b/src/test/ui/issues/issue-57741-1.rs
new file mode 100644
index 0000000..d0aae23
--- /dev/null
+++ b/src/test/ui/issues/issue-57741-1.rs
@@ -0,0 +1,18 @@
+#![allow(warnings)]
+
+// This tests that the `help: consider dereferencing the boxed value` suggestion isn't made
+// because the box doesn't deref to the type of the arm.
+
+enum S {
+    A { a: usize },
+    B { b: usize },
+}
+
+fn main() {
+    let x = Box::new(3u32);
+    let y = match x {
+        S::A { a } | S::B { b: a } => a,
+        //~^ ERROR mismatched types [E0308]
+        //~^^ ERROR mismatched types [E0308]
+    };
+}
diff --git a/src/test/ui/issues/issue-57741-1.stderr b/src/test/ui/issues/issue-57741-1.stderr
new file mode 100644
index 0000000..d36424b
--- /dev/null
+++ b/src/test/ui/issues/issue-57741-1.stderr
@@ -0,0 +1,25 @@
+error[E0308]: mismatched types
+  --> $DIR/issue-57741-1.rs:14:9
+   |
+LL |     let y = match x {
+   |                   - this match expression has type `std::boxed::Box<u32>`
+LL |         S::A { a } | S::B { b: a } => a,
+   |         ^^^^^^^^^^ expected struct `std::boxed::Box`, found enum `S`
+   |
+   = note: expected type `std::boxed::Box<u32>`
+              found type `S`
+
+error[E0308]: mismatched types
+  --> $DIR/issue-57741-1.rs:14:22
+   |
+LL |     let y = match x {
+   |                   - this match expression has type `std::boxed::Box<u32>`
+LL |         S::A { a } | S::B { b: a } => a,
+   |                      ^^^^^^^^^^^^^ expected struct `std::boxed::Box`, found enum `S`
+   |
+   = note: expected type `std::boxed::Box<u32>`
+              found type `S`
+
+error: aborting due to 2 previous errors
+
+For more information about this error, try `rustc --explain E0308`.
diff --git a/src/test/ui/issues/issue-57741.fixed b/src/test/ui/issues/issue-57741.fixed
new file mode 100644
index 0000000..4cae080
--- /dev/null
+++ b/src/test/ui/issues/issue-57741.fixed
@@ -0,0 +1,31 @@
+// run-rustfix
+
+#![allow(warnings)]
+
+// This tests that the `help: consider dereferencing the boxed value` suggestion is made and works.
+
+enum S {
+    A { a: usize },
+    B { b: usize },
+}
+
+enum T {
+    A(usize),
+    B(usize),
+}
+
+fn main() {
+    let x = Box::new(T::A(3));
+    let y = match *x {
+        T::A(a) | T::B(a) => a,
+        //~^ ERROR mismatched types [E0308]
+        //~^^ ERROR mismatched types [E0308]
+    };
+
+    let x = Box::new(S::A { a: 3 });
+    let y = match *x {
+        S::A { a } | S::B { b: a } => a,
+        //~^ ERROR mismatched types [E0308]
+        //~^^ ERROR mismatched types [E0308]
+    };
+}
diff --git a/src/test/ui/issues/issue-57741.rs b/src/test/ui/issues/issue-57741.rs
new file mode 100644
index 0000000..e265829
--- /dev/null
+++ b/src/test/ui/issues/issue-57741.rs
@@ -0,0 +1,31 @@
+// run-rustfix
+
+#![allow(warnings)]
+
+// This tests that the `help: consider dereferencing the boxed value` suggestion is made and works.
+
+enum S {
+    A { a: usize },
+    B { b: usize },
+}
+
+enum T {
+    A(usize),
+    B(usize),
+}
+
+fn main() {
+    let x = Box::new(T::A(3));
+    let y = match x {
+        T::A(a) | T::B(a) => a,
+        //~^ ERROR mismatched types [E0308]
+        //~^^ ERROR mismatched types [E0308]
+    };
+
+    let x = Box::new(S::A { a: 3 });
+    let y = match x {
+        S::A { a } | S::B { b: a } => a,
+        //~^ ERROR mismatched types [E0308]
+        //~^^ ERROR mismatched types [E0308]
+    };
+}
diff --git a/src/test/ui/issues/issue-57741.stderr b/src/test/ui/issues/issue-57741.stderr
new file mode 100644
index 0000000..a26b1d20
--- /dev/null
+++ b/src/test/ui/issues/issue-57741.stderr
@@ -0,0 +1,59 @@
+error[E0308]: mismatched types
+  --> $DIR/issue-57741.rs:20:9
+   |
+LL |     let y = match x {
+   |                   -
+   |                   |
+   |                   this match expression has type `std::boxed::Box<T>`
+   |                   help: consider dereferencing the boxed value: `*x`
+LL |         T::A(a) | T::B(a) => a,
+   |         ^^^^^^^ expected struct `std::boxed::Box`, found enum `T`
+   |
+   = note: expected type `std::boxed::Box<T>`
+              found type `T`
+
+error[E0308]: mismatched types
+  --> $DIR/issue-57741.rs:20:19
+   |
+LL |     let y = match x {
+   |                   -
+   |                   |
+   |                   this match expression has type `std::boxed::Box<T>`
+   |                   help: consider dereferencing the boxed value: `*x`
+LL |         T::A(a) | T::B(a) => a,
+   |                   ^^^^^^^ expected struct `std::boxed::Box`, found enum `T`
+   |
+   = note: expected type `std::boxed::Box<T>`
+              found type `T`
+
+error[E0308]: mismatched types
+  --> $DIR/issue-57741.rs:27:9
+   |
+LL |     let y = match x {
+   |                   -
+   |                   |
+   |                   this match expression has type `std::boxed::Box<S>`
+   |                   help: consider dereferencing the boxed value: `*x`
+LL |         S::A { a } | S::B { b: a } => a,
+   |         ^^^^^^^^^^ expected struct `std::boxed::Box`, found enum `S`
+   |
+   = note: expected type `std::boxed::Box<S>`
+              found type `S`
+
+error[E0308]: mismatched types
+  --> $DIR/issue-57741.rs:27:22
+   |
+LL |     let y = match x {
+   |                   -
+   |                   |
+   |                   this match expression has type `std::boxed::Box<S>`
+   |                   help: consider dereferencing the boxed value: `*x`
+LL |         S::A { a } | S::B { b: a } => a,
+   |                      ^^^^^^^^^^^^^ expected struct `std::boxed::Box`, found enum `S`
+   |
+   = note: expected type `std::boxed::Box<S>`
+              found type `S`
+
+error: aborting due to 4 previous errors
+
+For more information about this error, try `rustc --explain E0308`.
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-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/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/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/on-unimplemented/slice-index.stderr b/src/test/ui/on-unimplemented/slice-index.stderr
index 3a32e13..7b45d84 100644
--- a/src/test/ui/on-unimplemented/slice-index.stderr
+++ b/src/test/ui/on-unimplemented/slice-index.stderr
@@ -1,4 +1,4 @@
-error[E0277]: the trait bound `i32: std::slice::SliceIndex<[i32]>` is not satisfied
+error[E0277]: the type `[i32]` cannot be indexed by `i32`
   --> $DIR/slice-index.rs:11:5
    |
 LL |     x[1i32]; //~ ERROR E0277
@@ -7,7 +7,7 @@
    = help: the trait `std::slice::SliceIndex<[i32]>` is not implemented for `i32`
    = note: required because of the requirements on the impl of `std::ops::Index<i32>` for `[i32]`
 
-error[E0277]: the trait bound `std::ops::RangeTo<i32>: std::slice::SliceIndex<[i32]>` is not satisfied
+error[E0277]: the type `[i32]` cannot be indexed by `std::ops::RangeTo<i32>`
   --> $DIR/slice-index.rs:12:5
    |
 LL |     x[..1i32]; //~ ERROR E0277
diff --git a/src/test/ui/parenthesised-deref-suggestion.rs b/src/test/ui/parenthesized-deref-suggestion.rs
similarity index 100%
rename from src/test/ui/parenthesised-deref-suggestion.rs
rename to src/test/ui/parenthesized-deref-suggestion.rs
diff --git a/src/test/ui/parenthesised-deref-suggestion.stderr b/src/test/ui/parenthesized-deref-suggestion.stderr
similarity index 88%
rename from src/test/ui/parenthesised-deref-suggestion.stderr
rename to src/test/ui/parenthesized-deref-suggestion.stderr
index 71a2bf6..fd9b0e8 100644
--- a/src/test/ui/parenthesised-deref-suggestion.stderr
+++ b/src/test/ui/parenthesized-deref-suggestion.stderr
@@ -1,5 +1,5 @@
 error[E0609]: no field `opts` on type `*const Session`
-  --> $DIR/parenthesised-deref-suggestion.rs:7:30
+  --> $DIR/parenthesized-deref-suggestion.rs:7:30
    |
 LL |     (sess as *const Session).opts; //~ ERROR no field `opts` on type `*const Session`
    |                              ^^^^
@@ -9,7 +9,7 @@
    |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 error[E0609]: no field `0` on type `[u32; 1]`
-  --> $DIR/parenthesised-deref-suggestion.rs:10:21
+  --> $DIR/parenthesized-deref-suggestion.rs:10:21
    |
 LL |     (x as [u32; 1]).0; //~ ERROR no field `0` on type `[u32; 1]`
    |     ----------------^
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/doc-before-eof.stderr b/src/test/ui/parser/doc-before-eof.stderr
index b764e9f..5809d64 100644
--- a/src/test/ui/parser/doc-before-eof.stderr
+++ b/src/test/ui/parser/doc-before-eof.stderr
@@ -2,7 +2,7 @@
   --> $DIR/doc-before-eof.rs:3:1
    |
 LL | /// hi //~ERROR expected item after doc comment
-   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ this doc comment doesn't document anything
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/parser/doc-before-extern-rbrace.stderr b/src/test/ui/parser/doc-before-extern-rbrace.stderr
index 47fab7b..8cc9c91 100644
--- a/src/test/ui/parser/doc-before-extern-rbrace.stderr
+++ b/src/test/ui/parser/doc-before-extern-rbrace.stderr
@@ -2,7 +2,7 @@
   --> $DIR/doc-before-extern-rbrace.rs:2:5
    |
 LL |     /// hi
-   |     ^^^^^^
+   |     ^^^^^^ this doc comment doesn't document anything
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/parser/doc-before-mod-rbrace.stderr b/src/test/ui/parser/doc-before-mod-rbrace.stderr
index 41c1d70..4eaf351 100644
--- a/src/test/ui/parser/doc-before-mod-rbrace.stderr
+++ b/src/test/ui/parser/doc-before-mod-rbrace.stderr
@@ -2,7 +2,7 @@
   --> $DIR/doc-before-mod-rbrace.rs:4:5
    |
 LL |     /// document
-   |     ^^^^^^^^^^^^
+   |     ^^^^^^^^^^^^ this doc comment doesn't document anything
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/parser/lex-bad-char-literals-2.rs b/src/test/ui/parser/lex-bad-char-literals-2.rs
index 7f85999..1e180f8 100644
--- a/src/test/ui/parser/lex-bad-char-literals-2.rs
+++ b/src/test/ui/parser/lex-bad-char-literals-2.rs
@@ -1,4 +1,4 @@
 // This test needs to the last one appearing in this file as it kills the parser
 static c: char =
-    'nope' //~ ERROR: character literal may only contain one codepoint: 'nope'
+    'nope' //~ ERROR: character literal may only contain one codepoint
 ;
diff --git a/src/test/ui/parser/lex-bad-char-literals-2.stderr b/src/test/ui/parser/lex-bad-char-literals-2.stderr
index a7075b7..7eadb8e 100644
--- a/src/test/ui/parser/lex-bad-char-literals-2.stderr
+++ b/src/test/ui/parser/lex-bad-char-literals-2.stderr
@@ -1,8 +1,13 @@
-error: character literal may only contain one codepoint: 'nope'
+error: character literal may only contain one codepoint
   --> $DIR/lex-bad-char-literals-2.rs:3:5
    |
-LL |     'nope' //~ ERROR: character literal may only contain one codepoint: 'nope'
+LL |     'nope' //~ ERROR: character literal may only contain one codepoint
    |     ^^^^^^
 
-error: aborting due to previous error
+error[E0601]: `main` function not found in crate `lex_bad_char_literals_2`
+   |
+   = note: consider adding a `main` function to `$DIR/lex-bad-char-literals-2.rs`
 
+error: aborting due to 2 previous errors
+
+For more information about this error, try `rustc --explain E0601`.
diff --git a/src/test/ui/parser/lex-bad-char-literals-3.rs b/src/test/ui/parser/lex-bad-char-literals-3.rs
index f874970..5194ff4 100644
--- a/src/test/ui/parser/lex-bad-char-literals-3.rs
+++ b/src/test/ui/parser/lex-bad-char-literals-3.rs
@@ -1,7 +1,7 @@
-// This test needs to the last one appearing in this file as it kills the parser
-static c: char =
-    '●●' //~ ERROR: character literal may only contain one codepoint
-         //~| ERROR: mismatched types
-;
+static c: char = '●●';
+//~^ ERROR: character literal may only contain one codepoint
 
-fn main() {}
+fn main() {
+    let ch: &str = '●●';
+    //~^ ERROR: character literal may only contain one codepoint
+}
diff --git a/src/test/ui/parser/lex-bad-char-literals-3.stderr b/src/test/ui/parser/lex-bad-char-literals-3.stderr
index 89f18e3..6462a3c 100644
--- a/src/test/ui/parser/lex-bad-char-literals-3.stderr
+++ b/src/test/ui/parser/lex-bad-char-literals-3.stderr
@@ -1,22 +1,22 @@
 error: character literal may only contain one codepoint
-  --> $DIR/lex-bad-char-literals-3.rs:3:5
+  --> $DIR/lex-bad-char-literals-3.rs:1:18
    |
-LL |     '●●' //~ ERROR: character literal may only contain one codepoint
-   |     ^^^^
+LL | static c: char = '●●';
+   |                  ^^^^
 help: if you meant to write a `str` literal, use double quotes
    |
-LL |     "●●" //~ ERROR: character literal may only contain one codepoint
-   |     ^^^^
+LL | static c: char = "●●";
+   |                  ^^^^
 
-error[E0308]: mismatched types
-  --> $DIR/lex-bad-char-literals-3.rs:3:5
+error: character literal may only contain one codepoint
+  --> $DIR/lex-bad-char-literals-3.rs:5:20
    |
-LL |     '●●' //~ ERROR: character literal may only contain one codepoint
-   |     ^^^^ expected char, found reference
+LL |     let ch: &str = '●●';
+   |                    ^^^^
+help: if you meant to write a `str` literal, use double quotes
    |
-   = note: expected type `char`
-              found type `&'static str`
+LL |     let ch: &str = "●●";
+   |                    ^^^^
 
 error: aborting due to 2 previous errors
 
-For more information about this error, try `rustc --explain E0308`.
diff --git a/src/test/ui/parser/lex-bad-char-literals-4.rs b/src/test/ui/parser/lex-bad-char-literals-4.rs
index 966e2bb..e13f11f 100644
--- a/src/test/ui/parser/lex-bad-char-literals-4.rs
+++ b/src/test/ui/parser/lex-bad-char-literals-4.rs
@@ -1,5 +1,5 @@
 //
 // This test needs to the last one appearing in this file as it kills the parser
 static c: char =
-    '●  //~ ERROR: character literal may only contain one codepoint: '●
+    '●  //~ ERROR: character literal may only contain one codepoint
 ;
diff --git a/src/test/ui/parser/lex-bad-char-literals-4.stderr b/src/test/ui/parser/lex-bad-char-literals-4.stderr
index 550cb54..881e3d5 100644
--- a/src/test/ui/parser/lex-bad-char-literals-4.stderr
+++ b/src/test/ui/parser/lex-bad-char-literals-4.stderr
@@ -1,7 +1,7 @@
 error: character literal may only contain one codepoint: '●
   --> $DIR/lex-bad-char-literals-4.rs:4:5
    |
-LL |     '●  //~ ERROR: character literal may only contain one codepoint: '●
+LL |     '●  //~ ERROR: character literal may only contain one codepoint
    |     ^^
 
 error: aborting due to previous error
diff --git a/src/test/ui/parser/lex-bad-char-literals-5.rs b/src/test/ui/parser/lex-bad-char-literals-5.rs
index 247289e..0c4339e 100644
--- a/src/test/ui/parser/lex-bad-char-literals-5.rs
+++ b/src/test/ui/parser/lex-bad-char-literals-5.rs
@@ -1,8 +1,7 @@
-//
-// This test needs to the last one appearing in this file as it kills the parser
-static c: char =
-    '\x10\x10'  //~ ERROR: character literal may only contain one codepoint
-                //~| ERROR: mismatched types
-;
+static c: char = '\x10\x10';
+//~^ ERROR: character literal may only contain one codepoint
 
-fn main() {}
+fn main() {
+    let ch: &str = '\x10\x10';
+    //~^ ERROR: character literal may only contain one codepoint
+}
diff --git a/src/test/ui/parser/lex-bad-char-literals-5.stderr b/src/test/ui/parser/lex-bad-char-literals-5.stderr
index 523d71f..ef02973 100644
--- a/src/test/ui/parser/lex-bad-char-literals-5.stderr
+++ b/src/test/ui/parser/lex-bad-char-literals-5.stderr
@@ -1,22 +1,22 @@
 error: character literal may only contain one codepoint
-  --> $DIR/lex-bad-char-literals-5.rs:4:5
+  --> $DIR/lex-bad-char-literals-5.rs:1:18
    |
-LL |     '/x10/x10'  //~ ERROR: character literal may only contain one codepoint
-   |     ^^^^^^^^^^
+LL | static c: char = '/x10/x10';
+   |                  ^^^^^^^^^^
 help: if you meant to write a `str` literal, use double quotes
    |
-LL |     "/x10/x10"  //~ ERROR: character literal may only contain one codepoint
-   |     ^^^^^^^^^^
+LL | static c: char = "/x10/x10";
+   |                  ^^^^^^^^^^
 
-error[E0308]: mismatched types
-  --> $DIR/lex-bad-char-literals-5.rs:4:5
+error: character literal may only contain one codepoint
+  --> $DIR/lex-bad-char-literals-5.rs:5:20
    |
-LL |     '/x10/x10'  //~ ERROR: character literal may only contain one codepoint
-   |     ^^^^^^^^^^ expected char, found reference
+LL |     let ch: &str = '/x10/x10';
+   |                    ^^^^^^^^^^
+help: if you meant to write a `str` literal, use double quotes
    |
-   = note: expected type `char`
-              found type `&'static str`
+LL |     let ch: &str = "/x10/x10";
+   |                    ^^^^^^^^^^
 
 error: aborting due to 2 previous errors
 
-For more information about this error, try `rustc --explain E0308`.
diff --git a/src/test/ui/parser/lex-bad-char-literals-6.rs b/src/test/ui/parser/lex-bad-char-literals-6.rs
new file mode 100644
index 0000000..4379b4f
--- /dev/null
+++ b/src/test/ui/parser/lex-bad-char-literals-6.rs
@@ -0,0 +1,17 @@
+fn main() {
+    let x: &str = 'ab';
+    //~^ ERROR: character literal may only contain one codepoint
+    let y: char = 'cd';
+    //~^ ERROR: character literal may only contain one codepoint
+    let z = 'ef';
+    //~^ ERROR: character literal may only contain one codepoint
+
+    if x == y {}
+    //~^ ERROR: can't compare `&str` with `char`
+    if y == z {}  // no error here
+    if x == z {}
+    //~^ ERROR: can't compare `&str` with `char`
+
+    let a: usize = "";
+    //~^ ERROR: mismatched types
+}
diff --git a/src/test/ui/parser/lex-bad-char-literals-6.stderr b/src/test/ui/parser/lex-bad-char-literals-6.stderr
new file mode 100644
index 0000000..df99726
--- /dev/null
+++ b/src/test/ui/parser/lex-bad-char-literals-6.stderr
@@ -0,0 +1,47 @@
+error: character literal may only contain one codepoint
+  --> $DIR/lex-bad-char-literals-6.rs:2:19
+   |
+LL |     let x: &str = 'ab';
+   |                   ^^^^
+
+error: character literal may only contain one codepoint
+  --> $DIR/lex-bad-char-literals-6.rs:4:19
+   |
+LL |     let y: char = 'cd';
+   |                   ^^^^
+
+error: character literal may only contain one codepoint
+  --> $DIR/lex-bad-char-literals-6.rs:6:13
+   |
+LL |     let z = 'ef';
+   |             ^^^^
+
+error[E0277]: can't compare `&str` with `char`
+  --> $DIR/lex-bad-char-literals-6.rs:9:10
+   |
+LL |     if x == y {}
+   |          ^^ no implementation for `&str == char`
+   |
+   = help: the trait `std::cmp::PartialEq<char>` is not implemented for `&str`
+
+error[E0308]: mismatched types
+  --> $DIR/lex-bad-char-literals-6.rs:15:20
+   |
+LL |     let a: usize = "";
+   |                    ^^ expected usize, found reference
+   |
+   = note: expected type `usize`
+              found type `&'static str`
+
+error[E0277]: can't compare `&str` with `char`
+  --> $DIR/lex-bad-char-literals-6.rs:12:10
+   |
+LL |     if x == z {}
+   |          ^^ no implementation for `&str == char`
+   |
+   = help: the trait `std::cmp::PartialEq<char>` is not implemented for `&str`
+
+error: aborting due to 6 previous errors
+
+Some errors occurred: E0277, E0308.
+For more information about an error, try `rustc --explain E0277`.
diff --git a/src/test/ui/parser/type-parameters-in-field-exprs.stderr b/src/test/ui/parser/type-parameters-in-field-exprs.stderr
index e68e1f3..2183c74 100644
--- a/src/test/ui/parser/type-parameters-in-field-exprs.stderr
+++ b/src/test/ui/parser/type-parameters-in-field-exprs.stderr
@@ -1,20 +1,20 @@
 error: field expressions may not have generic arguments
-  --> $DIR/type-parameters-in-field-exprs.rs:13:8
+  --> $DIR/type-parameters-in-field-exprs.rs:13:10
    |
 LL |     f.x::<isize>;
-   |        ^^^^^^^^^
+   |          ^^^^^^^
 
 error: field expressions may not have generic arguments
-  --> $DIR/type-parameters-in-field-exprs.rs:15:8
+  --> $DIR/type-parameters-in-field-exprs.rs:15:10
    |
 LL |     f.x::<>;
-   |        ^^^^
+   |          ^^
 
 error: field expressions may not have generic arguments
-  --> $DIR/type-parameters-in-field-exprs.rs:17:8
+  --> $DIR/type-parameters-in-field-exprs.rs:17:10
    |
 LL |     f.x::();
-   |        ^^^^
+   |          ^^
 
 error: aborting due to 3 previous errors
 
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/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/span/macro-ty-params.stderr b/src/test/ui/span/macro-ty-params.stderr
index 23fdde0..965ca70 100644
--- a/src/test/ui/span/macro-ty-params.stderr
+++ b/src/test/ui/span/macro-ty-params.stderr
@@ -1,14 +1,14 @@
 error: generic arguments in macro path
-  --> $DIR/macro-ty-params.rs:10:8
+  --> $DIR/macro-ty-params.rs:10:10
    |
 LL |     foo::<T>!(); //~ ERROR generic arguments in macro path
-   |        ^^^^^
+   |          ^^^
 
 error: generic arguments in macro path
-  --> $DIR/macro-ty-params.rs:11:8
+  --> $DIR/macro-ty-params.rs:11:10
    |
 LL |     foo::<>!(); //~ ERROR generic arguments in macro path
-   |        ^^^^
+   |          ^^
 
 error: unexpected generic arguments in path
   --> $DIR/macro-ty-params.rs:12:8
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-as-char.fixed b/src/test/ui/str/str-as-char.fixed
index 9d4297b..accead5 100644
--- a/src/test/ui/str/str-as-char.fixed
+++ b/src/test/ui/str/str-as-char.fixed
@@ -1,6 +1,6 @@
 // run-rustfix
 
 fn main() {
-    println!("●●");
-    //~^ ERROR character literal may only contain one codepoint
+    println!("{}", "●●"); //~ ERROR character literal may only contain one codepoint
+    //~^ ERROR format argument must be a string literal
 }
diff --git a/src/test/ui/str/str-as-char.rs b/src/test/ui/str/str-as-char.rs
index 710fa74..fb179ec 100644
--- a/src/test/ui/str/str-as-char.rs
+++ b/src/test/ui/str/str-as-char.rs
@@ -1,6 +1,6 @@
 // run-rustfix
 
 fn main() {
-    println!('●●');
-    //~^ ERROR character literal may only contain one codepoint
+    println!('●●'); //~ ERROR character literal may only contain one codepoint
+    //~^ ERROR format argument must be a string literal
 }
diff --git a/src/test/ui/str/str-as-char.stderr b/src/test/ui/str/str-as-char.stderr
index 540a1b5..4ca430a 100644
--- a/src/test/ui/str/str-as-char.stderr
+++ b/src/test/ui/str/str-as-char.stderr
@@ -1,12 +1,22 @@
 error: character literal may only contain one codepoint
   --> $DIR/str-as-char.rs:4:14
    |
-LL |     println!('●●');
+LL |     println!('●●'); //~ ERROR character literal may only contain one codepoint
    |              ^^^^
 help: if you meant to write a `str` literal, use double quotes
    |
-LL |     println!("●●");
+LL |     println!("●●"); //~ ERROR character literal may only contain one codepoint
    |              ^^^^
 
-error: aborting due to previous error
+error: format argument must be a string literal
+  --> $DIR/str-as-char.rs:4:14
+   |
+LL |     println!('●●'); //~ ERROR character literal may only contain one codepoint
+   |              ^^^^
+help: you might be missing a string literal to format with
+   |
+LL |     println!("{}", '●●'); //~ ERROR character literal may only contain one codepoint
+   |              ^^^^^
+
+error: aborting due to 2 previous errors
 
diff --git a/src/test/ui/str/str-idx.rs b/src/test/ui/str/str-idx.rs
index 2ea8049..1b32ed5 100644
--- a/src/test/ui/str/str-idx.rs
+++ b/src/test/ui/str/str-idx.rs
@@ -1,4 +1,7 @@
 pub fn main() {
     let s: &str = "hello";
-    let c: u8 = s[4]; //~ ERROR the type `str` cannot be indexed by `{integer}`
+    let _: u8 = s[4]; //~ ERROR the type `str` cannot be indexed by `{integer}`
+    let _ = s.get(4); //~ ERROR the type `str` cannot be indexed by `{integer}`
+    let _ = s.get_unchecked(4); //~ ERROR the type `str` cannot be indexed by `{integer}`
+    let _: u8 = s['c']; //~ ERROR the type `str` cannot be indexed by `char`
 }
diff --git a/src/test/ui/str/str-idx.stderr b/src/test/ui/str/str-idx.stderr
index 108096d..99df85d 100644
--- a/src/test/ui/str/str-idx.stderr
+++ b/src/test/ui/str/str-idx.stderr
@@ -1,11 +1,43 @@
 error[E0277]: the type `str` cannot be indexed by `{integer}`
   --> $DIR/str-idx.rs:3:17
    |
-LL |     let c: u8 = s[4]; //~ ERROR the type `str` cannot be indexed by `{integer}`
-   |                 ^^^^ `str` cannot be indexed by `{integer}`
+LL |     let _: u8 = s[4]; //~ ERROR the type `str` cannot be indexed by `{integer}`
+   |                 ^^^^ string indices are ranges of `usize`
    |
-   = help: the trait `std::ops::Index<{integer}>` is not implemented for `str`
+   = help: the trait `std::slice::SliceIndex<str>` is not implemented for `{integer}`
+   = 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>
+   = note: required because of the requirements on the impl of `std::ops::Index<{integer}>` for `str`
 
-error: aborting due to previous error
+error[E0277]: the type `str` cannot be indexed by `{integer}`
+  --> $DIR/str-idx.rs:4:15
+   |
+LL |     let _ = s.get(4); //~ ERROR the type `str` cannot be indexed by `{integer}`
+   |               ^^^ string indices are ranges of `usize`
+   |
+   = help: the trait `std::slice::SliceIndex<str>` is not implemented for `{integer}`
+   = 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[E0277]: the type `str` cannot be indexed by `{integer}`
+  --> $DIR/str-idx.rs:5:15
+   |
+LL |     let _ = s.get_unchecked(4); //~ ERROR the type `str` cannot be indexed by `{integer}`
+   |               ^^^^^^^^^^^^^ string indices are ranges of `usize`
+   |
+   = help: the trait `std::slice::SliceIndex<str>` is not implemented for `{integer}`
+   = 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[E0277]: the type `str` cannot be indexed by `char`
+  --> $DIR/str-idx.rs:6:17
+   |
+LL |     let _: u8 = s['c']; //~ ERROR the type `str` cannot be indexed by `char`
+   |                 ^^^^^^ string indices are ranges of `usize`
+   |
+   = help: the trait `std::slice::SliceIndex<str>` is not implemented for `char`
+   = note: required because of the requirements on the impl of `std::ops::Index<char>` for `str`
+
+error: aborting due to 4 previous errors
 
 For more information about this error, try `rustc --explain E0277`.
diff --git a/src/test/ui/str/str-mut-idx.rs b/src/test/ui/str/str-mut-idx.rs
index cebbbc3..575a9ea 100644
--- a/src/test/ui/str/str-mut-idx.rs
+++ b/src/test/ui/str/str-mut-idx.rs
@@ -5,7 +5,13 @@
     //~^ ERROR the size for values of type
     //~| ERROR the size for values of type
     s[1usize] = bot();
-    //~^ ERROR the type `str` cannot be mutably indexed by `usize`
+    //~^ ERROR the type `str` cannot be indexed by `usize`
+    s.get_mut(1);
+    //~^ ERROR the type `str` cannot be indexed by `{integer}`
+    s.get_unchecked_mut(1);
+    //~^ ERROR the type `str` cannot be indexed by `{integer}`
+    s['c'];
+    //~^ ERROR the type `str` cannot be indexed by `char`
 }
 
 pub fn main() {}
diff --git a/src/test/ui/str/str-mut-idx.stderr b/src/test/ui/str/str-mut-idx.stderr
index a0c7c2c..beb2272 100644
--- a/src/test/ui/str/str-mut-idx.stderr
+++ b/src/test/ui/str/str-mut-idx.stderr
@@ -22,14 +22,44 @@
    = note: to learn more, visit <https://doc.rust-lang.org/book/ch19-04-advanced-types.html#dynamically-sized-types-and-the-sized-trait>
    = note: the left-hand-side of an assignment must have a statically known size
 
-error[E0277]: the type `str` cannot be mutably indexed by `usize`
+error[E0277]: the type `str` cannot be indexed by `usize`
   --> $DIR/str-mut-idx.rs:7:5
    |
 LL |     s[1usize] = bot();
-   |     ^^^^^^^^^ `str` cannot be mutably indexed by `usize`
+   |     ^^^^^^^^^ string indices are ranges of `usize`
    |
-   = help: the trait `std::ops::IndexMut<usize>` is not implemented for `str`
+   = help: the trait `std::slice::SliceIndex<str>` is not implemented for `usize`
+   = note: required because of the requirements on the impl of `std::ops::Index<usize>` for `str`
 
-error: aborting due to 3 previous errors
+error[E0277]: the type `str` cannot be indexed by `{integer}`
+  --> $DIR/str-mut-idx.rs:9:7
+   |
+LL |     s.get_mut(1);
+   |       ^^^^^^^ string indices are ranges of `usize`
+   |
+   = help: the trait `std::slice::SliceIndex<str>` is not implemented for `{integer}`
+   = 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[E0277]: the type `str` cannot be indexed by `{integer}`
+  --> $DIR/str-mut-idx.rs:11:7
+   |
+LL |     s.get_unchecked_mut(1);
+   |       ^^^^^^^^^^^^^^^^^ string indices are ranges of `usize`
+   |
+   = help: the trait `std::slice::SliceIndex<str>` is not implemented for `{integer}`
+   = 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[E0277]: the type `str` cannot be indexed by `char`
+  --> $DIR/str-mut-idx.rs:13:5
+   |
+LL |     s['c'];
+   |     ^^^^^^ string indices are ranges of `usize`
+   |
+   = help: the trait `std::slice::SliceIndex<str>` is not implemented for `char`
+   = note: required because of the requirements on the impl of `std::ops::Index<char>` for `str`
+
+error: aborting due to 6 previous errors
 
 For more information about this error, try `rustc --explain E0277`.
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/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/suggestions/type-mismatch-struct-field-shorthand-2.rs b/src/test/ui/suggestions/type-mismatch-struct-field-shorthand-2.rs
new file mode 100644
index 0000000..2ce1222
--- /dev/null
+++ b/src/test/ui/suggestions/type-mismatch-struct-field-shorthand-2.rs
@@ -0,0 +1,9 @@
+struct RGB { r: f64, g: f64, b: f64 }
+
+fn main() {
+    let (r, g, c): (f32, f32, f32) = (0., 0., 0.);
+    let _ = RGB { r, g, c };
+    //~^ ERROR mismatched types
+    //~| ERROR mismatched types
+    //~| ERROR struct `RGB` has no field named `c`
+}
diff --git a/src/test/ui/suggestions/type-mismatch-struct-field-shorthand-2.stderr b/src/test/ui/suggestions/type-mismatch-struct-field-shorthand-2.stderr
new file mode 100644
index 0000000..d0f9e1f
--- /dev/null
+++ b/src/test/ui/suggestions/type-mismatch-struct-field-shorthand-2.stderr
@@ -0,0 +1,30 @@
+error[E0308]: mismatched types
+  --> $DIR/type-mismatch-struct-field-shorthand-2.rs:5:19
+   |
+LL |     let _ = RGB { r, g, c };
+   |                   ^ expected f64, found f32
+help: you can cast an `f32` to `f64` in a lossless way
+   |
+LL |     let _ = RGB { r: r.into(), g, c };
+   |                   ^^^^^^^^^^^
+
+error[E0308]: mismatched types
+  --> $DIR/type-mismatch-struct-field-shorthand-2.rs:5:22
+   |
+LL |     let _ = RGB { r, g, c };
+   |                      ^ expected f64, found f32
+help: you can cast an `f32` to `f64` in a lossless way
+   |
+LL |     let _ = RGB { r, g: g.into(), c };
+   |                      ^^^^^^^^^^^
+
+error[E0560]: struct `RGB` has no field named `c`
+  --> $DIR/type-mismatch-struct-field-shorthand-2.rs:5:25
+   |
+LL |     let _ = RGB { r, g, c };
+   |                         ^ help: a field with a similar name exists: `b`
+
+error: aborting due to 3 previous errors
+
+Some errors occurred: E0308, E0560.
+For more information about an error, try `rustc --explain E0308`.
diff --git a/src/test/ui/suggestions/type-mismatch-struct-field-shorthand.fixed b/src/test/ui/suggestions/type-mismatch-struct-field-shorthand.fixed
new file mode 100644
index 0000000..91758c0
--- /dev/null
+++ b/src/test/ui/suggestions/type-mismatch-struct-field-shorthand.fixed
@@ -0,0 +1,12 @@
+// run-rustfix
+#![allow(dead_code)]
+
+struct RGB { r: f64, g: f64, b: f64 }
+
+fn main() {
+    let (r, g, b): (f32, f32, f32) = (0., 0., 0.);
+    let _ = RGB { r: r.into(), g: g.into(), b: b.into() };
+    //~^ ERROR mismatched types
+    //~| ERROR mismatched types
+    //~| ERROR mismatched types
+}
diff --git a/src/test/ui/suggestions/type-mismatch-struct-field-shorthand.rs b/src/test/ui/suggestions/type-mismatch-struct-field-shorthand.rs
new file mode 100644
index 0000000..9d3a17a
--- /dev/null
+++ b/src/test/ui/suggestions/type-mismatch-struct-field-shorthand.rs
@@ -0,0 +1,12 @@
+// run-rustfix
+#![allow(dead_code)]
+
+struct RGB { r: f64, g: f64, b: f64 }
+
+fn main() {
+    let (r, g, b): (f32, f32, f32) = (0., 0., 0.);
+    let _ = RGB { r, g, b };
+    //~^ ERROR mismatched types
+    //~| ERROR mismatched types
+    //~| ERROR mismatched types
+}
diff --git a/src/test/ui/suggestions/type-mismatch-struct-field-shorthand.stderr b/src/test/ui/suggestions/type-mismatch-struct-field-shorthand.stderr
new file mode 100644
index 0000000..6bc16ba
--- /dev/null
+++ b/src/test/ui/suggestions/type-mismatch-struct-field-shorthand.stderr
@@ -0,0 +1,33 @@
+error[E0308]: mismatched types
+  --> $DIR/type-mismatch-struct-field-shorthand.rs:8:19
+   |
+LL |     let _ = RGB { r, g, b };
+   |                   ^ expected f64, found f32
+help: you can cast an `f32` to `f64` in a lossless way
+   |
+LL |     let _ = RGB { r: r.into(), g, b };
+   |                   ^^^^^^^^^^^
+
+error[E0308]: mismatched types
+  --> $DIR/type-mismatch-struct-field-shorthand.rs:8:22
+   |
+LL |     let _ = RGB { r, g, b };
+   |                      ^ expected f64, found f32
+help: you can cast an `f32` to `f64` in a lossless way
+   |
+LL |     let _ = RGB { r, g: g.into(), b };
+   |                      ^^^^^^^^^^^
+
+error[E0308]: mismatched types
+  --> $DIR/type-mismatch-struct-field-shorthand.rs:8:25
+   |
+LL |     let _ = RGB { r, g, b };
+   |                         ^ expected f64, found f32
+help: you can cast an `f32` to `f64` in a lossless way
+   |
+LL |     let _ = RGB { r, g, b: b.into() };
+   |                         ^^^^^^^^^^^
+
+error: aborting due to 3 previous errors
+
+For more information about this error, try `rustc --explain E0308`.
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/try-block/try-block-bad-type.stderr b/src/test/ui/try-block/try-block-bad-type.stderr
index 202885e..df8e646 100644
--- a/src/test/ui/try-block/try-block-bad-type.stderr
+++ b/src/test/ui/try-block/try-block-bad-type.stderr
@@ -6,10 +6,10 @@
    |
    = help: the following implementations were found:
              <i32 as std::convert::From<bool>>
+             <i32 as std::convert::From<core::num::NonZeroI32>>
              <i32 as std::convert::From<i16>>
              <i32 as std::convert::From<i8>>
-             <i32 as std::convert::From<u16>>
-             <i32 as std::convert::From<u8>>
+           and 2 others
    = note: required by `std::convert::From::from`
 
 error[E0271]: type mismatch resolving `<std::result::Result<i32, i32> as std::ops::Try>::Ok == &str`
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/unboxed-closures/unboxed-closure-sugar-used-on-struct-1.rs b/src/test/ui/unboxed-closures/unboxed-closure-sugar-used-on-struct-1.rs
index 5387dcb..c96a6fa 100644
--- a/src/test/ui/unboxed-closures/unboxed-closure-sugar-used-on-struct-1.rs
+++ b/src/test/ui/unboxed-closures/unboxed-closure-sugar-used-on-struct-1.rs
@@ -6,7 +6,8 @@
 
 fn bar() {
     let x: Box<Bar()> = panic!();
-    //~^ ERROR parenthesized parameters may only be used with a trait
+    //~^ ERROR parenthesized type parameters may only be used with a `Fn` trait
+    //~| ERROR wrong number of type arguments: expected 1, found 0
 }
 
 fn main() { }
diff --git a/src/test/ui/unboxed-closures/unboxed-closure-sugar-used-on-struct-1.stderr b/src/test/ui/unboxed-closures/unboxed-closure-sugar-used-on-struct-1.stderr
index 3f1b37c..fa52e66 100644
--- a/src/test/ui/unboxed-closures/unboxed-closure-sugar-used-on-struct-1.stderr
+++ b/src/test/ui/unboxed-closures/unboxed-closure-sugar-used-on-struct-1.stderr
@@ -1,9 +1,16 @@
-error[E0214]: parenthesized parameters may only be used with a trait
+error[E0214]: parenthesized type parameters may only be used with a `Fn` trait
   --> $DIR/unboxed-closure-sugar-used-on-struct-1.rs:8:19
    |
 LL |     let x: Box<Bar()> = panic!();
-   |                   ^^ only traits may use parentheses
+   |                   ^^ only `Fn` traits may use parentheses
 
-error: aborting due to previous error
+error[E0107]: wrong number of type arguments: expected 1, found 0
+  --> $DIR/unboxed-closure-sugar-used-on-struct-1.rs:8:16
+   |
+LL |     let x: Box<Bar()> = panic!();
+   |                ^^^^^ expected 1 type argument
 
-For more information about this error, try `rustc --explain E0214`.
+error: aborting due to 2 previous errors
+
+Some errors occurred: E0107, E0214.
+For more information about an error, try `rustc --explain E0107`.
diff --git a/src/test/ui/unboxed-closures/unboxed-closure-sugar-used-on-struct-3.rs b/src/test/ui/unboxed-closures/unboxed-closure-sugar-used-on-struct-3.rs
index 3cada32..79ced1e 100644
--- a/src/test/ui/unboxed-closures/unboxed-closure-sugar-used-on-struct-3.rs
+++ b/src/test/ui/unboxed-closures/unboxed-closure-sugar-used-on-struct-3.rs
@@ -12,7 +12,7 @@
     let b = Bar::<isize, usize>::new(); // OK
 
     let b = Bar::(isize, usize)::new(); // OK too (for the parser)
-    //~^ ERROR parenthesized parameters may only be used with a trait
+    //~^ ERROR parenthesized type parameters may only be used with a `Fn` trait
 }
 
 fn main() {}
diff --git a/src/test/ui/unboxed-closures/unboxed-closure-sugar-used-on-struct-3.stderr b/src/test/ui/unboxed-closures/unboxed-closure-sugar-used-on-struct-3.stderr
index 395f659..7d05ca5 100644
--- a/src/test/ui/unboxed-closures/unboxed-closure-sugar-used-on-struct-3.stderr
+++ b/src/test/ui/unboxed-closures/unboxed-closure-sugar-used-on-struct-3.stderr
@@ -1,8 +1,11 @@
-error[E0214]: parenthesized parameters may only be used with a trait
-  --> $DIR/unboxed-closure-sugar-used-on-struct-3.rs:14:16
+error[E0214]: parenthesized type parameters may only be used with a `Fn` trait
+  --> $DIR/unboxed-closure-sugar-used-on-struct-3.rs:14:18
    |
 LL |     let b = Bar::(isize, usize)::new(); // OK too (for the parser)
-   |                ^^^^^^^^^^^^^^^^ only traits may use parentheses
+   |                  ^^^^^^^^^^^^^^
+   |                  |
+   |                  only `Fn` traits may use parentheses
+   |                  help: use angle brackets instead: `<isize, usize>`
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/unboxed-closures/unboxed-closure-sugar-used-on-struct.rs b/src/test/ui/unboxed-closures/unboxed-closure-sugar-used-on-struct.rs
index e795650..1af7f55 100644
--- a/src/test/ui/unboxed-closures/unboxed-closure-sugar-used-on-struct.rs
+++ b/src/test/ui/unboxed-closures/unboxed-closure-sugar-used-on-struct.rs
@@ -5,8 +5,8 @@
 }
 
 fn foo(b: Box<Bar()>) {
-    //~^ ERROR parenthesized parameters may only be used with a trait
-    //~| ERROR the type placeholder `_` is not allowed within types on item signatures
+    //~^ ERROR parenthesized type parameters may only be used with a `Fn` trait
+    //~| ERROR wrong number of type arguments: expected 1, found 0
 }
 
 fn main() { }
diff --git a/src/test/ui/unboxed-closures/unboxed-closure-sugar-used-on-struct.stderr b/src/test/ui/unboxed-closures/unboxed-closure-sugar-used-on-struct.stderr
index d026709..b342379 100644
--- a/src/test/ui/unboxed-closures/unboxed-closure-sugar-used-on-struct.stderr
+++ b/src/test/ui/unboxed-closures/unboxed-closure-sugar-used-on-struct.stderr
@@ -1,16 +1,16 @@
-error[E0214]: parenthesized parameters may only be used with a trait
+error[E0214]: parenthesized type parameters may only be used with a `Fn` trait
   --> $DIR/unboxed-closure-sugar-used-on-struct.rs:7:18
    |
 LL | fn foo(b: Box<Bar()>) {
-   |                  ^^ only traits may use parentheses
+   |                  ^^ only `Fn` traits may use parentheses
 
-error[E0121]: the type placeholder `_` is not allowed within types on item signatures
+error[E0107]: wrong number of type arguments: expected 1, found 0
   --> $DIR/unboxed-closure-sugar-used-on-struct.rs:7:15
    |
 LL | fn foo(b: Box<Bar()>) {
-   |               ^^^^^ not allowed in type signatures
+   |               ^^^^^ expected 1 type argument
 
 error: aborting due to 2 previous errors
 
-Some errors occurred: E0121, E0214.
-For more information about an error, try `rustc --explain E0121`.
+Some errors occurred: E0107, E0214.
+For more information about an error, try `rustc --explain E0107`.
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 2b4a5f1..907c0fe 160000
--- a/src/tools/cargo
+++ b/src/tools/cargo
@@ -1 +1 @@
-Subproject commit 2b4a5f1f0bb6e13759e88ea9512527b0beba154f
+Subproject commit 907c0febe7045fa02dff2a35c5e36d3bd59ea50d
diff --git a/src/tools/clippy b/src/tools/clippy
index 1b89724..1838bfe 160000
--- a/src/tools/clippy
+++ b/src/tools/clippy
@@ -1 +1 @@
-Subproject commit 1b89724b4889aef631b40d52c0943bdc28e04d1d
+Subproject commit 1838bfe5a9ff951ffd716e4632156113d95d14a4
diff --git a/src/tools/miri b/src/tools/miri
index 97f4cff..1cd85d2 160000
--- a/src/tools/miri
+++ b/src/tools/miri
@@ -1 +1 @@
-Subproject commit 97f4cff8e904c268569d37922a27835209deff5d
+Subproject commit 1cd85d2a2767b37f9869b719a74e3da99087c31a
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 2435a0cf..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 -