about summary refs log tree commit diff
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/assembly/targets/targets-elf.rs633
-rw-r--r--tests/assembly/targets/targets-nvptx.rs21
-rw-r--r--tests/assembly/targets/targets-pe.rs93
-rw-r--r--tests/mir-opt/const_prop/array_index.main.GVN.32bit.panic-abort.diff7
-rw-r--r--tests/mir-opt/const_prop/array_index.main.GVN.32bit.panic-unwind.diff7
-rw-r--r--tests/mir-opt/const_prop/array_index.main.GVN.64bit.panic-abort.diff7
-rw-r--r--tests/mir-opt/const_prop/array_index.main.GVN.64bit.panic-unwind.diff7
-rw-r--r--tests/mir-opt/const_prop/boolean_identities.rs7
-rw-r--r--tests/mir-opt/const_prop/boolean_identities.test.GVN.diff12
-rw-r--r--tests/mir-opt/const_prop/boxes.main.GVN.panic-abort.diff9
-rw-r--r--tests/mir-opt/const_prop/boxes.main.GVN.panic-unwind.diff9
-rw-r--r--tests/mir-opt/const_prop/boxes.rs2
-rw-r--r--tests/mir-opt/const_prop/large_array_index.main.GVN.32bit.panic-abort.diff7
-rw-r--r--tests/mir-opt/const_prop/large_array_index.main.GVN.32bit.panic-unwind.diff7
-rw-r--r--tests/mir-opt/const_prop/large_array_index.main.GVN.64bit.panic-abort.diff7
-rw-r--r--tests/mir-opt/const_prop/large_array_index.main.GVN.64bit.panic-unwind.diff7
-rw-r--r--tests/mir-opt/const_prop/mult_by_zero.rs3
-rw-r--r--tests/mir-opt/const_prop/mult_by_zero.test.GVN.diff2
-rw-r--r--tests/mir-opt/const_prop/repeat.main.GVN.32bit.panic-abort.diff7
-rw-r--r--tests/mir-opt/const_prop/repeat.main.GVN.32bit.panic-unwind.diff7
-rw-r--r--tests/mir-opt/const_prop/repeat.main.GVN.64bit.panic-abort.diff7
-rw-r--r--tests/mir-opt/const_prop/repeat.main.GVN.64bit.panic-unwind.diff7
-rw-r--r--tests/mir-opt/gvn.arithmetic.GVN.panic-abort.diff357
-rw-r--r--tests/mir-opt/gvn.arithmetic.GVN.panic-unwind.diff357
-rw-r--r--tests/mir-opt/gvn.arithmetic_checked.GVN.panic-abort.diff101
-rw-r--r--tests/mir-opt/gvn.arithmetic_checked.GVN.panic-unwind.diff101
-rw-r--r--tests/mir-opt/gvn.comparison.GVN.panic-abort.diff10
-rw-r--r--tests/mir-opt/gvn.comparison.GVN.panic-unwind.diff10
-rw-r--r--tests/mir-opt/gvn.fn_pointers.GVN.panic-abort.diff18
-rw-r--r--tests/mir-opt/gvn.fn_pointers.GVN.panic-unwind.diff18
-rw-r--r--tests/mir-opt/gvn.repeated_index.GVN.panic-abort.diff13
-rw-r--r--tests/mir-opt/gvn.repeated_index.GVN.panic-unwind.diff13
-rw-r--r--tests/mir-opt/gvn.rs128
-rw-r--r--tests/mir-opt/gvn.unary.GVN.panic-abort.diff153
-rw-r--r--tests/mir-opt/gvn.unary.GVN.panic-unwind.diff153
-rw-r--r--tests/mir-opt/gvn.wide_ptr_ops.GVN.panic-abort.diff386
-rw-r--r--tests/mir-opt/gvn.wide_ptr_ops.GVN.panic-unwind.diff386
-rw-r--r--tests/mir-opt/issue_101973.inner.GVN.panic-abort.diff17
-rw-r--r--tests/mir-opt/issue_101973.inner.GVN.panic-unwind.diff17
-rw-r--r--tests/ui/borrowck/fn-item-check-trait-ref.rs15
-rw-r--r--tests/ui/borrowck/fn-item-check-trait-ref.stderr12
-rw-r--r--tests/ui/borrowck/fn-item-check-type-params.rs57
-rw-r--r--tests/ui/borrowck/fn-item-check-type-params.stderr43
-rw-r--r--tests/ui/check-cfg/cargo-feature.none.stderr20
-rw-r--r--tests/ui/check-cfg/cargo-feature.rs9
-rw-r--r--tests/ui/check-cfg/cargo-feature.some.stderr7
-rw-r--r--tests/ui/check-cfg/concat-values.rs4
-rw-r--r--tests/ui/check-cfg/concat-values.stderr4
-rw-r--r--tests/ui/check-cfg/empty-values.rs14
-rw-r--r--tests/ui/check-cfg/empty-values.stderr23
-rw-r--r--tests/ui/consts/const-eval/infinite_loop.rs10
-rw-r--r--tests/ui/consts/const-eval/infinite_loop.stderr6
-rw-r--r--tests/ui/feature-gates/feature-gate-proc_macro_c_str_literals.rs11
-rw-r--r--tests/ui/feature-gates/feature-gate-proc_macro_c_str_literals.stderr13
-rw-r--r--tests/ui/higher-ranked/trait-bounds/issue-59311.rs1
-rw-r--r--tests/ui/higher-ranked/trait-bounds/issue-59311.stderr11
-rw-r--r--tests/ui/implied-bounds/implied-bounds-on-trait-hierarchy-1.rs (renamed from tests/ui/implied-bounds/implied-bounds-on-trait-hierarchy.rs)9
-rw-r--r--tests/ui/implied-bounds/implied-bounds-on-trait-hierarchy-1.stderr16
-rw-r--r--tests/ui/implied-bounds/implied-bounds-on-trait-hierarchy-2.rs45
-rw-r--r--tests/ui/lifetimes/lifetime-errors/issue_74400.rs2
-rw-r--r--tests/ui/lifetimes/lifetime-errors/issue_74400.stderr32
-rw-r--r--tests/ui/proc-macro/auxiliary/api/mod.rs2
-rw-r--r--tests/ui/proc-macro/auxiliary/api/parse.rs7
-rw-r--r--tests/ui/proc-macro/test.rs1
-rw-r--r--tests/ui/type-alias-impl-trait/closure_infer.rs35
-rw-r--r--tests/ui/type-alias-impl-trait/issue-77179.rs5
-rw-r--r--tests/ui/type-alias-impl-trait/issue-77179.stderr11
-rw-r--r--tests/ui/type-alias-impl-trait/wf-nested.fail.stderr2
-rw-r--r--tests/ui/type-alias-impl-trait/wf-nested.pass_sound.stderr17
-rw-r--r--tests/ui/type-alias-impl-trait/wf-nested.rs4
-rw-r--r--tests/ui/wf/wf-associated-const.rs41
-rw-r--r--tests/ui/wf/wf-associated-const.stderr38
-rw-r--r--tests/ui/wf/wf-in-fn-type-implicit.rs37
-rw-r--r--tests/ui/wf/wf-static-method.rs13
-rw-r--r--tests/ui/wf/wf-static-method.stderr47
75 files changed, 3132 insertions, 605 deletions
diff --git a/tests/assembly/targets/targets-elf.rs b/tests/assembly/targets/targets-elf.rs
new file mode 100644
index 00000000000..72a35f38eca
--- /dev/null
+++ b/tests/assembly/targets/targets-elf.rs
@@ -0,0 +1,633 @@
+// assembly-output: emit-asm
+// ignore-tidy-linelength
+// revisions: aarch64_apple_darwin
+// [aarch64_apple_darwin] compile-flags: --target aarch64-apple-darwin
+// [aarch64_apple_darwin] needs-llvm-components: aarch64
+// revisions: aarch64_apple_ios
+// [aarch64_apple_ios] compile-flags: --target aarch64-apple-ios
+// [aarch64_apple_ios] needs-llvm-components: aarch64
+// revisions: aarch64_apple_ios_macabi
+// [aarch64_apple_ios_macabi] compile-flags: --target aarch64-apple-ios-macabi
+// [aarch64_apple_ios_macabi] needs-llvm-components: aarch64
+// revisions: aarch64_apple_ios_sim
+// [aarch64_apple_ios_sim] compile-flags: --target aarch64-apple-ios-sim
+// [aarch64_apple_ios_sim] needs-llvm-components: aarch64
+// revisions: aarch64_apple_tvos
+// [aarch64_apple_tvos] compile-flags: --target aarch64-apple-tvos
+// [aarch64_apple_tvos] needs-llvm-components: aarch64
+// revisions: aarch64_apple_tvos_sim
+// [aarch64_apple_tvos_sim] compile-flags: --target aarch64-apple-tvos-sim
+// [aarch64_apple_tvos_sim] needs-llvm-components: aarch64
+// revisions: aarch64_apple_watchos
+// [aarch64_apple_watchos] compile-flags: --target aarch64-apple-watchos
+// [aarch64_apple_watchos] needs-llvm-components: aarch64
+// revisions: aarch64_apple_watchos_sim
+// [aarch64_apple_watchos_sim] compile-flags: --target aarch64-apple-watchos-sim
+// [aarch64_apple_watchos_sim] needs-llvm-components: aarch64
+// revisions: aarch64_be_unknown_linux_gnu
+// [aarch64_be_unknown_linux_gnu] compile-flags: --target aarch64_be-unknown-linux-gnu
+// [aarch64_be_unknown_linux_gnu] needs-llvm-components: aarch64
+// revisions: aarch64_be_unknown_linux_gnu_ilp32
+// [aarch64_be_unknown_linux_gnu_ilp32] compile-flags: --target aarch64_be-unknown-linux-gnu_ilp32
+// [aarch64_be_unknown_linux_gnu_ilp32] needs-llvm-components: aarch64
+// revisions: aarch64_be_unknown_netbsd
+// [aarch64_be_unknown_netbsd] compile-flags: --target aarch64_be-unknown-netbsd
+// [aarch64_be_unknown_netbsd] needs-llvm-components: aarch64
+// revisions: aarch64_fuchsia
+// [aarch64_fuchsia] compile-flags: --target aarch64-fuchsia
+// [aarch64_fuchsia] needs-llvm-components: aarch64
+// revisions: aarch64_kmc_solid_asp3
+// [aarch64_kmc_solid_asp3] compile-flags: --target aarch64-kmc-solid_asp3
+// [aarch64_kmc_solid_asp3] needs-llvm-components: aarch64
+// revisions: aarch64_linux_android
+// [aarch64_linux_android] compile-flags: --target aarch64-linux-android
+// [aarch64_linux_android] needs-llvm-components: aarch64
+// revisions: aarch64_nintendo_switch_freestanding
+// [aarch64_nintendo_switch_freestanding] compile-flags: --target aarch64-nintendo-switch-freestanding
+// [aarch64_nintendo_switch_freestanding] needs-llvm-components: aarch64
+// revisions: aarch64_unknown_freebsd
+// [aarch64_unknown_freebsd] compile-flags: --target aarch64-unknown-freebsd
+// [aarch64_unknown_freebsd] needs-llvm-components: aarch64
+// revisions: aarch64_unknown_fuchsia
+// [aarch64_unknown_fuchsia] compile-flags: --target aarch64-unknown-fuchsia
+// [aarch64_unknown_fuchsia] needs-llvm-components: aarch64
+// revisions: aarch64_unknown_hermit
+// [aarch64_unknown_hermit] compile-flags: --target aarch64-unknown-hermit
+// [aarch64_unknown_hermit] needs-llvm-components: aarch64
+// revisions: aarch64_unknown_illumos
+// [aarch64_unknown_illumos] compile-flags: --target aarch64-unknown-illumos
+// [aarch64_unknown_illumos] needs-llvm-components: aarch64
+// revisions: aarch64_unknown_linux_gnu
+// [aarch64_unknown_linux_gnu] compile-flags: --target aarch64-unknown-linux-gnu
+// [aarch64_unknown_linux_gnu] needs-llvm-components: aarch64
+// revisions: aarch64_unknown_linux_gnu_ilp32
+// [aarch64_unknown_linux_gnu_ilp32] compile-flags: --target aarch64-unknown-linux-gnu_ilp32
+// [aarch64_unknown_linux_gnu_ilp32] needs-llvm-components: aarch64
+// revisions: aarch64_unknown_linux_musl
+// [aarch64_unknown_linux_musl] compile-flags: --target aarch64-unknown-linux-musl
+// [aarch64_unknown_linux_musl] needs-llvm-components: aarch64
+// revisions: aarch64_unknown_linux_ohos
+// [aarch64_unknown_linux_ohos] compile-flags: --target aarch64-unknown-linux-ohos
+// [aarch64_unknown_linux_ohos] needs-llvm-components: aarch64
+// revisions: aarch64_unknown_netbsd
+// [aarch64_unknown_netbsd] compile-flags: --target aarch64-unknown-netbsd
+// [aarch64_unknown_netbsd] needs-llvm-components: aarch64
+// revisions: aarch64_unknown_none
+// [aarch64_unknown_none] compile-flags: --target aarch64-unknown-none
+// [aarch64_unknown_none] needs-llvm-components: aarch64
+// revisions: aarch64_unknown_none_softfloat
+// [aarch64_unknown_none_softfloat] compile-flags: --target aarch64-unknown-none-softfloat
+// [aarch64_unknown_none_softfloat] needs-llvm-components: aarch64
+// revisions: aarch64_unknown_nto_qnx_710
+// [aarch64_unknown_nto_qnx_710] compile-flags: --target aarch64-unknown-nto-qnx710
+// [aarch64_unknown_nto_qnx_710] needs-llvm-components: aarch64
+// revisions: aarch64_unknown_openbsd
+// [aarch64_unknown_openbsd] compile-flags: --target aarch64-unknown-openbsd
+// [aarch64_unknown_openbsd] needs-llvm-components: aarch64
+// revisions: aarch64_unknown_redox
+// [aarch64_unknown_redox] compile-flags: --target aarch64-unknown-redox
+// [aarch64_unknown_redox] needs-llvm-components: aarch64
+// revisions: aarch64_unknown_teeos
+// [aarch64_unknown_teeos] compile-flags: --target aarch64-unknown-teeos
+// [aarch64_unknown_teeos] needs-llvm-components: aarch64
+// revisions: aarch64_wrs_vxworks
+// [aarch64_wrs_vxworks] compile-flags: --target aarch64-wrs-vxworks
+// [aarch64_wrs_vxworks] needs-llvm-components: aarch64
+// revisions: arm64_32_apple_watchos
+// [arm64_32_apple_watchos] compile-flags: --target arm64_32-apple-watchos
+// [arm64_32_apple_watchos] needs-llvm-components: aarch64
+// revisions: arm64e_apple_darwin
+// [arm64e_apple_darwin] compile-flags: --target arm64e-apple-darwin
+// [arm64e_apple_darwin] needs-llvm-components: aarch64
+// revisions: arm64e_apple_ios
+// [arm64e_apple_ios] compile-flags: --target arm64e-apple-ios
+// [arm64e_apple_ios] needs-llvm-components: aarch64
+// revisions: arm_linux_androideabi
+// [arm_linux_androideabi] compile-flags: --target arm-linux-androideabi
+// [arm_linux_androideabi] needs-llvm-components: arm
+// revisions: arm_unknown_linux_gnueabi
+// [arm_unknown_linux_gnueabi] compile-flags: --target arm-unknown-linux-gnueabi
+// [arm_unknown_linux_gnueabi] needs-llvm-components: arm
+// revisions: arm_unknown_linux_gnueabihf
+// [arm_unknown_linux_gnueabihf] compile-flags: --target arm-unknown-linux-gnueabihf
+// [arm_unknown_linux_gnueabihf] needs-llvm-components: arm
+// revisions: arm_unknown_linux_musleabi
+// [arm_unknown_linux_musleabi] compile-flags: --target arm-unknown-linux-musleabi
+// [arm_unknown_linux_musleabi] needs-llvm-components: arm
+// revisions: arm_unknown_linux_musleabihf
+// [arm_unknown_linux_musleabihf] compile-flags: --target arm-unknown-linux-musleabihf
+// [arm_unknown_linux_musleabihf] needs-llvm-components: arm
+// revisions: armeb_unknown_linux_gnueabi
+// [armeb_unknown_linux_gnueabi] compile-flags: --target armeb-unknown-linux-gnueabi
+// [armeb_unknown_linux_gnueabi] needs-llvm-components: arm
+// revisions: armebv7r_none_eabi
+// [armebv7r_none_eabi] compile-flags: --target armebv7r-none-eabi
+// [armebv7r_none_eabi] needs-llvm-components: arm
+// revisions: armebv7r_none_eabihf
+// [armebv7r_none_eabihf] compile-flags: --target armebv7r-none-eabihf
+// [armebv7r_none_eabihf] needs-llvm-components: arm
+// revisions: armv4t_none_eabi
+// [armv4t_none_eabi] compile-flags: --target armv4t-none-eabi
+// [armv4t_none_eabi] needs-llvm-components: arm
+// revisions: armv4t_unknown_linux_gnueabi
+// [armv4t_unknown_linux_gnueabi] compile-flags: --target armv4t-unknown-linux-gnueabi
+// [armv4t_unknown_linux_gnueabi] needs-llvm-components: arm
+// revisions: armv5te_none_eabi
+// [armv5te_none_eabi] compile-flags: --target armv5te-none-eabi
+// [armv5te_none_eabi] needs-llvm-components: arm
+// revisions: armv5te_unknown_linux_gnueabi
+// [armv5te_unknown_linux_gnueabi] compile-flags: --target armv5te-unknown-linux-gnueabi
+// [armv5te_unknown_linux_gnueabi] needs-llvm-components: arm
+// revisions: armv5te_unknown_linux_musleabi
+// [armv5te_unknown_linux_musleabi] compile-flags: --target armv5te-unknown-linux-musleabi
+// [armv5te_unknown_linux_musleabi] needs-llvm-components: arm
+// revisions: armv5te_unknown_linux_uclibceabi
+// [armv5te_unknown_linux_uclibceabi] compile-flags: --target armv5te-unknown-linux-uclibceabi
+// [armv5te_unknown_linux_uclibceabi] needs-llvm-components: arm
+// revisions: armv6_unknown_freebsd
+// [armv6_unknown_freebsd] compile-flags: --target armv6-unknown-freebsd
+// [armv6_unknown_freebsd] needs-llvm-components: arm
+// revisions: armv6_unknown_netbsd_eabihf
+// [armv6_unknown_netbsd_eabihf] compile-flags: --target armv6-unknown-netbsd-eabihf
+// [armv6_unknown_netbsd_eabihf] needs-llvm-components: arm
+// revisions: armv6k_nintendo_3ds
+// [armv6k_nintendo_3ds] compile-flags: --target armv6k-nintendo-3ds
+// [armv6k_nintendo_3ds] needs-llvm-components: arm
+// revisions: armv7_linux_androideabi
+// [armv7_linux_androideabi] compile-flags: --target armv7-linux-androideabi
+// [armv7_linux_androideabi] needs-llvm-components: arm
+// revisions: armv7_sony_vita_newlibeabihf
+// [armv7_sony_vita_newlibeabihf] compile-flags: --target armv7-sony-vita-newlibeabihf
+// [armv7_sony_vita_newlibeabihf] needs-llvm-components: arm
+// revisions: armv7_unknown_freebsd
+// [armv7_unknown_freebsd] compile-flags: --target armv7-unknown-freebsd
+// [armv7_unknown_freebsd] needs-llvm-components: arm
+// revisions: armv7_unknown_linux_gnueabi
+// [armv7_unknown_linux_gnueabi] compile-flags: --target armv7-unknown-linux-gnueabi
+// [armv7_unknown_linux_gnueabi] needs-llvm-components: arm
+// revisions: armv7_unknown_linux_gnueabihf
+// [armv7_unknown_linux_gnueabihf] compile-flags: --target armv7-unknown-linux-gnueabihf
+// [armv7_unknown_linux_gnueabihf] needs-llvm-components: arm
+// revisions: armv7_unknown_linux_musleabi
+// [armv7_unknown_linux_musleabi] compile-flags: --target armv7-unknown-linux-musleabi
+// [armv7_unknown_linux_musleabi] needs-llvm-components: arm
+// revisions: armv7_unknown_linux_musleabihf
+// [armv7_unknown_linux_musleabihf] compile-flags: --target armv7-unknown-linux-musleabihf
+// [armv7_unknown_linux_musleabihf] needs-llvm-components: arm
+// revisions: armv7_unknown_linux_ohos
+// [armv7_unknown_linux_ohos] compile-flags: --target armv7-unknown-linux-ohos
+// [armv7_unknown_linux_ohos] needs-llvm-components: arm
+// revisions: armv7_unknown_linux_uclibceabi
+// [armv7_unknown_linux_uclibceabi] compile-flags: --target armv7-unknown-linux-uclibceabi
+// [armv7_unknown_linux_uclibceabi] needs-llvm-components: arm
+// revisions: armv7_unknown_linux_uclibceabihf
+// [armv7_unknown_linux_uclibceabihf] compile-flags: --target armv7-unknown-linux-uclibceabihf
+// [armv7_unknown_linux_uclibceabihf] needs-llvm-components: arm
+// revisions: armv7_unknown_netbsd_eabihf
+// [armv7_unknown_netbsd_eabihf] compile-flags: --target armv7-unknown-netbsd-eabihf
+// [armv7_unknown_netbsd_eabihf] needs-llvm-components: arm
+// revisions: armv7_wrs_vxworks_eabihf
+// [armv7_wrs_vxworks_eabihf] compile-flags: --target armv7-wrs-vxworks-eabihf
+// [armv7_wrs_vxworks_eabihf] needs-llvm-components: arm
+// revisions: armv7a_kmc_solid_asp3_eabi
+// [armv7a_kmc_solid_asp3_eabi] compile-flags: --target armv7a-kmc-solid_asp3-eabi
+// [armv7a_kmc_solid_asp3_eabi] needs-llvm-components: arm
+// revisions: armv7a_kmc_solid_asp3_eabihf
+// [armv7a_kmc_solid_asp3_eabihf] compile-flags: --target armv7a-kmc-solid_asp3-eabihf
+// [armv7a_kmc_solid_asp3_eabihf] needs-llvm-components: arm
+// revisions: armv7a_none_eabi
+// [armv7a_none_eabi] compile-flags: --target armv7a-none-eabi
+// [armv7a_none_eabi] needs-llvm-components: arm
+// revisions: armv7a_none_eabihf
+// [armv7a_none_eabihf] compile-flags: --target armv7a-none-eabihf
+// [armv7a_none_eabihf] needs-llvm-components: arm
+// revisions: armv7k_apple_watchos
+// [armv7k_apple_watchos] compile-flags: --target armv7k-apple-watchos
+// [armv7k_apple_watchos] needs-llvm-components: arm
+// revisions: armv7r_none_eabi
+// [armv7r_none_eabi] compile-flags: --target armv7r-none-eabi
+// [armv7r_none_eabi] needs-llvm-components: arm
+// revisions: armv7r_none_eabihf
+// [armv7r_none_eabihf] compile-flags: --target armv7r-none-eabihf
+// [armv7r_none_eabihf] needs-llvm-components: arm
+// revisions: armv7s_apple_ios
+// [armv7s_apple_ios] compile-flags: --target armv7s-apple-ios
+// [armv7s_apple_ios] needs-llvm-components: arm
+// FIXME: disabled since it fails on CI saying the csky component is missing
+/*
+    revisions: csky_unknown_linux_gnuabiv2
+    [csky_unknown_linux_gnuabiv2] compile-flags: --target csky-unknown-linux-gnuabiv2
+    [csky_unknown_linux_gnuabiv2] needs-llvm-components: csky
+    revisions: csky_unknown_linux_gnuabiv2hf
+    [csky_unknown_linux_gnuabiv2hf] compile-flags: --target csky-unknown-linux-gnuabiv2hf
+    [csky_unknown_linux_gnuabiv2hf] needs-llvm-components: csky
+*/
+// revisions: hexagon_unknown_linux_musl
+// [hexagon_unknown_linux_musl] compile-flags: --target hexagon-unknown-linux-musl
+// [hexagon_unknown_linux_musl] needs-llvm-components: hexagon
+// revisions: hexagon_unknown_none_elf
+// [hexagon_unknown_none_elf] compile-flags: --target hexagon-unknown-none-elf
+// [hexagon_unknown_none_elf] needs-llvm-components: hexagon
+// revisions: i386_apple_ios
+// [i386_apple_ios] compile-flags: --target i386-apple-ios
+// [i386_apple_ios] needs-llvm-components: x86
+// revisions: i586_pc_nto_qnx700
+// [i586_pc_nto_qnx700] compile-flags: --target i586-pc-nto-qnx700
+// [i586_pc_nto_qnx700] needs-llvm-components: x86
+// revisions: i586_unknown_linux_gnu
+// [i586_unknown_linux_gnu] compile-flags: --target i586-unknown-linux-gnu
+// [i586_unknown_linux_gnu] needs-llvm-components: x86
+// revisions: i586_unknown_linux_musl
+// [i586_unknown_linux_musl] compile-flags: --target i586-unknown-linux-musl
+// [i586_unknown_linux_musl] needs-llvm-components: x86
+// revisions: i586_unknown_netbsd
+// [i586_unknown_netbsd] compile-flags: --target i586-unknown-netbsd
+// [i586_unknown_netbsd] needs-llvm-components: x86
+// revisions: i686_apple_darwin
+// [i686_apple_darwin] compile-flags: --target i686-apple-darwin
+// [i686_apple_darwin] needs-llvm-components: x86
+// revisions: i686_linux_android
+// [i686_linux_android] compile-flags: --target i686-linux-android
+// [i686_linux_android] needs-llvm-components: x86
+// revisions: i686_unknown_freebsd
+// [i686_unknown_freebsd] compile-flags: --target i686-unknown-freebsd
+// [i686_unknown_freebsd] needs-llvm-components: x86
+// revisions: i686_unknown_haiku
+// [i686_unknown_haiku] compile-flags: --target i686-unknown-haiku
+// [i686_unknown_haiku] needs-llvm-components: x86
+// revisions: i686_unknown_hurd_gnu
+// [i686_unknown_hurd_gnu] compile-flags: --target i686-unknown-hurd-gnu
+// [i686_unknown_hurd_gnu] needs-llvm-components: x86
+// revisions: i686_unknown_linux_gnu
+// [i686_unknown_linux_gnu] compile-flags: --target i686-unknown-linux-gnu
+// [i686_unknown_linux_gnu] needs-llvm-components: x86
+// revisions: i686_unknown_linux_musl
+// [i686_unknown_linux_musl] compile-flags: --target i686-unknown-linux-musl
+// [i686_unknown_linux_musl] needs-llvm-components: x86
+// revisions: i686_unknown_netbsd
+// [i686_unknown_netbsd] compile-flags: --target i686-unknown-netbsd
+// [i686_unknown_netbsd] needs-llvm-components: x86
+// revisions: i686_unknown_openbsd
+// [i686_unknown_openbsd] compile-flags: --target i686-unknown-openbsd
+// [i686_unknown_openbsd] needs-llvm-components: x86
+// revisions: i686_wrs_vxworks
+// [i686_wrs_vxworks] compile-flags: --target i686-wrs-vxworks
+// [i686_wrs_vxworks] needs-llvm-components: x86
+// revisions: loongarch64_unknown_linux_gnu
+// [loongarch64_unknown_linux_gnu] compile-flags: --target loongarch64-unknown-linux-gnu
+// [loongarch64_unknown_linux_gnu] needs-llvm-components: loongarch
+// revisions: loongarch64_unknown_none
+// [loongarch64_unknown_none] compile-flags: --target loongarch64-unknown-none
+// [loongarch64_unknown_none] needs-llvm-components: loongarch
+// revisions: loongarch64_unknown_none_softfloat
+// [loongarch64_unknown_none_softfloat] compile-flags: --target loongarch64-unknown-none-softfloat
+// [loongarch64_unknown_none_softfloat] needs-llvm-components: loongarch
+// revisions: m68k_unknown_linux_gnu
+// [m68k_unknown_linux_gnu] compile-flags: --target m68k-unknown-linux-gnu
+// [m68k_unknown_linux_gnu] needs-llvm-components: m68k
+// revisions: mips64_openwrt_linux_musl
+// [mips64_openwrt_linux_musl] compile-flags: --target mips64-openwrt-linux-musl
+// [mips64_openwrt_linux_musl] needs-llvm-components: mips
+// revisions: mips64_unknown_linux_gnuabi64
+// [mips64_unknown_linux_gnuabi64] compile-flags: --target mips64-unknown-linux-gnuabi64
+// [mips64_unknown_linux_gnuabi64] needs-llvm-components: mips
+// revisions: mips64_unknown_linux_muslabi64
+// [mips64_unknown_linux_muslabi64] compile-flags: --target mips64-unknown-linux-muslabi64
+// [mips64_unknown_linux_muslabi64] needs-llvm-components: mips
+// revisions: mips64el_unknown_linux_gnuabi64
+// [mips64el_unknown_linux_gnuabi64] compile-flags: --target mips64el-unknown-linux-gnuabi64
+// [mips64el_unknown_linux_gnuabi64] needs-llvm-components: mips
+// revisions: mips64el_unknown_linux_muslabi64
+// [mips64el_unknown_linux_muslabi64] compile-flags: --target mips64el-unknown-linux-muslabi64
+// [mips64el_unknown_linux_muslabi64] needs-llvm-components: mips
+// revisions: mips_unknown_linux_gnu
+// [mips_unknown_linux_gnu] compile-flags: --target mips-unknown-linux-gnu
+// [mips_unknown_linux_gnu] needs-llvm-components: mips
+// revisions: mips_unknown_linux_musl
+// [mips_unknown_linux_musl] compile-flags: --target mips-unknown-linux-musl
+// [mips_unknown_linux_musl] needs-llvm-components: mips
+// revisions: mips_unknown_linux_uclibc
+// [mips_unknown_linux_uclibc] compile-flags: --target mips-unknown-linux-uclibc
+// [mips_unknown_linux_uclibc] needs-llvm-components: mips
+// revisions: mipsel_sony_psp
+// [mipsel_sony_psp] compile-flags: --target mipsel-sony-psp
+// [mipsel_sony_psp] needs-llvm-components: mips
+// revisions: mipsel_sony_psx
+// [mipsel_sony_psx] compile-flags: --target mipsel-sony-psx
+// [mipsel_sony_psx] needs-llvm-components: mips
+// revisions: mipsel_unknown_linux_gnu
+// [mipsel_unknown_linux_gnu] compile-flags: --target mipsel-unknown-linux-gnu
+// [mipsel_unknown_linux_gnu] needs-llvm-components: mips
+// revisions: mipsel_unknown_linux_musl
+// [mipsel_unknown_linux_musl] compile-flags: --target mipsel-unknown-linux-musl
+// [mipsel_unknown_linux_musl] needs-llvm-components: mips
+// revisions: mipsel_unknown_linux_uclibc
+// [mipsel_unknown_linux_uclibc] compile-flags: --target mipsel-unknown-linux-uclibc
+// [mipsel_unknown_linux_uclibc] needs-llvm-components: mips
+// revisions: mipsel_unknown_netbsd
+// [mipsel_unknown_netbsd] compile-flags: --target mipsel-unknown-netbsd
+// [mipsel_unknown_netbsd] needs-llvm-components: mips
+// revisions: mipsel_unknown_none
+// [mipsel_unknown_none] compile-flags: --target mipsel-unknown-none
+// [mipsel_unknown_none] needs-llvm-components: mips
+// revisions: mipsisa32r6_unknown_linux_gnu
+// [mipsisa32r6_unknown_linux_gnu] compile-flags: --target mipsisa32r6-unknown-linux-gnu
+// [mipsisa32r6_unknown_linux_gnu] needs-llvm-components: mips
+// revisions: mipsisa32r6el_unknown_linux_gnu
+// [mipsisa32r6el_unknown_linux_gnu] compile-flags: --target mipsisa32r6el-unknown-linux-gnu
+// [mipsisa32r6el_unknown_linux_gnu] needs-llvm-components: mips
+// revisions: mipsisa64r6_unknown_linux_gnuabi64
+// [mipsisa64r6_unknown_linux_gnuabi64] compile-flags: --target mipsisa64r6-unknown-linux-gnuabi64
+// [mipsisa64r6_unknown_linux_gnuabi64] needs-llvm-components: mips
+// revisions: mipsisa64r6el_unknown_linux_gnuabi64
+// [mipsisa64r6el_unknown_linux_gnuabi64] compile-flags: --target mipsisa64r6el-unknown-linux-gnuabi64
+// [mipsisa64r6el_unknown_linux_gnuabi64] needs-llvm-components: mips
+// revisions: msp430_none_elf
+// [msp430_none_elf] compile-flags: --target msp430-none-elf
+// [msp430_none_elf] needs-llvm-components: msp430
+// revisions: powerpc64_unknown_freebsd
+// [powerpc64_unknown_freebsd] compile-flags: --target powerpc64-unknown-freebsd
+// [powerpc64_unknown_freebsd] needs-llvm-components: powerpc
+// revisions: powerpc64_unknown_linux_gnu
+// [powerpc64_unknown_linux_gnu] compile-flags: --target powerpc64-unknown-linux-gnu
+// [powerpc64_unknown_linux_gnu] needs-llvm-components: powerpc
+// revisions: powerpc64_unknown_linux_musl
+// [powerpc64_unknown_linux_musl] compile-flags: --target powerpc64-unknown-linux-musl
+// [powerpc64_unknown_linux_musl] needs-llvm-components: powerpc
+// revisions: powerpc64_unknown_openbsd
+// [powerpc64_unknown_openbsd] compile-flags: --target powerpc64-unknown-openbsd
+// [powerpc64_unknown_openbsd] needs-llvm-components: powerpc
+// revisions: powerpc64_wrs_vxworks
+// [powerpc64_wrs_vxworks] compile-flags: --target powerpc64-wrs-vxworks
+// [powerpc64_wrs_vxworks] needs-llvm-components: powerpc
+// revisions: powerpc64le_unknown_freebsd
+// [powerpc64le_unknown_freebsd] compile-flags: --target powerpc64le-unknown-freebsd
+// [powerpc64le_unknown_freebsd] needs-llvm-components: powerpc
+// revisions: powerpc64le_unknown_linux_gnu
+// [powerpc64le_unknown_linux_gnu] compile-flags: --target powerpc64le-unknown-linux-gnu
+// [powerpc64le_unknown_linux_gnu] needs-llvm-components: powerpc
+// revisions: powerpc64le_unknown_linux_musl
+// [powerpc64le_unknown_linux_musl] compile-flags: --target powerpc64le-unknown-linux-musl
+// [powerpc64le_unknown_linux_musl] needs-llvm-components: powerpc
+// revisions: powerpc_unknown_freebsd
+// [powerpc_unknown_freebsd] compile-flags: --target powerpc-unknown-freebsd
+// [powerpc_unknown_freebsd] needs-llvm-components: powerpc
+// revisions: powerpc_unknown_linux_gnu
+// [powerpc_unknown_linux_gnu] compile-flags: --target powerpc-unknown-linux-gnu
+// [powerpc_unknown_linux_gnu] needs-llvm-components: powerpc
+// revisions: powerpc_unknown_linux_gnuspe
+// [powerpc_unknown_linux_gnuspe] compile-flags: --target powerpc-unknown-linux-gnuspe
+// [powerpc_unknown_linux_gnuspe] needs-llvm-components: powerpc
+// revisions: powerpc_unknown_linux_musl
+// [powerpc_unknown_linux_musl] compile-flags: --target powerpc-unknown-linux-musl
+// [powerpc_unknown_linux_musl] needs-llvm-components: powerpc
+// revisions: powerpc_unknown_netbsd
+// [powerpc_unknown_netbsd] compile-flags: --target powerpc-unknown-netbsd
+// [powerpc_unknown_netbsd] needs-llvm-components: powerpc
+// revisions: powerpc_unknown_openbsd
+// [powerpc_unknown_openbsd] compile-flags: --target powerpc-unknown-openbsd
+// [powerpc_unknown_openbsd] needs-llvm-components: powerpc
+// revisions: powerpc_wrs_vxworks
+// [powerpc_wrs_vxworks] compile-flags: --target powerpc-wrs-vxworks
+// [powerpc_wrs_vxworks] needs-llvm-components: powerpc
+// revisions: powerpc_wrs_vxworks_spe
+// [powerpc_wrs_vxworks_spe] compile-flags: --target powerpc-wrs-vxworks-spe
+// [powerpc_wrs_vxworks_spe] needs-llvm-components: powerpc
+// revisions: riscv32gc_unknown_linux_gnu
+// [riscv32gc_unknown_linux_gnu] compile-flags: --target riscv32gc-unknown-linux-gnu
+// [riscv32gc_unknown_linux_gnu] needs-llvm-components: riscv
+// revisions: riscv32gc_unknown_linux_musl
+// [riscv32gc_unknown_linux_musl] compile-flags: --target riscv32gc-unknown-linux-musl
+// [riscv32gc_unknown_linux_musl] needs-llvm-components: riscv
+// revisions: riscv32i_unknown_none_elf
+// [riscv32i_unknown_none_elf] compile-flags: --target riscv32i-unknown-none-elf
+// [riscv32i_unknown_none_elf] needs-llvm-components: riscv
+// revisions: riscv32im_unknown_none_elf
+// [riscv32im_unknown_none_elf] compile-flags: --target riscv32im-unknown-none-elf
+// [riscv32im_unknown_none_elf] needs-llvm-components: riscv
+// revisions: riscv32imac_esp_espidf
+// [riscv32imac_esp_espidf] compile-flags: --target riscv32imac-esp-espidf
+// [riscv32imac_esp_espidf] needs-llvm-components: riscv
+// revisions: riscv32imac_unknown_none_elf
+// [riscv32imac_unknown_none_elf] compile-flags: --target riscv32imac-unknown-none-elf
+// [riscv32imac_unknown_none_elf] needs-llvm-components: riscv
+// revisions: riscv32imac_unknown_xous_elf
+// [riscv32imac_unknown_xous_elf] compile-flags: --target riscv32imac-unknown-xous-elf
+// [riscv32imac_unknown_xous_elf] needs-llvm-components: riscv
+// revisions: riscv32imafc_unknown_none_elf
+// [riscv32imafc_unknown_none_elf] compile-flags: --target riscv32imafc-unknown-none-elf
+// [riscv32imafc_unknown_none_elf] needs-llvm-components: riscv
+// revisions: riscv32imafc_esp_espidf
+// [riscv32imafc_esp_espidf] compile-flags: --target riscv32imafc-esp-espidf
+// [riscv32imafc_esp_espidf] needs-llvm-components: riscv
+// revisions: riscv32imc_esp_espidf
+// [riscv32imc_esp_espidf] compile-flags: --target riscv32imc-esp-espidf
+// [riscv32imc_esp_espidf] needs-llvm-components: riscv
+// revisions: riscv32imc_unknown_none_elf
+// [riscv32imc_unknown_none_elf] compile-flags: --target riscv32imc-unknown-none-elf
+// [riscv32imc_unknown_none_elf] needs-llvm-components: riscv
+// revisions: riscv64_linux_android
+// [riscv64_linux_android] compile-flags: --target riscv64-linux-android
+// [riscv64_linux_android] needs-llvm-components: riscv
+// revisions: riscv64gc_unknown_freebsd
+// [riscv64gc_unknown_freebsd] compile-flags: --target riscv64gc-unknown-freebsd
+// [riscv64gc_unknown_freebsd] needs-llvm-components: riscv
+// revisions: riscv64gc_unknown_fuchsia
+// [riscv64gc_unknown_fuchsia] compile-flags: --target riscv64gc-unknown-fuchsia
+// [riscv64gc_unknown_fuchsia] needs-llvm-components: riscv
+// revisions: riscv64gc_unknown_hermit
+// [riscv64gc_unknown_hermit] compile-flags: --target riscv64gc-unknown-hermit
+// [riscv64gc_unknown_hermit] needs-llvm-components: riscv
+// revisions: riscv64gc_unknown_linux_gnu
+// [riscv64gc_unknown_linux_gnu] compile-flags: --target riscv64gc-unknown-linux-gnu
+// [riscv64gc_unknown_linux_gnu] needs-llvm-components: riscv
+// revisions: riscv64gc_unknown_linux_musl
+// [riscv64gc_unknown_linux_musl] compile-flags: --target riscv64gc-unknown-linux-musl
+// [riscv64gc_unknown_linux_musl] needs-llvm-components: riscv
+// revisions: riscv64gc_unknown_netbsd
+// [riscv64gc_unknown_netbsd] compile-flags: --target riscv64gc-unknown-netbsd
+// [riscv64gc_unknown_netbsd] needs-llvm-components: riscv
+// revisions: riscv64gc_unknown_none_elf
+// [riscv64gc_unknown_none_elf] compile-flags: --target riscv64gc-unknown-none-elf
+// [riscv64gc_unknown_none_elf] needs-llvm-components: riscv
+// revisions: riscv64gc_unknown_openbsd
+// [riscv64gc_unknown_openbsd] compile-flags: --target riscv64gc-unknown-openbsd
+// [riscv64gc_unknown_openbsd] needs-llvm-components: riscv
+// revisions: riscv64imac_unknown_none_elf
+// [riscv64imac_unknown_none_elf] compile-flags: --target riscv64imac-unknown-none-elf
+// [riscv64imac_unknown_none_elf] needs-llvm-components: riscv
+// revisions: s390x_unknown_linux_gnu
+// [s390x_unknown_linux_gnu] compile-flags: --target s390x-unknown-linux-gnu
+// [s390x_unknown_linux_gnu] needs-llvm-components: systemz
+// revisions: s390x_unknown_linux_musl
+// [s390x_unknown_linux_musl] compile-flags: --target s390x-unknown-linux-musl
+// [s390x_unknown_linux_musl] needs-llvm-components: systemz
+// revisions: sparc64_unknown_linux_gnu
+// [sparc64_unknown_linux_gnu] compile-flags: --target sparc64-unknown-linux-gnu
+// [sparc64_unknown_linux_gnu] needs-llvm-components: sparc
+// revisions: sparc64_unknown_netbsd
+// [sparc64_unknown_netbsd] compile-flags: --target sparc64-unknown-netbsd
+// [sparc64_unknown_netbsd] needs-llvm-components: sparc
+// revisions: sparc64_unknown_openbsd
+// [sparc64_unknown_openbsd] compile-flags: --target sparc64-unknown-openbsd
+// [sparc64_unknown_openbsd] needs-llvm-components: sparc
+// revisions: sparc_unknown_linux_gnu
+// [sparc_unknown_linux_gnu] compile-flags: --target sparc-unknown-linux-gnu
+// [sparc_unknown_linux_gnu] needs-llvm-components: sparc
+// revisions: sparc_unknown_none_elf
+// [sparc_unknown_none_elf] compile-flags: --target sparc-unknown-none-elf
+// [sparc_unknown_none_elf] needs-llvm-components: sparc
+// revisions: sparcv9_sun_solaris
+// [sparcv9_sun_solaris] compile-flags: --target sparcv9-sun-solaris
+// [sparcv9_sun_solaris] needs-llvm-components: sparc
+// revisions: thumbv4t_none_eabi
+// [thumbv4t_none_eabi] compile-flags: --target thumbv4t-none-eabi
+// [thumbv4t_none_eabi] needs-llvm-components: arm
+// revisions: thumbv5te_none_eabi
+// [thumbv5te_none_eabi] compile-flags: --target thumbv5te-none-eabi
+// [thumbv5te_none_eabi] needs-llvm-components: arm
+// revisions: thumbv6m_none_eabi
+// [thumbv6m_none_eabi] compile-flags: --target thumbv6m-none-eabi
+// [thumbv6m_none_eabi] needs-llvm-components: arm
+// revisions: thumbv7em_none_eabi
+// [thumbv7em_none_eabi] compile-flags: --target thumbv7em-none-eabi
+// [thumbv7em_none_eabi] needs-llvm-components: arm
+// revisions: thumbv7em_none_eabihf
+// [thumbv7em_none_eabihf] compile-flags: --target thumbv7em-none-eabihf
+// [thumbv7em_none_eabihf] needs-llvm-components: arm
+// revisions: thumbv7m_none_eabi
+// [thumbv7m_none_eabi] compile-flags: --target thumbv7m-none-eabi
+// [thumbv7m_none_eabi] needs-llvm-components: arm
+// revisions: thumbv7neon_linux_androideabi
+// [thumbv7neon_linux_androideabi] compile-flags: --target thumbv7neon-linux-androideabi
+// [thumbv7neon_linux_androideabi] needs-llvm-components: arm
+// revisions: thumbv7neon_unknown_linux_gnueabihf
+// [thumbv7neon_unknown_linux_gnueabihf] compile-flags: --target thumbv7neon-unknown-linux-gnueabihf
+// [thumbv7neon_unknown_linux_gnueabihf] needs-llvm-components: arm
+// revisions: thumbv7neon_unknown_linux_musleabihf
+// [thumbv7neon_unknown_linux_musleabihf] compile-flags: --target thumbv7neon-unknown-linux-musleabihf
+// [thumbv7neon_unknown_linux_musleabihf] needs-llvm-components: arm
+// revisions: thumbv8m_base_none_eabi
+// [thumbv8m_base_none_eabi] compile-flags: --target thumbv8m.base-none-eabi
+// [thumbv8m_base_none_eabi] needs-llvm-components: arm
+// revisions: thumbv8m_main_none_eabi
+// [thumbv8m_main_none_eabi] compile-flags: --target thumbv8m.main-none-eabi
+// [thumbv8m_main_none_eabi] needs-llvm-components: arm
+// revisions: thumbv8m_main_none_eabihf
+// [thumbv8m_main_none_eabihf] compile-flags: --target thumbv8m.main-none-eabihf
+// [thumbv8m_main_none_eabihf] needs-llvm-components: arm
+// revisions: wasm32_unknown_emscripten
+// [wasm32_unknown_emscripten] compile-flags: --target wasm32-unknown-emscripten
+// [wasm32_unknown_emscripten] needs-llvm-components: webassembly
+// revisions: wasm32_unknown_unknown
+// [wasm32_unknown_unknown] compile-flags: --target wasm32-unknown-unknown
+// [wasm32_unknown_unknown] needs-llvm-components: webassembly
+// revisions: wasm32_wasi
+// [wasm32_wasi] compile-flags: --target wasm32-wasi
+// [wasm32_wasi] needs-llvm-components: webassembly
+// revisions: wasm32_wasi_preview1_threads
+// [wasm32_wasi_preview1_threads] compile-flags: --target wasm32-wasi-preview1-threads
+// [wasm32_wasi_preview1_threads] needs-llvm-components: webassembly
+// revisions: wasm64_unknown_unknown
+// [wasm64_unknown_unknown] compile-flags: --target wasm64-unknown-unknown
+// [wasm64_unknown_unknown] needs-llvm-components: webassembly
+// revisions: x86_64_apple_darwin
+// [x86_64_apple_darwin] compile-flags: --target x86_64-apple-darwin
+// [x86_64_apple_darwin] needs-llvm-components: x86
+// revisions: x86_64_apple_ios
+// [x86_64_apple_ios] compile-flags: --target x86_64-apple-ios
+// [x86_64_apple_ios] needs-llvm-components: x86
+// revisions: x86_64_apple_ios_macabi
+// [x86_64_apple_ios_macabi] compile-flags: --target x86_64-apple-ios-macabi
+// [x86_64_apple_ios_macabi] needs-llvm-components: x86
+// revisions: x86_64_apple_tvos
+// [x86_64_apple_tvos] compile-flags: --target x86_64-apple-tvos
+// [x86_64_apple_tvos] needs-llvm-components: x86
+// revisions: x86_64_apple_watchos_sim
+// [x86_64_apple_watchos_sim] compile-flags: --target x86_64-apple-watchos-sim
+// [x86_64_apple_watchos_sim] needs-llvm-components: x86
+// revisions: x86_64_fortanix_unknown_sgx
+// [x86_64_fortanix_unknown_sgx] compile-flags: --target x86_64-fortanix-unknown-sgx
+// [x86_64_fortanix_unknown_sgx] needs-llvm-components: x86
+// revisions: x86_64_fuchsia
+// [x86_64_fuchsia] compile-flags: --target x86_64-fuchsia
+// [x86_64_fuchsia] needs-llvm-components: x86
+// revisions: x86_64_linux_android
+// [x86_64_linux_android] compile-flags: --target x86_64-linux-android
+// [x86_64_linux_android] needs-llvm-components: x86
+// revisions: x86_64_pc_nto_qnx710
+// [x86_64_pc_nto_qnx710] compile-flags: --target x86_64-pc-nto-qnx710
+// [x86_64_pc_nto_qnx710] needs-llvm-components: x86
+// revisions: x86_64_pc_solaris
+// [x86_64_pc_solaris] compile-flags: --target x86_64-pc-solaris
+// [x86_64_pc_solaris] needs-llvm-components: x86
+// revisions: x86_64_unikraft_linux_musl
+// [x86_64_unikraft_linux_musl] compile-flags: --target x86_64-unikraft-linux-musl
+// [x86_64_unikraft_linux_musl] needs-llvm-components: x86
+// revisions: x86_64_unknown_dragonfly
+// [x86_64_unknown_dragonfly] compile-flags: --target x86_64-unknown-dragonfly
+// [x86_64_unknown_dragonfly] needs-llvm-components: x86
+// revisions: x86_64_unknown_freebsd
+// [x86_64_unknown_freebsd] compile-flags: --target x86_64-unknown-freebsd
+// [x86_64_unknown_freebsd] needs-llvm-components: x86
+// revisions: x86_64_unknown_fuchsia
+// [x86_64_unknown_fuchsia] compile-flags: --target x86_64-unknown-fuchsia
+// [x86_64_unknown_fuchsia] needs-llvm-components: x86
+// revisions: x86_64_unknown_haiku
+// [x86_64_unknown_haiku] compile-flags: --target x86_64-unknown-haiku
+// [x86_64_unknown_haiku] needs-llvm-components: x86
+// revisions: x86_64_unknown_hermit
+// [x86_64_unknown_hermit] compile-flags: --target x86_64-unknown-hermit
+// [x86_64_unknown_hermit] needs-llvm-components: x86
+// revisions: x86_64_unknown_illumos
+// [x86_64_unknown_illumos] compile-flags: --target x86_64-unknown-illumos
+// [x86_64_unknown_illumos] needs-llvm-components: x86
+// revisions: x86_64_unknown_l4re_uclibc
+// [x86_64_unknown_l4re_uclibc] compile-flags: --target x86_64-unknown-l4re-uclibc
+// [x86_64_unknown_l4re_uclibc] needs-llvm-components: x86
+// revisions: x86_64_unknown_linux_gnu
+// [x86_64_unknown_linux_gnu] compile-flags: --target x86_64-unknown-linux-gnu
+// [x86_64_unknown_linux_gnu] needs-llvm-components: x86
+// revisions: x86_64_unknown_linux_gnux32
+// [x86_64_unknown_linux_gnux32] compile-flags: --target x86_64-unknown-linux-gnux32
+// [x86_64_unknown_linux_gnux32] needs-llvm-components: x86
+// revisions: x86_64_unknown_linux_musl
+// [x86_64_unknown_linux_musl] compile-flags: --target x86_64-unknown-linux-musl
+// [x86_64_unknown_linux_musl] needs-llvm-components: x86
+// revisions: x86_64_unknown_linux_ohos
+// [x86_64_unknown_linux_ohos] compile-flags: --target x86_64-unknown-linux-ohos
+// [x86_64_unknown_linux_ohos] needs-llvm-components: x86
+// revisions: x86_64_unknown_netbsd
+// [x86_64_unknown_netbsd] compile-flags: --target x86_64-unknown-netbsd
+// [x86_64_unknown_netbsd] needs-llvm-components: x86
+// revisions: x86_64_unknown_none
+// [x86_64_unknown_none] compile-flags: --target x86_64-unknown-none
+// [x86_64_unknown_none] needs-llvm-components: x86
+// revisions: x86_64_unknown_openbsd
+// [x86_64_unknown_openbsd] compile-flags: --target x86_64-unknown-openbsd
+// [x86_64_unknown_openbsd] needs-llvm-components: x86
+// revisions: x86_64_unknown_redox
+// [x86_64_unknown_redox] compile-flags: --target x86_64-unknown-redox
+// [x86_64_unknown_redox] needs-llvm-components: x86
+// revisions: x86_64_wrs_vxworks
+// [x86_64_wrs_vxworks] compile-flags: --target x86_64-wrs-vxworks
+// [x86_64_wrs_vxworks] needs-llvm-components: x86
+// revisions: x86_64h_apple_darwin
+// [x86_64h_apple_darwin] compile-flags: --target x86_64h-apple-darwin
+// [x86_64h_apple_darwin] needs-llvm-components: x86
+
+// Sanity-check that each target can produce assembly code.
+
+#![feature(no_core, lang_items)]
+#![no_std]
+#![no_core]
+#![crate_type = "lib"]
+
+#[lang = "sized"]
+trait Sized {}
+
+pub fn test() -> u8 {
+    42
+}
+
+// CHECK: .section
diff --git a/tests/assembly/targets/targets-nvptx.rs b/tests/assembly/targets/targets-nvptx.rs
new file mode 100644
index 00000000000..06334230400
--- /dev/null
+++ b/tests/assembly/targets/targets-nvptx.rs
@@ -0,0 +1,21 @@
+// assembly-output: emit-asm
+// ignore-tidy-linelength
+// revisions: nvptx64_nvidia_cuda
+// [nvptx64_nvidia_cuda] compile-flags: --target nvptx64-nvidia-cuda
+// [nvptx64_nvidia_cuda] needs-llvm-components: nvptx
+
+// Sanity-check that each target can produce assembly code.
+
+#![feature(no_core, lang_items)]
+#![no_std]
+#![no_core]
+#![crate_type = "lib"]
+
+#[lang = "sized"]
+trait Sized {}
+
+pub fn test() -> u8 {
+    42
+}
+
+// CHECK: .version
diff --git a/tests/assembly/targets/targets-pe.rs b/tests/assembly/targets/targets-pe.rs
new file mode 100644
index 00000000000..7398d7ef790
--- /dev/null
+++ b/tests/assembly/targets/targets-pe.rs
@@ -0,0 +1,93 @@
+// assembly-output: emit-asm
+// ignore-tidy-linelength
+// revisions: aarch64_pc_windows_msvc
+// [aarch64_pc_windows_msvc] compile-flags: --target aarch64-pc-windows-msvc
+// [aarch64_pc_windows_msvc] needs-llvm-components: aarch64
+// revisions: aarch64_pc_windows_gnullvm
+// [aarch64_pc_windows_gnullvm] compile-flags: --target aarch64-pc-windows-gnullvm
+// [aarch64_pc_windows_gnullvm] needs-llvm-components: aarch64
+// revisions: aarch64_unknown_uefi
+// [aarch64_unknown_uefi] compile-flags: --target aarch64-unknown-uefi
+// [aarch64_unknown_uefi] needs-llvm-components: aarch64
+// revisions: aarch64_uwp_windows_msvc
+// [aarch64_uwp_windows_msvc] compile-flags: --target aarch64-uwp-windows-msvc
+// [aarch64_uwp_windows_msvc] needs-llvm-components: aarch64
+// revisions: avr_unknown_gnu_atmega328
+// [avr_unknown_gnu_atmega328] compile-flags: --target avr-unknown-gnu-atmega328
+// [avr_unknown_gnu_atmega328] needs-llvm-components: avr
+// revisions: bpfeb_unknown_none
+// [bpfeb_unknown_none] compile-flags: --target bpfeb-unknown-none
+// [bpfeb_unknown_none] needs-llvm-components: bpf
+// revisions: bpfel_unknown_none
+// [bpfel_unknown_none] compile-flags: --target bpfel-unknown-none
+// [bpfel_unknown_none] needs-llvm-components: bpf
+// revisions: i586_pc_windows_msvc
+// [i586_pc_windows_msvc] compile-flags: --target i586-pc-windows-msvc
+// [i586_pc_windows_msvc] needs-llvm-components: x86
+// revisions: i686_pc_windows_gnu
+// [i686_pc_windows_gnu] compile-flags: --target i686-pc-windows-gnu
+// [i686_pc_windows_gnu] needs-llvm-components: x86
+// revisions: i686_pc_windows_msvc
+// [i686_pc_windows_msvc] compile-flags: --target i686-pc-windows-msvc
+// [i686_pc_windows_msvc] needs-llvm-components: x86
+// revisions: i686_pc_windows_gnullvm
+// [i686_pc_windows_gnullvm] compile-flags: --target i686-pc-windows-gnullvm
+// [i686_pc_windows_gnullvm] needs-llvm-components: x86
+// revisions: i686_uwp_windows_gnu
+// [i686_uwp_windows_gnu] compile-flags: --target i686-uwp-windows-gnu
+// [i686_uwp_windows_gnu] needs-llvm-components: x86
+// revisions: i686_unknown_uefi
+// [i686_unknown_uefi] compile-flags: --target i686-unknown-uefi
+// [i686_unknown_uefi] needs-llvm-components: x86
+// revisions: i686_uwp_windows_msvc
+// [i686_uwp_windows_msvc] compile-flags: --target i686-uwp-windows-msvc
+// [i686_uwp_windows_msvc] needs-llvm-components: x86
+// revisions: i686_win7_windows_msvc
+// [i686_win7_windows_msvc] compile-flags: --target i686-win7-windows-msvc
+// [i686_win7_windows_msvc] needs-llvm-components: x86
+// revisions: powerpc64_ibm_aix
+// [powerpc64_ibm_aix] compile-flags: --target powerpc64-ibm-aix
+// [powerpc64_ibm_aix] needs-llvm-components: powerpc
+// revisions: thumbv7a_uwp_windows_msvc
+// [thumbv7a_uwp_windows_msvc] compile-flags: --target thumbv7a-uwp-windows-msvc
+// [thumbv7a_uwp_windows_msvc] needs-llvm-components: arm
+// revisions: thumbv7a_pc_windows_msvc
+// [thumbv7a_pc_windows_msvc] compile-flags: --target thumbv7a-pc-windows-msvc
+// [thumbv7a_pc_windows_msvc] needs-llvm-components: arm
+// revisions: x86_64_pc_windows_gnu
+// [x86_64_pc_windows_gnu] compile-flags: --target x86_64-pc-windows-gnu
+// [x86_64_pc_windows_gnu] needs-llvm-components: x86
+// revisions: x86_64_pc_windows_gnullvm
+// [x86_64_pc_windows_gnullvm] compile-flags: --target x86_64-pc-windows-gnullvm
+// [x86_64_pc_windows_gnullvm] needs-llvm-components: x86
+// revisions: x86_64_pc_windows_msvc
+// [x86_64_pc_windows_msvc] compile-flags: --target x86_64-pc-windows-msvc
+// [x86_64_pc_windows_msvc] needs-llvm-components: x86
+// revisions: x86_64_unknown_uefi
+// [x86_64_unknown_uefi] compile-flags: --target x86_64-unknown-uefi
+// [x86_64_unknown_uefi] needs-llvm-components: x86
+// revisions: x86_64_uwp_windows_gnu
+// [x86_64_uwp_windows_gnu] compile-flags: --target x86_64-uwp-windows-gnu
+// [x86_64_uwp_windows_gnu] needs-llvm-components: x86
+// revisions: x86_64_uwp_windows_msvc
+// [x86_64_uwp_windows_msvc] compile-flags: --target x86_64-uwp-windows-msvc
+// [x86_64_uwp_windows_msvc] needs-llvm-components: x86
+// revisions: x86_64_win7_windows_msvc
+// [x86_64_win7_windows_msvc] compile-flags: --target x86_64-win7-windows-msvc
+// [x86_64_win7_windows_msvc] needs-llvm-components: x86
+
+// Sanity-check that each target can produce assembly code.
+
+#![feature(no_core, lang_items)]
+#![no_std]
+#![no_core]
+#![crate_type = "lib"]
+
+#[lang = "sized"]
+trait Sized {}
+
+pub fn test() -> u8 {
+    42
+}
+
+// CHECK: .file
diff --git a/tests/mir-opt/const_prop/array_index.main.GVN.32bit.panic-abort.diff b/tests/mir-opt/const_prop/array_index.main.GVN.32bit.panic-abort.diff
index f9537661e8c..6d00dd5b212 100644
--- a/tests/mir-opt/const_prop/array_index.main.GVN.32bit.panic-abort.diff
+++ b/tests/mir-opt/const_prop/array_index.main.GVN.32bit.panic-abort.diff
@@ -18,11 +18,12 @@
           _2 = [const 0_u32, const 1_u32, const 2_u32, const 3_u32];
           StorageLive(_3);
           _3 = const 2_usize;
-          _4 = Len(_2);
+-         _4 = Len(_2);
 -         _5 = Lt(_3, _4);
 -         assert(move _5, "index out of bounds: the length is {} but the index is {}", move _4, _3) -> [success: bb1, unwind unreachable];
-+         _5 = Lt(const 2_usize, _4);
-+         assert(move _5, "index out of bounds: the length is {} but the index is {}", move _4, const 2_usize) -> [success: bb1, unwind unreachable];
++         _4 = const 4_usize;
++         _5 = const true;
++         assert(const true, "index out of bounds: the length is {} but the index is {}", const 4_usize, const 2_usize) -> [success: bb1, unwind unreachable];
       }
   
       bb1: {
diff --git a/tests/mir-opt/const_prop/array_index.main.GVN.32bit.panic-unwind.diff b/tests/mir-opt/const_prop/array_index.main.GVN.32bit.panic-unwind.diff
index 07886779fea..7e2f72ab31b 100644
--- a/tests/mir-opt/const_prop/array_index.main.GVN.32bit.panic-unwind.diff
+++ b/tests/mir-opt/const_prop/array_index.main.GVN.32bit.panic-unwind.diff
@@ -18,11 +18,12 @@
           _2 = [const 0_u32, const 1_u32, const 2_u32, const 3_u32];
           StorageLive(_3);
           _3 = const 2_usize;
-          _4 = Len(_2);
+-         _4 = Len(_2);
 -         _5 = Lt(_3, _4);
 -         assert(move _5, "index out of bounds: the length is {} but the index is {}", move _4, _3) -> [success: bb1, unwind continue];
-+         _5 = Lt(const 2_usize, _4);
-+         assert(move _5, "index out of bounds: the length is {} but the index is {}", move _4, const 2_usize) -> [success: bb1, unwind continue];
++         _4 = const 4_usize;
++         _5 = const true;
++         assert(const true, "index out of bounds: the length is {} but the index is {}", const 4_usize, const 2_usize) -> [success: bb1, unwind continue];
       }
   
       bb1: {
diff --git a/tests/mir-opt/const_prop/array_index.main.GVN.64bit.panic-abort.diff b/tests/mir-opt/const_prop/array_index.main.GVN.64bit.panic-abort.diff
index f9537661e8c..6d00dd5b212 100644
--- a/tests/mir-opt/const_prop/array_index.main.GVN.64bit.panic-abort.diff
+++ b/tests/mir-opt/const_prop/array_index.main.GVN.64bit.panic-abort.diff
@@ -18,11 +18,12 @@
           _2 = [const 0_u32, const 1_u32, const 2_u32, const 3_u32];
           StorageLive(_3);
           _3 = const 2_usize;
-          _4 = Len(_2);
+-         _4 = Len(_2);
 -         _5 = Lt(_3, _4);
 -         assert(move _5, "index out of bounds: the length is {} but the index is {}", move _4, _3) -> [success: bb1, unwind unreachable];
-+         _5 = Lt(const 2_usize, _4);
-+         assert(move _5, "index out of bounds: the length is {} but the index is {}", move _4, const 2_usize) -> [success: bb1, unwind unreachable];
++         _4 = const 4_usize;
++         _5 = const true;
++         assert(const true, "index out of bounds: the length is {} but the index is {}", const 4_usize, const 2_usize) -> [success: bb1, unwind unreachable];
       }
   
       bb1: {
diff --git a/tests/mir-opt/const_prop/array_index.main.GVN.64bit.panic-unwind.diff b/tests/mir-opt/const_prop/array_index.main.GVN.64bit.panic-unwind.diff
index 07886779fea..7e2f72ab31b 100644
--- a/tests/mir-opt/const_prop/array_index.main.GVN.64bit.panic-unwind.diff
+++ b/tests/mir-opt/const_prop/array_index.main.GVN.64bit.panic-unwind.diff
@@ -18,11 +18,12 @@
           _2 = [const 0_u32, const 1_u32, const 2_u32, const 3_u32];
           StorageLive(_3);
           _3 = const 2_usize;
-          _4 = Len(_2);
+-         _4 = Len(_2);
 -         _5 = Lt(_3, _4);
 -         assert(move _5, "index out of bounds: the length is {} but the index is {}", move _4, _3) -> [success: bb1, unwind continue];
-+         _5 = Lt(const 2_usize, _4);
-+         assert(move _5, "index out of bounds: the length is {} but the index is {}", move _4, const 2_usize) -> [success: bb1, unwind continue];
++         _4 = const 4_usize;
++         _5 = const true;
++         assert(const true, "index out of bounds: the length is {} but the index is {}", const 4_usize, const 2_usize) -> [success: bb1, unwind continue];
       }
   
       bb1: {
diff --git a/tests/mir-opt/const_prop/boolean_identities.rs b/tests/mir-opt/const_prop/boolean_identities.rs
index f6575ac8e54..3b7ea25ad46 100644
--- a/tests/mir-opt/const_prop/boolean_identities.rs
+++ b/tests/mir-opt/const_prop/boolean_identities.rs
@@ -5,10 +5,9 @@ pub fn test(x: bool, y: bool) -> bool {
     // CHECK-LABEL: fn test(
     // CHECK: debug a => [[a:_.*]];
     // CHECK: debug b => [[b:_.*]];
-    // FIXME(cjgillot) simplify algebraic identity
-    // CHECK-NOT: [[a]] = const true;
-    // CHECK-NOT: [[b]] = const false;
-    // CHECK-NOT: _0 = const false;
+    // CHECK: [[a]] = const true;
+    // CHECK: [[b]] = const false;
+    // CHECK: _0 = const false;
     let a = (y | true);
     let b = (x & false);
     a & b
diff --git a/tests/mir-opt/const_prop/boolean_identities.test.GVN.diff b/tests/mir-opt/const_prop/boolean_identities.test.GVN.diff
index eca87af7527..0bd8413289e 100644
--- a/tests/mir-opt/const_prop/boolean_identities.test.GVN.diff
+++ b/tests/mir-opt/const_prop/boolean_identities.test.GVN.diff
@@ -24,21 +24,23 @@
           StorageLive(_4);
           _4 = _2;
 -         _3 = BitOr(move _4, const true);
-+         _3 = BitOr(_2, const true);
++         _3 = const true;
           StorageDead(_4);
 -         StorageLive(_5);
 +         nop;
           StorageLive(_6);
           _6 = _1;
 -         _5 = BitAnd(move _6, const false);
-+         _5 = BitAnd(_1, const false);
++         _5 = const false;
           StorageDead(_6);
           StorageLive(_7);
-          _7 = _3;
+-         _7 = _3;
++         _7 = const true;
           StorageLive(_8);
-          _8 = _5;
+-         _8 = _5;
 -         _0 = BitAnd(move _7, move _8);
-+         _0 = BitAnd(_3, _5);
++         _8 = const false;
++         _0 = const false;
           StorageDead(_8);
           StorageDead(_7);
 -         StorageDead(_5);
diff --git a/tests/mir-opt/const_prop/boxes.main.GVN.panic-abort.diff b/tests/mir-opt/const_prop/boxes.main.GVN.panic-abort.diff
index b3fdaa5ee82..59ee38f5a2b 100644
--- a/tests/mir-opt/const_prop/boxes.main.GVN.panic-abort.diff
+++ b/tests/mir-opt/const_prop/boxes.main.GVN.panic-abort.diff
@@ -20,7 +20,8 @@
   
       bb0: {
           StorageLive(_1);
-          StorageLive(_2);
+-         StorageLive(_2);
++         nop;
           StorageLive(_3);
 -         _4 = SizeOf(i32);
 -         _5 = AlignOf(i32);
@@ -39,8 +40,10 @@
           StorageDead(_7);
           _9 = (((_3.0: std::ptr::Unique<i32>).0: std::ptr::NonNull<i32>).0: *const i32);
           _2 = (*_9);
-          _1 = Add(move _2, const 0_i32);
-          StorageDead(_2);
+-         _1 = Add(move _2, const 0_i32);
+-         StorageDead(_2);
++         _1 = _2;
++         nop;
           drop(_3) -> [return: bb2, unwind unreachable];
       }
   
diff --git a/tests/mir-opt/const_prop/boxes.main.GVN.panic-unwind.diff b/tests/mir-opt/const_prop/boxes.main.GVN.panic-unwind.diff
index d0350c97253..9d87bd809d1 100644
--- a/tests/mir-opt/const_prop/boxes.main.GVN.panic-unwind.diff
+++ b/tests/mir-opt/const_prop/boxes.main.GVN.panic-unwind.diff
@@ -20,7 +20,8 @@
   
       bb0: {
           StorageLive(_1);
-          StorageLive(_2);
+-         StorageLive(_2);
++         nop;
           StorageLive(_3);
 -         _4 = SizeOf(i32);
 -         _5 = AlignOf(i32);
@@ -39,8 +40,10 @@
           StorageDead(_7);
           _9 = (((_3.0: std::ptr::Unique<i32>).0: std::ptr::NonNull<i32>).0: *const i32);
           _2 = (*_9);
-          _1 = Add(move _2, const 0_i32);
-          StorageDead(_2);
+-         _1 = Add(move _2, const 0_i32);
+-         StorageDead(_2);
++         _1 = _2;
++         nop;
           drop(_3) -> [return: bb2, unwind: bb3];
       }
   
diff --git a/tests/mir-opt/const_prop/boxes.rs b/tests/mir-opt/const_prop/boxes.rs
index 5227d7b8b8b..d2d61f86d5e 100644
--- a/tests/mir-opt/const_prop/boxes.rs
+++ b/tests/mir-opt/const_prop/boxes.rs
@@ -12,7 +12,7 @@ fn main() {
     // CHECK: debug x => [[x:_.*]];
     // CHECK: (*{{_.*}}) = const 42_i32;
     // CHECK: [[tmp:_.*]] = (*{{_.*}});
-    // CHECK: [[x]] = Add(move [[tmp]], const 0_i32);
+    // CHECK: [[x]] = [[tmp]];
     let x = *(#[rustc_box]
     Box::new(42))
         + 0;
diff --git a/tests/mir-opt/const_prop/large_array_index.main.GVN.32bit.panic-abort.diff b/tests/mir-opt/const_prop/large_array_index.main.GVN.32bit.panic-abort.diff
index cf36109fdcb..bd987c01ab1 100644
--- a/tests/mir-opt/const_prop/large_array_index.main.GVN.32bit.panic-abort.diff
+++ b/tests/mir-opt/const_prop/large_array_index.main.GVN.32bit.panic-abort.diff
@@ -18,11 +18,12 @@
           _2 = [const 0_u8; 5000];
           StorageLive(_3);
           _3 = const 2_usize;
-          _4 = Len(_2);
+-         _4 = Len(_2);
 -         _5 = Lt(_3, _4);
 -         assert(move _5, "index out of bounds: the length is {} but the index is {}", move _4, _3) -> [success: bb1, unwind unreachable];
-+         _5 = Lt(const 2_usize, _4);
-+         assert(move _5, "index out of bounds: the length is {} but the index is {}", move _4, const 2_usize) -> [success: bb1, unwind unreachable];
++         _4 = const 5000_usize;
++         _5 = const true;
++         assert(const true, "index out of bounds: the length is {} but the index is {}", const 5000_usize, const 2_usize) -> [success: bb1, unwind unreachable];
       }
   
       bb1: {
diff --git a/tests/mir-opt/const_prop/large_array_index.main.GVN.32bit.panic-unwind.diff b/tests/mir-opt/const_prop/large_array_index.main.GVN.32bit.panic-unwind.diff
index 40ed9697180..e9ebef84ae0 100644
--- a/tests/mir-opt/const_prop/large_array_index.main.GVN.32bit.panic-unwind.diff
+++ b/tests/mir-opt/const_prop/large_array_index.main.GVN.32bit.panic-unwind.diff
@@ -18,11 +18,12 @@
           _2 = [const 0_u8; 5000];
           StorageLive(_3);
           _3 = const 2_usize;
-          _4 = Len(_2);
+-         _4 = Len(_2);
 -         _5 = Lt(_3, _4);
 -         assert(move _5, "index out of bounds: the length is {} but the index is {}", move _4, _3) -> [success: bb1, unwind continue];
-+         _5 = Lt(const 2_usize, _4);
-+         assert(move _5, "index out of bounds: the length is {} but the index is {}", move _4, const 2_usize) -> [success: bb1, unwind continue];
++         _4 = const 5000_usize;
++         _5 = const true;
++         assert(const true, "index out of bounds: the length is {} but the index is {}", const 5000_usize, const 2_usize) -> [success: bb1, unwind continue];
       }
   
       bb1: {
diff --git a/tests/mir-opt/const_prop/large_array_index.main.GVN.64bit.panic-abort.diff b/tests/mir-opt/const_prop/large_array_index.main.GVN.64bit.panic-abort.diff
index cf36109fdcb..bd987c01ab1 100644
--- a/tests/mir-opt/const_prop/large_array_index.main.GVN.64bit.panic-abort.diff
+++ b/tests/mir-opt/const_prop/large_array_index.main.GVN.64bit.panic-abort.diff
@@ -18,11 +18,12 @@
           _2 = [const 0_u8; 5000];
           StorageLive(_3);
           _3 = const 2_usize;
-          _4 = Len(_2);
+-         _4 = Len(_2);
 -         _5 = Lt(_3, _4);
 -         assert(move _5, "index out of bounds: the length is {} but the index is {}", move _4, _3) -> [success: bb1, unwind unreachable];
-+         _5 = Lt(const 2_usize, _4);
-+         assert(move _5, "index out of bounds: the length is {} but the index is {}", move _4, const 2_usize) -> [success: bb1, unwind unreachable];
++         _4 = const 5000_usize;
++         _5 = const true;
++         assert(const true, "index out of bounds: the length is {} but the index is {}", const 5000_usize, const 2_usize) -> [success: bb1, unwind unreachable];
       }
   
       bb1: {
diff --git a/tests/mir-opt/const_prop/large_array_index.main.GVN.64bit.panic-unwind.diff b/tests/mir-opt/const_prop/large_array_index.main.GVN.64bit.panic-unwind.diff
index 40ed9697180..e9ebef84ae0 100644
--- a/tests/mir-opt/const_prop/large_array_index.main.GVN.64bit.panic-unwind.diff
+++ b/tests/mir-opt/const_prop/large_array_index.main.GVN.64bit.panic-unwind.diff
@@ -18,11 +18,12 @@
           _2 = [const 0_u8; 5000];
           StorageLive(_3);
           _3 = const 2_usize;
-          _4 = Len(_2);
+-         _4 = Len(_2);
 -         _5 = Lt(_3, _4);
 -         assert(move _5, "index out of bounds: the length is {} but the index is {}", move _4, _3) -> [success: bb1, unwind continue];
-+         _5 = Lt(const 2_usize, _4);
-+         assert(move _5, "index out of bounds: the length is {} but the index is {}", move _4, const 2_usize) -> [success: bb1, unwind continue];
++         _4 = const 5000_usize;
++         _5 = const true;
++         assert(const true, "index out of bounds: the length is {} but the index is {}", const 5000_usize, const 2_usize) -> [success: bb1, unwind continue];
       }
   
       bb1: {
diff --git a/tests/mir-opt/const_prop/mult_by_zero.rs b/tests/mir-opt/const_prop/mult_by_zero.rs
index 2fdb75c3100..b8afaeef43f 100644
--- a/tests/mir-opt/const_prop/mult_by_zero.rs
+++ b/tests/mir-opt/const_prop/mult_by_zero.rs
@@ -3,8 +3,7 @@
 // EMIT_MIR mult_by_zero.test.GVN.diff
 fn test(x: i32) -> i32 {
     // CHECK: fn test(
-    // FIXME(cjgillot) simplify algebraic identity
-    // CHECK-NOT: _0 = const 0_i32;
+    // CHECK: _0 = const 0_i32;
     x * 0
 }
 
diff --git a/tests/mir-opt/const_prop/mult_by_zero.test.GVN.diff b/tests/mir-opt/const_prop/mult_by_zero.test.GVN.diff
index e9fb34749c1..6c2aab45d48 100644
--- a/tests/mir-opt/const_prop/mult_by_zero.test.GVN.diff
+++ b/tests/mir-opt/const_prop/mult_by_zero.test.GVN.diff
@@ -10,7 +10,7 @@
           StorageLive(_2);
           _2 = _1;
 -         _0 = Mul(move _2, const 0_i32);
-+         _0 = Mul(_1, const 0_i32);
++         _0 = const 0_i32;
           StorageDead(_2);
           return;
       }
diff --git a/tests/mir-opt/const_prop/repeat.main.GVN.32bit.panic-abort.diff b/tests/mir-opt/const_prop/repeat.main.GVN.32bit.panic-abort.diff
index a52e6e35483..71635b8e9c3 100644
--- a/tests/mir-opt/const_prop/repeat.main.GVN.32bit.panic-abort.diff
+++ b/tests/mir-opt/const_prop/repeat.main.GVN.32bit.panic-abort.diff
@@ -20,11 +20,12 @@
           _3 = [const 42_u32; 8];
           StorageLive(_4);
           _4 = const 2_usize;
-          _5 = Len(_3);
+-         _5 = Len(_3);
 -         _6 = Lt(_4, _5);
 -         assert(move _6, "index out of bounds: the length is {} but the index is {}", move _5, _4) -> [success: bb1, unwind unreachable];
-+         _6 = Lt(const 2_usize, _5);
-+         assert(move _6, "index out of bounds: the length is {} but the index is {}", move _5, const 2_usize) -> [success: bb1, unwind unreachable];
++         _5 = const 8_usize;
++         _6 = const true;
++         assert(const true, "index out of bounds: the length is {} but the index is {}", const 8_usize, const 2_usize) -> [success: bb1, unwind unreachable];
       }
   
       bb1: {
diff --git a/tests/mir-opt/const_prop/repeat.main.GVN.32bit.panic-unwind.diff b/tests/mir-opt/const_prop/repeat.main.GVN.32bit.panic-unwind.diff
index fe0acee71eb..84205028d6d 100644
--- a/tests/mir-opt/const_prop/repeat.main.GVN.32bit.panic-unwind.diff
+++ b/tests/mir-opt/const_prop/repeat.main.GVN.32bit.panic-unwind.diff
@@ -20,11 +20,12 @@
           _3 = [const 42_u32; 8];
           StorageLive(_4);
           _4 = const 2_usize;
-          _5 = Len(_3);
+-         _5 = Len(_3);
 -         _6 = Lt(_4, _5);
 -         assert(move _6, "index out of bounds: the length is {} but the index is {}", move _5, _4) -> [success: bb1, unwind continue];
-+         _6 = Lt(const 2_usize, _5);
-+         assert(move _6, "index out of bounds: the length is {} but the index is {}", move _5, const 2_usize) -> [success: bb1, unwind continue];
++         _5 = const 8_usize;
++         _6 = const true;
++         assert(const true, "index out of bounds: the length is {} but the index is {}", const 8_usize, const 2_usize) -> [success: bb1, unwind continue];
       }
   
       bb1: {
diff --git a/tests/mir-opt/const_prop/repeat.main.GVN.64bit.panic-abort.diff b/tests/mir-opt/const_prop/repeat.main.GVN.64bit.panic-abort.diff
index a52e6e35483..71635b8e9c3 100644
--- a/tests/mir-opt/const_prop/repeat.main.GVN.64bit.panic-abort.diff
+++ b/tests/mir-opt/const_prop/repeat.main.GVN.64bit.panic-abort.diff
@@ -20,11 +20,12 @@
           _3 = [const 42_u32; 8];
           StorageLive(_4);
           _4 = const 2_usize;
-          _5 = Len(_3);
+-         _5 = Len(_3);
 -         _6 = Lt(_4, _5);
 -         assert(move _6, "index out of bounds: the length is {} but the index is {}", move _5, _4) -> [success: bb1, unwind unreachable];
-+         _6 = Lt(const 2_usize, _5);
-+         assert(move _6, "index out of bounds: the length is {} but the index is {}", move _5, const 2_usize) -> [success: bb1, unwind unreachable];
++         _5 = const 8_usize;
++         _6 = const true;
++         assert(const true, "index out of bounds: the length is {} but the index is {}", const 8_usize, const 2_usize) -> [success: bb1, unwind unreachable];
       }
   
       bb1: {
diff --git a/tests/mir-opt/const_prop/repeat.main.GVN.64bit.panic-unwind.diff b/tests/mir-opt/const_prop/repeat.main.GVN.64bit.panic-unwind.diff
index fe0acee71eb..84205028d6d 100644
--- a/tests/mir-opt/const_prop/repeat.main.GVN.64bit.panic-unwind.diff
+++ b/tests/mir-opt/const_prop/repeat.main.GVN.64bit.panic-unwind.diff
@@ -20,11 +20,12 @@
           _3 = [const 42_u32; 8];
           StorageLive(_4);
           _4 = const 2_usize;
-          _5 = Len(_3);
+-         _5 = Len(_3);
 -         _6 = Lt(_4, _5);
 -         assert(move _6, "index out of bounds: the length is {} but the index is {}", move _5, _4) -> [success: bb1, unwind continue];
-+         _6 = Lt(const 2_usize, _5);
-+         assert(move _6, "index out of bounds: the length is {} but the index is {}", move _5, const 2_usize) -> [success: bb1, unwind continue];
++         _5 = const 8_usize;
++         _6 = const true;
++         assert(const true, "index out of bounds: the length is {} but the index is {}", const 8_usize, const 2_usize) -> [success: bb1, unwind continue];
       }
   
       bb1: {
diff --git a/tests/mir-opt/gvn.arithmetic.GVN.panic-abort.diff b/tests/mir-opt/gvn.arithmetic.GVN.panic-abort.diff
index d524ad242fe..84eb6c5cfe8 100644
--- a/tests/mir-opt/gvn.arithmetic.GVN.panic-abort.diff
+++ b/tests/mir-opt/gvn.arithmetic.GVN.panic-abort.diff
@@ -13,13 +13,13 @@
       let _8: ();
       let mut _9: u64;
       let mut _10: u64;
-      let _11: ();
-      let mut _12: u64;
+      let mut _11: u64;
+      let _12: ();
       let mut _13: u64;
-      let _14: ();
-      let mut _15: u64;
+      let mut _14: u64;
+      let _15: ();
       let mut _16: u64;
-      let mut _17: bool;
+      let mut _17: u64;
       let _18: ();
       let mut _19: u64;
       let mut _20: u64;
@@ -51,18 +51,32 @@
       let _46: ();
       let mut _47: u64;
       let mut _48: u64;
-      let _49: ();
-      let mut _50: u64;
+      let mut _49: bool;
+      let _50: ();
       let mut _51: u64;
-      let _52: ();
-      let mut _53: u64;
+      let mut _52: u64;
+      let _53: ();
       let mut _54: u64;
-      let _55: ();
-      let mut _56: u64;
+      let mut _55: u64;
+      let _56: ();
       let mut _57: u64;
-      let _58: ();
-      let mut _59: u64;
+      let mut _58: u64;
+      let _59: ();
       let mut _60: u64;
+      let mut _61: u64;
+      let _62: ();
+      let mut _63: u64;
+      let mut _64: u64;
+      let _65: ();
+      let mut _66: u64;
+      let mut _67: u64;
+      let mut _68: u64;
+      let _69: ();
+      let mut _70: u64;
+      let mut _71: u64;
+      let _72: ();
+      let mut _73: u64;
+      let mut _74: u64;
   
       bb0: {
           StorageLive(_2);
@@ -70,9 +84,10 @@
           StorageLive(_4);
           _4 = _1;
 -         _3 = Add(move _4, const 0_u64);
-+         _3 = Add(_1, const 0_u64);
++         _3 = _1;
           StorageDead(_4);
-          _2 = opaque::<u64>(move _3) -> [return: bb1, unwind unreachable];
+-         _2 = opaque::<u64>(move _3) -> [return: bb1, unwind unreachable];
++         _2 = opaque::<u64>(_1) -> [return: bb1, unwind unreachable];
       }
   
       bb1: {
@@ -83,98 +98,101 @@
           StorageLive(_7);
           _7 = _1;
 -         _6 = Sub(move _7, const 0_u64);
-+         _6 = Sub(_1, const 0_u64);
++         _6 = _1;
           StorageDead(_7);
-          _5 = opaque::<u64>(move _6) -> [return: bb2, unwind unreachable];
+-         _5 = opaque::<u64>(move _6) -> [return: bb2, unwind unreachable];
++         _5 = opaque::<u64>(_1) -> [return: bb2, unwind unreachable];
       }
   
       bb2: {
           StorageDead(_6);
           StorageDead(_5);
           StorageLive(_8);
-          StorageLive(_9);
+-         StorageLive(_9);
++         nop;
           StorageLive(_10);
           _10 = _1;
--         _9 = Mul(move _10, const 0_u64);
-+         _9 = Mul(_1, const 0_u64);
+          StorageLive(_11);
+          _11 = _1;
+-         _9 = Sub(move _10, move _11);
++         _9 = const 0_u64;
+          StorageDead(_11);
           StorageDead(_10);
-          _8 = opaque::<u64>(move _9) -> [return: bb3, unwind unreachable];
+-         _8 = opaque::<u64>(move _9) -> [return: bb3, unwind unreachable];
++         _8 = opaque::<u64>(const 0_u64) -> [return: bb3, unwind unreachable];
       }
   
       bb3: {
-          StorageDead(_9);
+-         StorageDead(_9);
++         nop;
           StorageDead(_8);
-          StorageLive(_11);
           StorageLive(_12);
           StorageLive(_13);
-          _13 = _1;
--         _12 = Mul(move _13, const 1_u64);
-+         _12 = Mul(_1, const 1_u64);
-          StorageDead(_13);
-          _11 = opaque::<u64>(move _12) -> [return: bb4, unwind unreachable];
+          StorageLive(_14);
+          _14 = _1;
+-         _13 = Mul(move _14, const 0_u64);
++         _13 = const 0_u64;
+          StorageDead(_14);
+-         _12 = opaque::<u64>(move _13) -> [return: bb4, unwind unreachable];
++         _12 = opaque::<u64>(const 0_u64) -> [return: bb4, unwind unreachable];
       }
   
       bb4: {
+          StorageDead(_13);
           StorageDead(_12);
-          StorageDead(_11);
-          StorageLive(_14);
           StorageLive(_15);
           StorageLive(_16);
-          _16 = _1;
--         _17 = Eq(const 0_u64, const 0_u64);
--         assert(!move _17, "attempt to divide `{}` by zero", _16) -> [success: bb5, unwind unreachable];
-+         _17 = const true;
-+         assert(!const true, "attempt to divide `{}` by zero", _1) -> [success: bb5, unwind unreachable];
+          StorageLive(_17);
+          _17 = _1;
+-         _16 = Mul(move _17, const 1_u64);
++         _16 = _1;
+          StorageDead(_17);
+-         _15 = opaque::<u64>(move _16) -> [return: bb5, unwind unreachable];
++         _15 = opaque::<u64>(_1) -> [return: bb5, unwind unreachable];
       }
   
       bb5: {
--         _15 = Div(move _16, const 0_u64);
-+         _15 = Div(_1, const 0_u64);
           StorageDead(_16);
-          _14 = opaque::<u64>(move _15) -> [return: bb6, unwind unreachable];
-      }
-  
-      bb6: {
           StorageDead(_15);
-          StorageDead(_14);
           StorageLive(_18);
           StorageLive(_19);
           StorageLive(_20);
           _20 = _1;
--         _21 = Eq(const 1_u64, const 0_u64);
--         assert(!move _21, "attempt to divide `{}` by zero", _20) -> [success: bb7, unwind unreachable];
-+         _21 = const false;
-+         assert(!const false, "attempt to divide `{}` by zero", _1) -> [success: bb7, unwind unreachable];
+-         _21 = Eq(const 0_u64, const 0_u64);
+-         assert(!move _21, "attempt to divide `{}` by zero", _20) -> [success: bb6, unwind unreachable];
++         _21 = const true;
++         assert(!const true, "attempt to divide `{}` by zero", _1) -> [success: bb6, unwind unreachable];
       }
   
-      bb7: {
--         _19 = Div(move _20, const 1_u64);
-+         _19 = Div(_1, const 1_u64);
+      bb6: {
+-         _19 = Div(move _20, const 0_u64);
++         _19 = Div(_1, const 0_u64);
           StorageDead(_20);
-          _18 = opaque::<u64>(move _19) -> [return: bb8, unwind unreachable];
+          _18 = opaque::<u64>(move _19) -> [return: bb7, unwind unreachable];
       }
   
-      bb8: {
+      bb7: {
           StorageDead(_19);
           StorageDead(_18);
           StorageLive(_22);
           StorageLive(_23);
           StorageLive(_24);
           _24 = _1;
--         _25 = Eq(_24, const 0_u64);
--         assert(!move _25, "attempt to divide `{}` by zero", const 0_u64) -> [success: bb9, unwind unreachable];
-+         _25 = Eq(_1, const 0_u64);
-+         assert(!_25, "attempt to divide `{}` by zero", const 0_u64) -> [success: bb9, unwind unreachable];
+-         _25 = Eq(const 1_u64, const 0_u64);
+-         assert(!move _25, "attempt to divide `{}` by zero", _24) -> [success: bb8, unwind unreachable];
++         _25 = const false;
++         assert(!const false, "attempt to divide `{}` by zero", _1) -> [success: bb8, unwind unreachable];
       }
   
-      bb9: {
--         _23 = Div(const 0_u64, move _24);
-+         _23 = Div(const 0_u64, _1);
+      bb8: {
+-         _23 = Div(move _24, const 1_u64);
++         _23 = _1;
           StorageDead(_24);
-          _22 = opaque::<u64>(move _23) -> [return: bb10, unwind unreachable];
+-         _22 = opaque::<u64>(move _23) -> [return: bb9, unwind unreachable];
++         _22 = opaque::<u64>(_1) -> [return: bb9, unwind unreachable];
       }
   
-      bb10: {
+      bb9: {
           StorageDead(_23);
           StorageDead(_22);
           StorageLive(_26);
@@ -182,79 +200,81 @@
           StorageLive(_28);
           _28 = _1;
 -         _29 = Eq(_28, const 0_u64);
--         assert(!move _29, "attempt to divide `{}` by zero", const 1_u64) -> [success: bb11, unwind unreachable];
-+         _29 = _25;
-+         assert(!_25, "attempt to divide `{}` by zero", const 1_u64) -> [success: bb11, unwind unreachable];
+-         assert(!move _29, "attempt to divide `{}` by zero", const 0_u64) -> [success: bb10, unwind unreachable];
++         _29 = Eq(_1, const 0_u64);
++         assert(!_29, "attempt to divide `{}` by zero", const 0_u64) -> [success: bb10, unwind unreachable];
       }
   
-      bb11: {
--         _27 = Div(const 1_u64, move _28);
-+         _27 = Div(const 1_u64, _1);
+      bb10: {
+-         _27 = Div(const 0_u64, move _28);
++         _27 = const 0_u64;
           StorageDead(_28);
-          _26 = opaque::<u64>(move _27) -> [return: bb12, unwind unreachable];
+-         _26 = opaque::<u64>(move _27) -> [return: bb11, unwind unreachable];
++         _26 = opaque::<u64>(const 0_u64) -> [return: bb11, unwind unreachable];
       }
   
-      bb12: {
+      bb11: {
           StorageDead(_27);
           StorageDead(_26);
           StorageLive(_30);
           StorageLive(_31);
           StorageLive(_32);
           _32 = _1;
--         _33 = Eq(const 0_u64, const 0_u64);
--         assert(!move _33, "attempt to calculate the remainder of `{}` with a divisor of zero", _32) -> [success: bb13, unwind unreachable];
-+         _33 = const true;
-+         assert(!const true, "attempt to calculate the remainder of `{}` with a divisor of zero", _1) -> [success: bb13, unwind unreachable];
+-         _33 = Eq(_32, const 0_u64);
+-         assert(!move _33, "attempt to divide `{}` by zero", const 1_u64) -> [success: bb12, unwind unreachable];
++         _33 = _29;
++         assert(!_29, "attempt to divide `{}` by zero", const 1_u64) -> [success: bb12, unwind unreachable];
       }
   
-      bb13: {
--         _31 = Rem(move _32, const 0_u64);
-+         _31 = Rem(_1, const 0_u64);
+      bb12: {
+-         _31 = Div(const 1_u64, move _32);
++         _31 = Div(const 1_u64, _1);
           StorageDead(_32);
-          _30 = opaque::<u64>(move _31) -> [return: bb14, unwind unreachable];
+          _30 = opaque::<u64>(move _31) -> [return: bb13, unwind unreachable];
       }
   
-      bb14: {
+      bb13: {
           StorageDead(_31);
           StorageDead(_30);
           StorageLive(_34);
           StorageLive(_35);
           StorageLive(_36);
           _36 = _1;
--         _37 = Eq(const 1_u64, const 0_u64);
--         assert(!move _37, "attempt to calculate the remainder of `{}` with a divisor of zero", _36) -> [success: bb15, unwind unreachable];
-+         _37 = const false;
-+         assert(!const false, "attempt to calculate the remainder of `{}` with a divisor of zero", _1) -> [success: bb15, unwind unreachable];
+-         _37 = Eq(const 0_u64, const 0_u64);
+-         assert(!move _37, "attempt to calculate the remainder of `{}` with a divisor of zero", _36) -> [success: bb14, unwind unreachable];
++         _37 = const true;
++         assert(!const true, "attempt to calculate the remainder of `{}` with a divisor of zero", _1) -> [success: bb14, unwind unreachable];
       }
   
-      bb15: {
--         _35 = Rem(move _36, const 1_u64);
-+         _35 = Rem(_1, const 1_u64);
+      bb14: {
+-         _35 = Rem(move _36, const 0_u64);
++         _35 = Rem(_1, const 0_u64);
           StorageDead(_36);
-          _34 = opaque::<u64>(move _35) -> [return: bb16, unwind unreachable];
+          _34 = opaque::<u64>(move _35) -> [return: bb15, unwind unreachable];
       }
   
-      bb16: {
+      bb15: {
           StorageDead(_35);
           StorageDead(_34);
           StorageLive(_38);
           StorageLive(_39);
           StorageLive(_40);
           _40 = _1;
--         _41 = Eq(_40, const 0_u64);
--         assert(!move _41, "attempt to calculate the remainder of `{}` with a divisor of zero", const 0_u64) -> [success: bb17, unwind unreachable];
-+         _41 = _25;
-+         assert(!_25, "attempt to calculate the remainder of `{}` with a divisor of zero", const 0_u64) -> [success: bb17, unwind unreachable];
+-         _41 = Eq(const 1_u64, const 0_u64);
+-         assert(!move _41, "attempt to calculate the remainder of `{}` with a divisor of zero", _40) -> [success: bb16, unwind unreachable];
++         _41 = const false;
++         assert(!const false, "attempt to calculate the remainder of `{}` with a divisor of zero", _1) -> [success: bb16, unwind unreachable];
       }
   
-      bb17: {
--         _39 = Rem(const 0_u64, move _40);
-+         _39 = Rem(const 0_u64, _1);
+      bb16: {
+-         _39 = Rem(move _40, const 1_u64);
++         _39 = const 0_u64;
           StorageDead(_40);
-          _38 = opaque::<u64>(move _39) -> [return: bb18, unwind unreachable];
+-         _38 = opaque::<u64>(move _39) -> [return: bb17, unwind unreachable];
++         _38 = opaque::<u64>(const 0_u64) -> [return: bb17, unwind unreachable];
       }
   
-      bb18: {
+      bb17: {
           StorageDead(_39);
           StorageDead(_38);
           StorageLive(_42);
@@ -262,27 +282,35 @@
           StorageLive(_44);
           _44 = _1;
 -         _45 = Eq(_44, const 0_u64);
--         assert(!move _45, "attempt to calculate the remainder of `{}` with a divisor of zero", const 1_u64) -> [success: bb19, unwind unreachable];
-+         _45 = _25;
-+         assert(!_25, "attempt to calculate the remainder of `{}` with a divisor of zero", const 1_u64) -> [success: bb19, unwind unreachable];
+-         assert(!move _45, "attempt to calculate the remainder of `{}` with a divisor of zero", const 0_u64) -> [success: bb18, unwind unreachable];
++         _45 = _29;
++         assert(!_29, "attempt to calculate the remainder of `{}` with a divisor of zero", const 0_u64) -> [success: bb18, unwind unreachable];
       }
   
-      bb19: {
--         _43 = Rem(const 1_u64, move _44);
-+         _43 = Rem(const 1_u64, _1);
+      bb18: {
+-         _43 = Rem(const 0_u64, move _44);
++         _43 = const 0_u64;
           StorageDead(_44);
-          _42 = opaque::<u64>(move _43) -> [return: bb20, unwind unreachable];
+-         _42 = opaque::<u64>(move _43) -> [return: bb19, unwind unreachable];
++         _42 = opaque::<u64>(const 0_u64) -> [return: bb19, unwind unreachable];
       }
   
-      bb20: {
+      bb19: {
           StorageDead(_43);
           StorageDead(_42);
           StorageLive(_46);
           StorageLive(_47);
           StorageLive(_48);
           _48 = _1;
--         _47 = BitAnd(move _48, const 0_u64);
-+         _47 = BitAnd(_1, const 0_u64);
+-         _49 = Eq(_48, const 0_u64);
+-         assert(!move _49, "attempt to calculate the remainder of `{}` with a divisor of zero", const 1_u64) -> [success: bb20, unwind unreachable];
++         _49 = _29;
++         assert(!_29, "attempt to calculate the remainder of `{}` with a divisor of zero", const 1_u64) -> [success: bb20, unwind unreachable];
+      }
+  
+      bb20: {
+-         _47 = Rem(const 1_u64, move _48);
++         _47 = Rem(const 1_u64, _1);
           StorageDead(_48);
           _46 = opaque::<u64>(move _47) -> [return: bb21, unwind unreachable];
       }
@@ -290,58 +318,121 @@
       bb21: {
           StorageDead(_47);
           StorageDead(_46);
-          StorageLive(_49);
           StorageLive(_50);
           StorageLive(_51);
-          _51 = _1;
--         _50 = BitOr(move _51, const 0_u64);
-+         _50 = BitOr(_1, const 0_u64);
-          StorageDead(_51);
-          _49 = opaque::<u64>(move _50) -> [return: bb22, unwind unreachable];
+          StorageLive(_52);
+          _52 = _1;
+-         _51 = BitAnd(move _52, const 0_u64);
++         _51 = const 0_u64;
+          StorageDead(_52);
+-         _50 = opaque::<u64>(move _51) -> [return: bb22, unwind unreachable];
++         _50 = opaque::<u64>(const 0_u64) -> [return: bb22, unwind unreachable];
       }
   
       bb22: {
+          StorageDead(_51);
           StorageDead(_50);
-          StorageDead(_49);
-          StorageLive(_52);
           StorageLive(_53);
           StorageLive(_54);
-          _54 = _1;
--         _53 = BitXor(move _54, const 0_u64);
-+         _53 = BitXor(_1, const 0_u64);
-          StorageDead(_54);
-          _52 = opaque::<u64>(move _53) -> [return: bb23, unwind unreachable];
+          StorageLive(_55);
+          _55 = _1;
+-         _54 = BitAnd(move _55, const _);
++         _54 = _1;
+          StorageDead(_55);
+-         _53 = opaque::<u64>(move _54) -> [return: bb23, unwind unreachable];
++         _53 = opaque::<u64>(_1) -> [return: bb23, unwind unreachable];
       }
   
       bb23: {
+          StorageDead(_54);
           StorageDead(_53);
-          StorageDead(_52);
-          StorageLive(_55);
           StorageLive(_56);
           StorageLive(_57);
-          _57 = _1;
--         _56 = Shr(move _57, const 0_i32);
-+         _56 = Shr(_1, const 0_i32);
-          StorageDead(_57);
-          _55 = opaque::<u64>(move _56) -> [return: bb24, unwind unreachable];
+          StorageLive(_58);
+          _58 = _1;
+-         _57 = BitOr(move _58, const 0_u64);
++         _57 = _1;
+          StorageDead(_58);
+-         _56 = opaque::<u64>(move _57) -> [return: bb24, unwind unreachable];
++         _56 = opaque::<u64>(_1) -> [return: bb24, unwind unreachable];
       }
   
       bb24: {
+          StorageDead(_57);
           StorageDead(_56);
-          StorageDead(_55);
-          StorageLive(_58);
           StorageLive(_59);
           StorageLive(_60);
-          _60 = _1;
--         _59 = Shl(move _60, const 0_i32);
-+         _59 = Shl(_1, const 0_i32);
-          StorageDead(_60);
-          _58 = opaque::<u64>(move _59) -> [return: bb25, unwind unreachable];
+          StorageLive(_61);
+          _61 = _1;
+-         _60 = BitOr(move _61, const _);
++         _60 = const u64::MAX;
+          StorageDead(_61);
+-         _59 = opaque::<u64>(move _60) -> [return: bb25, unwind unreachable];
++         _59 = opaque::<u64>(const u64::MAX) -> [return: bb25, unwind unreachable];
       }
   
       bb25: {
+          StorageDead(_60);
           StorageDead(_59);
-          StorageDead(_58);
+          StorageLive(_62);
+          StorageLive(_63);
+          StorageLive(_64);
+          _64 = _1;
+-         _63 = BitXor(move _64, const 0_u64);
++         _63 = _1;
+          StorageDead(_64);
+-         _62 = opaque::<u64>(move _63) -> [return: bb26, unwind unreachable];
++         _62 = opaque::<u64>(_1) -> [return: bb26, unwind unreachable];
+      }
+  
+      bb26: {
+          StorageDead(_63);
+          StorageDead(_62);
+          StorageLive(_65);
+          StorageLive(_66);
+          StorageLive(_67);
+          _67 = _1;
+          StorageLive(_68);
+          _68 = _1;
+-         _66 = BitXor(move _67, move _68);
++         _66 = const 0_u64;
+          StorageDead(_68);
+          StorageDead(_67);
+-         _65 = opaque::<u64>(move _66) -> [return: bb27, unwind unreachable];
++         _65 = opaque::<u64>(const 0_u64) -> [return: bb27, unwind unreachable];
+      }
+  
+      bb27: {
+          StorageDead(_66);
+          StorageDead(_65);
+          StorageLive(_69);
+          StorageLive(_70);
+          StorageLive(_71);
+          _71 = _1;
+-         _70 = Shr(move _71, const 0_i32);
++         _70 = _1;
+          StorageDead(_71);
+-         _69 = opaque::<u64>(move _70) -> [return: bb28, unwind unreachable];
++         _69 = opaque::<u64>(_1) -> [return: bb28, unwind unreachable];
+      }
+  
+      bb28: {
+          StorageDead(_70);
+          StorageDead(_69);
+          StorageLive(_72);
+          StorageLive(_73);
+          StorageLive(_74);
+          _74 = _1;
+-         _73 = Shl(move _74, const 0_i32);
++         _73 = _1;
+          StorageDead(_74);
+-         _72 = opaque::<u64>(move _73) -> [return: bb29, unwind unreachable];
++         _72 = opaque::<u64>(_1) -> [return: bb29, unwind unreachable];
+      }
+  
+      bb29: {
+          StorageDead(_73);
+          StorageDead(_72);
           _0 = const ();
           return;
       }
diff --git a/tests/mir-opt/gvn.arithmetic.GVN.panic-unwind.diff b/tests/mir-opt/gvn.arithmetic.GVN.panic-unwind.diff
index 9d69353934c..98e92d2a310 100644
--- a/tests/mir-opt/gvn.arithmetic.GVN.panic-unwind.diff
+++ b/tests/mir-opt/gvn.arithmetic.GVN.panic-unwind.diff
@@ -13,13 +13,13 @@
       let _8: ();
       let mut _9: u64;
       let mut _10: u64;
-      let _11: ();
-      let mut _12: u64;
+      let mut _11: u64;
+      let _12: ();
       let mut _13: u64;
-      let _14: ();
-      let mut _15: u64;
+      let mut _14: u64;
+      let _15: ();
       let mut _16: u64;
-      let mut _17: bool;
+      let mut _17: u64;
       let _18: ();
       let mut _19: u64;
       let mut _20: u64;
@@ -51,18 +51,32 @@
       let _46: ();
       let mut _47: u64;
       let mut _48: u64;
-      let _49: ();
-      let mut _50: u64;
+      let mut _49: bool;
+      let _50: ();
       let mut _51: u64;
-      let _52: ();
-      let mut _53: u64;
+      let mut _52: u64;
+      let _53: ();
       let mut _54: u64;
-      let _55: ();
-      let mut _56: u64;
+      let mut _55: u64;
+      let _56: ();
       let mut _57: u64;
-      let _58: ();
-      let mut _59: u64;
+      let mut _58: u64;
+      let _59: ();
       let mut _60: u64;
+      let mut _61: u64;
+      let _62: ();
+      let mut _63: u64;
+      let mut _64: u64;
+      let _65: ();
+      let mut _66: u64;
+      let mut _67: u64;
+      let mut _68: u64;
+      let _69: ();
+      let mut _70: u64;
+      let mut _71: u64;
+      let _72: ();
+      let mut _73: u64;
+      let mut _74: u64;
   
       bb0: {
           StorageLive(_2);
@@ -70,9 +84,10 @@
           StorageLive(_4);
           _4 = _1;
 -         _3 = Add(move _4, const 0_u64);
-+         _3 = Add(_1, const 0_u64);
++         _3 = _1;
           StorageDead(_4);
-          _2 = opaque::<u64>(move _3) -> [return: bb1, unwind continue];
+-         _2 = opaque::<u64>(move _3) -> [return: bb1, unwind continue];
++         _2 = opaque::<u64>(_1) -> [return: bb1, unwind continue];
       }
   
       bb1: {
@@ -83,98 +98,101 @@
           StorageLive(_7);
           _7 = _1;
 -         _6 = Sub(move _7, const 0_u64);
-+         _6 = Sub(_1, const 0_u64);
++         _6 = _1;
           StorageDead(_7);
-          _5 = opaque::<u64>(move _6) -> [return: bb2, unwind continue];
+-         _5 = opaque::<u64>(move _6) -> [return: bb2, unwind continue];
++         _5 = opaque::<u64>(_1) -> [return: bb2, unwind continue];
       }
   
       bb2: {
           StorageDead(_6);
           StorageDead(_5);
           StorageLive(_8);
-          StorageLive(_9);
+-         StorageLive(_9);
++         nop;
           StorageLive(_10);
           _10 = _1;
--         _9 = Mul(move _10, const 0_u64);
-+         _9 = Mul(_1, const 0_u64);
+          StorageLive(_11);
+          _11 = _1;
+-         _9 = Sub(move _10, move _11);
++         _9 = const 0_u64;
+          StorageDead(_11);
           StorageDead(_10);
-          _8 = opaque::<u64>(move _9) -> [return: bb3, unwind continue];
+-         _8 = opaque::<u64>(move _9) -> [return: bb3, unwind continue];
++         _8 = opaque::<u64>(const 0_u64) -> [return: bb3, unwind continue];
       }
   
       bb3: {
-          StorageDead(_9);
+-         StorageDead(_9);
++         nop;
           StorageDead(_8);
-          StorageLive(_11);
           StorageLive(_12);
           StorageLive(_13);
-          _13 = _1;
--         _12 = Mul(move _13, const 1_u64);
-+         _12 = Mul(_1, const 1_u64);
-          StorageDead(_13);
-          _11 = opaque::<u64>(move _12) -> [return: bb4, unwind continue];
+          StorageLive(_14);
+          _14 = _1;
+-         _13 = Mul(move _14, const 0_u64);
++         _13 = const 0_u64;
+          StorageDead(_14);
+-         _12 = opaque::<u64>(move _13) -> [return: bb4, unwind continue];
++         _12 = opaque::<u64>(const 0_u64) -> [return: bb4, unwind continue];
       }
   
       bb4: {
+          StorageDead(_13);
           StorageDead(_12);
-          StorageDead(_11);
-          StorageLive(_14);
           StorageLive(_15);
           StorageLive(_16);
-          _16 = _1;
--         _17 = Eq(const 0_u64, const 0_u64);
--         assert(!move _17, "attempt to divide `{}` by zero", _16) -> [success: bb5, unwind continue];
-+         _17 = const true;
-+         assert(!const true, "attempt to divide `{}` by zero", _1) -> [success: bb5, unwind continue];
+          StorageLive(_17);
+          _17 = _1;
+-         _16 = Mul(move _17, const 1_u64);
++         _16 = _1;
+          StorageDead(_17);
+-         _15 = opaque::<u64>(move _16) -> [return: bb5, unwind continue];
++         _15 = opaque::<u64>(_1) -> [return: bb5, unwind continue];
       }
   
       bb5: {
--         _15 = Div(move _16, const 0_u64);
-+         _15 = Div(_1, const 0_u64);
           StorageDead(_16);
-          _14 = opaque::<u64>(move _15) -> [return: bb6, unwind continue];
-      }
-  
-      bb6: {
           StorageDead(_15);
-          StorageDead(_14);
           StorageLive(_18);
           StorageLive(_19);
           StorageLive(_20);
           _20 = _1;
--         _21 = Eq(const 1_u64, const 0_u64);
--         assert(!move _21, "attempt to divide `{}` by zero", _20) -> [success: bb7, unwind continue];
-+         _21 = const false;
-+         assert(!const false, "attempt to divide `{}` by zero", _1) -> [success: bb7, unwind continue];
+-         _21 = Eq(const 0_u64, const 0_u64);
+-         assert(!move _21, "attempt to divide `{}` by zero", _20) -> [success: bb6, unwind continue];
++         _21 = const true;
++         assert(!const true, "attempt to divide `{}` by zero", _1) -> [success: bb6, unwind continue];
       }
   
-      bb7: {
--         _19 = Div(move _20, const 1_u64);
-+         _19 = Div(_1, const 1_u64);
+      bb6: {
+-         _19 = Div(move _20, const 0_u64);
++         _19 = Div(_1, const 0_u64);
           StorageDead(_20);
-          _18 = opaque::<u64>(move _19) -> [return: bb8, unwind continue];
+          _18 = opaque::<u64>(move _19) -> [return: bb7, unwind continue];
       }
   
-      bb8: {
+      bb7: {
           StorageDead(_19);
           StorageDead(_18);
           StorageLive(_22);
           StorageLive(_23);
           StorageLive(_24);
           _24 = _1;
--         _25 = Eq(_24, const 0_u64);
--         assert(!move _25, "attempt to divide `{}` by zero", const 0_u64) -> [success: bb9, unwind continue];
-+         _25 = Eq(_1, const 0_u64);
-+         assert(!_25, "attempt to divide `{}` by zero", const 0_u64) -> [success: bb9, unwind continue];
+-         _25 = Eq(const 1_u64, const 0_u64);
+-         assert(!move _25, "attempt to divide `{}` by zero", _24) -> [success: bb8, unwind continue];
++         _25 = const false;
++         assert(!const false, "attempt to divide `{}` by zero", _1) -> [success: bb8, unwind continue];
       }
   
-      bb9: {
--         _23 = Div(const 0_u64, move _24);
-+         _23 = Div(const 0_u64, _1);
+      bb8: {
+-         _23 = Div(move _24, const 1_u64);
++         _23 = _1;
           StorageDead(_24);
-          _22 = opaque::<u64>(move _23) -> [return: bb10, unwind continue];
+-         _22 = opaque::<u64>(move _23) -> [return: bb9, unwind continue];
++         _22 = opaque::<u64>(_1) -> [return: bb9, unwind continue];
       }
   
-      bb10: {
+      bb9: {
           StorageDead(_23);
           StorageDead(_22);
           StorageLive(_26);
@@ -182,79 +200,81 @@
           StorageLive(_28);
           _28 = _1;
 -         _29 = Eq(_28, const 0_u64);
--         assert(!move _29, "attempt to divide `{}` by zero", const 1_u64) -> [success: bb11, unwind continue];
-+         _29 = _25;
-+         assert(!_25, "attempt to divide `{}` by zero", const 1_u64) -> [success: bb11, unwind continue];
+-         assert(!move _29, "attempt to divide `{}` by zero", const 0_u64) -> [success: bb10, unwind continue];
++         _29 = Eq(_1, const 0_u64);
++         assert(!_29, "attempt to divide `{}` by zero", const 0_u64) -> [success: bb10, unwind continue];
       }
   
-      bb11: {
--         _27 = Div(const 1_u64, move _28);
-+         _27 = Div(const 1_u64, _1);
+      bb10: {
+-         _27 = Div(const 0_u64, move _28);
++         _27 = const 0_u64;
           StorageDead(_28);
-          _26 = opaque::<u64>(move _27) -> [return: bb12, unwind continue];
+-         _26 = opaque::<u64>(move _27) -> [return: bb11, unwind continue];
++         _26 = opaque::<u64>(const 0_u64) -> [return: bb11, unwind continue];
       }
   
-      bb12: {
+      bb11: {
           StorageDead(_27);
           StorageDead(_26);
           StorageLive(_30);
           StorageLive(_31);
           StorageLive(_32);
           _32 = _1;
--         _33 = Eq(const 0_u64, const 0_u64);
--         assert(!move _33, "attempt to calculate the remainder of `{}` with a divisor of zero", _32) -> [success: bb13, unwind continue];
-+         _33 = const true;
-+         assert(!const true, "attempt to calculate the remainder of `{}` with a divisor of zero", _1) -> [success: bb13, unwind continue];
+-         _33 = Eq(_32, const 0_u64);
+-         assert(!move _33, "attempt to divide `{}` by zero", const 1_u64) -> [success: bb12, unwind continue];
++         _33 = _29;
++         assert(!_29, "attempt to divide `{}` by zero", const 1_u64) -> [success: bb12, unwind continue];
       }
   
-      bb13: {
--         _31 = Rem(move _32, const 0_u64);
-+         _31 = Rem(_1, const 0_u64);
+      bb12: {
+-         _31 = Div(const 1_u64, move _32);
++         _31 = Div(const 1_u64, _1);
           StorageDead(_32);
-          _30 = opaque::<u64>(move _31) -> [return: bb14, unwind continue];
+          _30 = opaque::<u64>(move _31) -> [return: bb13, unwind continue];
       }
   
-      bb14: {
+      bb13: {
           StorageDead(_31);
           StorageDead(_30);
           StorageLive(_34);
           StorageLive(_35);
           StorageLive(_36);
           _36 = _1;
--         _37 = Eq(const 1_u64, const 0_u64);
--         assert(!move _37, "attempt to calculate the remainder of `{}` with a divisor of zero", _36) -> [success: bb15, unwind continue];
-+         _37 = const false;
-+         assert(!const false, "attempt to calculate the remainder of `{}` with a divisor of zero", _1) -> [success: bb15, unwind continue];
+-         _37 = Eq(const 0_u64, const 0_u64);
+-         assert(!move _37, "attempt to calculate the remainder of `{}` with a divisor of zero", _36) -> [success: bb14, unwind continue];
++         _37 = const true;
++         assert(!const true, "attempt to calculate the remainder of `{}` with a divisor of zero", _1) -> [success: bb14, unwind continue];
       }
   
-      bb15: {
--         _35 = Rem(move _36, const 1_u64);
-+         _35 = Rem(_1, const 1_u64);
+      bb14: {
+-         _35 = Rem(move _36, const 0_u64);
++         _35 = Rem(_1, const 0_u64);
           StorageDead(_36);
-          _34 = opaque::<u64>(move _35) -> [return: bb16, unwind continue];
+          _34 = opaque::<u64>(move _35) -> [return: bb15, unwind continue];
       }
   
-      bb16: {
+      bb15: {
           StorageDead(_35);
           StorageDead(_34);
           StorageLive(_38);
           StorageLive(_39);
           StorageLive(_40);
           _40 = _1;
--         _41 = Eq(_40, const 0_u64);
--         assert(!move _41, "attempt to calculate the remainder of `{}` with a divisor of zero", const 0_u64) -> [success: bb17, unwind continue];
-+         _41 = _25;
-+         assert(!_25, "attempt to calculate the remainder of `{}` with a divisor of zero", const 0_u64) -> [success: bb17, unwind continue];
+-         _41 = Eq(const 1_u64, const 0_u64);
+-         assert(!move _41, "attempt to calculate the remainder of `{}` with a divisor of zero", _40) -> [success: bb16, unwind continue];
++         _41 = const false;
++         assert(!const false, "attempt to calculate the remainder of `{}` with a divisor of zero", _1) -> [success: bb16, unwind continue];
       }
   
-      bb17: {
--         _39 = Rem(const 0_u64, move _40);
-+         _39 = Rem(const 0_u64, _1);
+      bb16: {
+-         _39 = Rem(move _40, const 1_u64);
++         _39 = const 0_u64;
           StorageDead(_40);
-          _38 = opaque::<u64>(move _39) -> [return: bb18, unwind continue];
+-         _38 = opaque::<u64>(move _39) -> [return: bb17, unwind continue];
++         _38 = opaque::<u64>(const 0_u64) -> [return: bb17, unwind continue];
       }
   
-      bb18: {
+      bb17: {
           StorageDead(_39);
           StorageDead(_38);
           StorageLive(_42);
@@ -262,27 +282,35 @@
           StorageLive(_44);
           _44 = _1;
 -         _45 = Eq(_44, const 0_u64);
--         assert(!move _45, "attempt to calculate the remainder of `{}` with a divisor of zero", const 1_u64) -> [success: bb19, unwind continue];
-+         _45 = _25;
-+         assert(!_25, "attempt to calculate the remainder of `{}` with a divisor of zero", const 1_u64) -> [success: bb19, unwind continue];
+-         assert(!move _45, "attempt to calculate the remainder of `{}` with a divisor of zero", const 0_u64) -> [success: bb18, unwind continue];
++         _45 = _29;
++         assert(!_29, "attempt to calculate the remainder of `{}` with a divisor of zero", const 0_u64) -> [success: bb18, unwind continue];
       }
   
-      bb19: {
--         _43 = Rem(const 1_u64, move _44);
-+         _43 = Rem(const 1_u64, _1);
+      bb18: {
+-         _43 = Rem(const 0_u64, move _44);
++         _43 = const 0_u64;
           StorageDead(_44);
-          _42 = opaque::<u64>(move _43) -> [return: bb20, unwind continue];
+-         _42 = opaque::<u64>(move _43) -> [return: bb19, unwind continue];
++         _42 = opaque::<u64>(const 0_u64) -> [return: bb19, unwind continue];
       }
   
-      bb20: {
+      bb19: {
           StorageDead(_43);
           StorageDead(_42);
           StorageLive(_46);
           StorageLive(_47);
           StorageLive(_48);
           _48 = _1;
--         _47 = BitAnd(move _48, const 0_u64);
-+         _47 = BitAnd(_1, const 0_u64);
+-         _49 = Eq(_48, const 0_u64);
+-         assert(!move _49, "attempt to calculate the remainder of `{}` with a divisor of zero", const 1_u64) -> [success: bb20, unwind continue];
++         _49 = _29;
++         assert(!_29, "attempt to calculate the remainder of `{}` with a divisor of zero", const 1_u64) -> [success: bb20, unwind continue];
+      }
+  
+      bb20: {
+-         _47 = Rem(const 1_u64, move _48);
++         _47 = Rem(const 1_u64, _1);
           StorageDead(_48);
           _46 = opaque::<u64>(move _47) -> [return: bb21, unwind continue];
       }
@@ -290,58 +318,121 @@
       bb21: {
           StorageDead(_47);
           StorageDead(_46);
-          StorageLive(_49);
           StorageLive(_50);
           StorageLive(_51);
-          _51 = _1;
--         _50 = BitOr(move _51, const 0_u64);
-+         _50 = BitOr(_1, const 0_u64);
-          StorageDead(_51);
-          _49 = opaque::<u64>(move _50) -> [return: bb22, unwind continue];
+          StorageLive(_52);
+          _52 = _1;
+-         _51 = BitAnd(move _52, const 0_u64);
++         _51 = const 0_u64;
+          StorageDead(_52);
+-         _50 = opaque::<u64>(move _51) -> [return: bb22, unwind continue];
++         _50 = opaque::<u64>(const 0_u64) -> [return: bb22, unwind continue];
       }
   
       bb22: {
+          StorageDead(_51);
           StorageDead(_50);
-          StorageDead(_49);
-          StorageLive(_52);
           StorageLive(_53);
           StorageLive(_54);
-          _54 = _1;
--         _53 = BitXor(move _54, const 0_u64);
-+         _53 = BitXor(_1, const 0_u64);
-          StorageDead(_54);
-          _52 = opaque::<u64>(move _53) -> [return: bb23, unwind continue];
+          StorageLive(_55);
+          _55 = _1;
+-         _54 = BitAnd(move _55, const _);
++         _54 = _1;
+          StorageDead(_55);
+-         _53 = opaque::<u64>(move _54) -> [return: bb23, unwind continue];
++         _53 = opaque::<u64>(_1) -> [return: bb23, unwind continue];
       }
   
       bb23: {
+          StorageDead(_54);
           StorageDead(_53);
-          StorageDead(_52);
-          StorageLive(_55);
           StorageLive(_56);
           StorageLive(_57);
-          _57 = _1;
--         _56 = Shr(move _57, const 0_i32);
-+         _56 = Shr(_1, const 0_i32);
-          StorageDead(_57);
-          _55 = opaque::<u64>(move _56) -> [return: bb24, unwind continue];
+          StorageLive(_58);
+          _58 = _1;
+-         _57 = BitOr(move _58, const 0_u64);
++         _57 = _1;
+          StorageDead(_58);
+-         _56 = opaque::<u64>(move _57) -> [return: bb24, unwind continue];
++         _56 = opaque::<u64>(_1) -> [return: bb24, unwind continue];
       }
   
       bb24: {
+          StorageDead(_57);
           StorageDead(_56);
-          StorageDead(_55);
-          StorageLive(_58);
           StorageLive(_59);
           StorageLive(_60);
-          _60 = _1;
--         _59 = Shl(move _60, const 0_i32);
-+         _59 = Shl(_1, const 0_i32);
-          StorageDead(_60);
-          _58 = opaque::<u64>(move _59) -> [return: bb25, unwind continue];
+          StorageLive(_61);
+          _61 = _1;
+-         _60 = BitOr(move _61, const _);
++         _60 = const u64::MAX;
+          StorageDead(_61);
+-         _59 = opaque::<u64>(move _60) -> [return: bb25, unwind continue];
++         _59 = opaque::<u64>(const u64::MAX) -> [return: bb25, unwind continue];
       }
   
       bb25: {
+          StorageDead(_60);
           StorageDead(_59);
-          StorageDead(_58);
+          StorageLive(_62);
+          StorageLive(_63);
+          StorageLive(_64);
+          _64 = _1;
+-         _63 = BitXor(move _64, const 0_u64);
++         _63 = _1;
+          StorageDead(_64);
+-         _62 = opaque::<u64>(move _63) -> [return: bb26, unwind continue];
++         _62 = opaque::<u64>(_1) -> [return: bb26, unwind continue];
+      }
+  
+      bb26: {
+          StorageDead(_63);
+          StorageDead(_62);
+          StorageLive(_65);
+          StorageLive(_66);
+          StorageLive(_67);
+          _67 = _1;
+          StorageLive(_68);
+          _68 = _1;
+-         _66 = BitXor(move _67, move _68);
++         _66 = const 0_u64;
+          StorageDead(_68);
+          StorageDead(_67);
+-         _65 = opaque::<u64>(move _66) -> [return: bb27, unwind continue];
++         _65 = opaque::<u64>(const 0_u64) -> [return: bb27, unwind continue];
+      }
+  
+      bb27: {
+          StorageDead(_66);
+          StorageDead(_65);
+          StorageLive(_69);
+          StorageLive(_70);
+          StorageLive(_71);
+          _71 = _1;
+-         _70 = Shr(move _71, const 0_i32);
++         _70 = _1;
+          StorageDead(_71);
+-         _69 = opaque::<u64>(move _70) -> [return: bb28, unwind continue];
++         _69 = opaque::<u64>(_1) -> [return: bb28, unwind continue];
+      }
+  
+      bb28: {
+          StorageDead(_70);
+          StorageDead(_69);
+          StorageLive(_72);
+          StorageLive(_73);
+          StorageLive(_74);
+          _74 = _1;
+-         _73 = Shl(move _74, const 0_i32);
++         _73 = _1;
+          StorageDead(_74);
+-         _72 = opaque::<u64>(move _73) -> [return: bb29, unwind continue];
++         _72 = opaque::<u64>(_1) -> [return: bb29, unwind continue];
+      }
+  
+      bb29: {
+          StorageDead(_73);
+          StorageDead(_72);
           _0 = const ();
           return;
       }
diff --git a/tests/mir-opt/gvn.arithmetic_checked.GVN.panic-abort.diff b/tests/mir-opt/gvn.arithmetic_checked.GVN.panic-abort.diff
index 6633df3ae70..a45d9920a68 100644
--- a/tests/mir-opt/gvn.arithmetic_checked.GVN.panic-abort.diff
+++ b/tests/mir-opt/gvn.arithmetic_checked.GVN.panic-abort.diff
@@ -15,11 +15,16 @@
       let _10: ();
       let mut _11: u64;
       let mut _12: u64;
-      let mut _13: (u64, bool);
-      let _14: ();
-      let mut _15: u64;
+      let mut _13: u64;
+      let mut _14: (u64, bool);
+      let _15: ();
       let mut _16: u64;
-      let mut _17: (u64, bool);
+      let mut _17: u64;
+      let mut _18: (u64, bool);
+      let _19: ();
+      let mut _20: u64;
+      let mut _21: u64;
+      let mut _22: (u64, bool);
   
       bb0: {
           StorageLive(_2);
@@ -29,13 +34,15 @@
 -         _5 = CheckedAdd(_4, const 0_u64);
 -         assert(!move (_5.1: bool), "attempt to compute `{} + {}`, which would overflow", move _4, const 0_u64) -> [success: bb1, unwind unreachable];
 +         _5 = CheckedAdd(_1, const 0_u64);
-+         assert(!move (_5.1: bool), "attempt to compute `{} + {}`, which would overflow", _1, const 0_u64) -> [success: bb1, unwind unreachable];
++         assert(!const false, "attempt to compute `{} + {}`, which would overflow", _1, const 0_u64) -> [success: bb1, unwind unreachable];
       }
   
       bb1: {
-          _3 = move (_5.0: u64);
+-         _3 = move (_5.0: u64);
++         _3 = _1;
           StorageDead(_4);
-          _2 = opaque::<u64>(move _3) -> [return: bb2, unwind unreachable];
+-         _2 = opaque::<u64>(move _3) -> [return: bb2, unwind unreachable];
++         _2 = opaque::<u64>(_1) -> [return: bb2, unwind unreachable];
       }
   
       bb2: {
@@ -47,59 +54,95 @@
           _8 = _1;
 -         _9 = CheckedSub(_8, const 0_u64);
 -         assert(!move (_9.1: bool), "attempt to compute `{} - {}`, which would overflow", move _8, const 0_u64) -> [success: bb3, unwind unreachable];
-+         _9 = CheckedSub(_1, const 0_u64);
-+         assert(!move (_9.1: bool), "attempt to compute `{} - {}`, which would overflow", _1, const 0_u64) -> [success: bb3, unwind unreachable];
++         _9 = _5;
++         assert(!const false, "attempt to compute `{} - {}`, which would overflow", _1, const 0_u64) -> [success: bb3, unwind unreachable];
       }
   
       bb3: {
-          _7 = move (_9.0: u64);
+-         _7 = move (_9.0: u64);
++         _7 = _1;
           StorageDead(_8);
-          _6 = opaque::<u64>(move _7) -> [return: bb4, unwind unreachable];
+-         _6 = opaque::<u64>(move _7) -> [return: bb4, unwind unreachable];
++         _6 = opaque::<u64>(_1) -> [return: bb4, unwind unreachable];
       }
   
       bb4: {
           StorageDead(_7);
           StorageDead(_6);
           StorageLive(_10);
-          StorageLive(_11);
+-         StorageLive(_11);
++         nop;
           StorageLive(_12);
           _12 = _1;
--         _13 = CheckedMul(_12, const 0_u64);
--         assert(!move (_13.1: bool), "attempt to compute `{} * {}`, which would overflow", move _12, const 0_u64) -> [success: bb5, unwind unreachable];
-+         _13 = CheckedMul(_1, const 0_u64);
-+         assert(!move (_13.1: bool), "attempt to compute `{} * {}`, which would overflow", _1, const 0_u64) -> [success: bb5, unwind unreachable];
+          StorageLive(_13);
+          _13 = _1;
+-         _14 = CheckedSub(_12, _13);
+-         assert(!move (_14.1: bool), "attempt to compute `{} - {}`, which would overflow", move _12, move _13) -> [success: bb5, unwind unreachable];
++         _14 = const (0_u64, false);
++         assert(!const false, "attempt to compute `{} - {}`, which would overflow", _1, _1) -> [success: bb5, unwind unreachable];
       }
   
       bb5: {
-          _11 = move (_13.0: u64);
+-         _11 = move (_14.0: u64);
++         _11 = const 0_u64;
+          StorageDead(_13);
           StorageDead(_12);
-          _10 = opaque::<u64>(move _11) -> [return: bb6, unwind unreachable];
+-         _10 = opaque::<u64>(move _11) -> [return: bb6, unwind unreachable];
++         _10 = opaque::<u64>(const 0_u64) -> [return: bb6, unwind unreachable];
       }
   
       bb6: {
-          StorageDead(_11);
+-         StorageDead(_11);
++         nop;
           StorageDead(_10);
-          StorageLive(_14);
           StorageLive(_15);
           StorageLive(_16);
-          _16 = _1;
--         _17 = CheckedMul(_16, const 1_u64);
--         assert(!move (_17.1: bool), "attempt to compute `{} * {}`, which would overflow", move _16, const 1_u64) -> [success: bb7, unwind unreachable];
-+         _17 = CheckedMul(_1, const 1_u64);
-+         assert(!move (_17.1: bool), "attempt to compute `{} * {}`, which would overflow", _1, const 1_u64) -> [success: bb7, unwind unreachable];
+          StorageLive(_17);
+          _17 = _1;
+-         _18 = CheckedMul(_17, const 0_u64);
+-         assert(!move (_18.1: bool), "attempt to compute `{} * {}`, which would overflow", move _17, const 0_u64) -> [success: bb7, unwind unreachable];
++         _18 = const (0_u64, false);
++         assert(!const false, "attempt to compute `{} * {}`, which would overflow", _1, const 0_u64) -> [success: bb7, unwind unreachable];
       }
   
       bb7: {
-          _15 = move (_17.0: u64);
-          StorageDead(_16);
-          _14 = opaque::<u64>(move _15) -> [return: bb8, unwind unreachable];
+-         _16 = move (_18.0: u64);
++         _16 = const 0_u64;
+          StorageDead(_17);
+-         _15 = opaque::<u64>(move _16) -> [return: bb8, unwind unreachable];
++         _15 = opaque::<u64>(const 0_u64) -> [return: bb8, unwind unreachable];
       }
   
       bb8: {
+          StorageDead(_16);
           StorageDead(_15);
-          StorageDead(_14);
+          StorageLive(_19);
+          StorageLive(_20);
+          StorageLive(_21);
+          _21 = _1;
+-         _22 = CheckedMul(_21, const 1_u64);
+-         assert(!move (_22.1: bool), "attempt to compute `{} * {}`, which would overflow", move _21, const 1_u64) -> [success: bb9, unwind unreachable];
++         _22 = _5;
++         assert(!const false, "attempt to compute `{} * {}`, which would overflow", _1, const 1_u64) -> [success: bb9, unwind unreachable];
+      }
+  
+      bb9: {
+-         _20 = move (_22.0: u64);
++         _20 = _1;
+          StorageDead(_21);
+-         _19 = opaque::<u64>(move _20) -> [return: bb10, unwind unreachable];
++         _19 = opaque::<u64>(_1) -> [return: bb10, unwind unreachable];
+      }
+  
+      bb10: {
+          StorageDead(_20);
+          StorageDead(_19);
           _0 = const ();
           return;
       }
++ }
++ 
++ ALLOC0 (size: 16, align: 8) {
++     00 00 00 00 00 00 00 00 00 __ __ __ __ __ __ __ │ .........░░░░░░░
   }
   
diff --git a/tests/mir-opt/gvn.arithmetic_checked.GVN.panic-unwind.diff b/tests/mir-opt/gvn.arithmetic_checked.GVN.panic-unwind.diff
index d100a77fee5..9033b392bd4 100644
--- a/tests/mir-opt/gvn.arithmetic_checked.GVN.panic-unwind.diff
+++ b/tests/mir-opt/gvn.arithmetic_checked.GVN.panic-unwind.diff
@@ -15,11 +15,16 @@
       let _10: ();
       let mut _11: u64;
       let mut _12: u64;
-      let mut _13: (u64, bool);
-      let _14: ();
-      let mut _15: u64;
+      let mut _13: u64;
+      let mut _14: (u64, bool);
+      let _15: ();
       let mut _16: u64;
-      let mut _17: (u64, bool);
+      let mut _17: u64;
+      let mut _18: (u64, bool);
+      let _19: ();
+      let mut _20: u64;
+      let mut _21: u64;
+      let mut _22: (u64, bool);
   
       bb0: {
           StorageLive(_2);
@@ -29,13 +34,15 @@
 -         _5 = CheckedAdd(_4, const 0_u64);
 -         assert(!move (_5.1: bool), "attempt to compute `{} + {}`, which would overflow", move _4, const 0_u64) -> [success: bb1, unwind continue];
 +         _5 = CheckedAdd(_1, const 0_u64);
-+         assert(!move (_5.1: bool), "attempt to compute `{} + {}`, which would overflow", _1, const 0_u64) -> [success: bb1, unwind continue];
++         assert(!const false, "attempt to compute `{} + {}`, which would overflow", _1, const 0_u64) -> [success: bb1, unwind continue];
       }
   
       bb1: {
-          _3 = move (_5.0: u64);
+-         _3 = move (_5.0: u64);
++         _3 = _1;
           StorageDead(_4);
-          _2 = opaque::<u64>(move _3) -> [return: bb2, unwind continue];
+-         _2 = opaque::<u64>(move _3) -> [return: bb2, unwind continue];
++         _2 = opaque::<u64>(_1) -> [return: bb2, unwind continue];
       }
   
       bb2: {
@@ -47,59 +54,95 @@
           _8 = _1;
 -         _9 = CheckedSub(_8, const 0_u64);
 -         assert(!move (_9.1: bool), "attempt to compute `{} - {}`, which would overflow", move _8, const 0_u64) -> [success: bb3, unwind continue];
-+         _9 = CheckedSub(_1, const 0_u64);
-+         assert(!move (_9.1: bool), "attempt to compute `{} - {}`, which would overflow", _1, const 0_u64) -> [success: bb3, unwind continue];
++         _9 = _5;
++         assert(!const false, "attempt to compute `{} - {}`, which would overflow", _1, const 0_u64) -> [success: bb3, unwind continue];
       }
   
       bb3: {
-          _7 = move (_9.0: u64);
+-         _7 = move (_9.0: u64);
++         _7 = _1;
           StorageDead(_8);
-          _6 = opaque::<u64>(move _7) -> [return: bb4, unwind continue];
+-         _6 = opaque::<u64>(move _7) -> [return: bb4, unwind continue];
++         _6 = opaque::<u64>(_1) -> [return: bb4, unwind continue];
       }
   
       bb4: {
           StorageDead(_7);
           StorageDead(_6);
           StorageLive(_10);
-          StorageLive(_11);
+-         StorageLive(_11);
++         nop;
           StorageLive(_12);
           _12 = _1;
--         _13 = CheckedMul(_12, const 0_u64);
--         assert(!move (_13.1: bool), "attempt to compute `{} * {}`, which would overflow", move _12, const 0_u64) -> [success: bb5, unwind continue];
-+         _13 = CheckedMul(_1, const 0_u64);
-+         assert(!move (_13.1: bool), "attempt to compute `{} * {}`, which would overflow", _1, const 0_u64) -> [success: bb5, unwind continue];
+          StorageLive(_13);
+          _13 = _1;
+-         _14 = CheckedSub(_12, _13);
+-         assert(!move (_14.1: bool), "attempt to compute `{} - {}`, which would overflow", move _12, move _13) -> [success: bb5, unwind continue];
++         _14 = const (0_u64, false);
++         assert(!const false, "attempt to compute `{} - {}`, which would overflow", _1, _1) -> [success: bb5, unwind continue];
       }
   
       bb5: {
-          _11 = move (_13.0: u64);
+-         _11 = move (_14.0: u64);
++         _11 = const 0_u64;
+          StorageDead(_13);
           StorageDead(_12);
-          _10 = opaque::<u64>(move _11) -> [return: bb6, unwind continue];
+-         _10 = opaque::<u64>(move _11) -> [return: bb6, unwind continue];
++         _10 = opaque::<u64>(const 0_u64) -> [return: bb6, unwind continue];
       }
   
       bb6: {
-          StorageDead(_11);
+-         StorageDead(_11);
++         nop;
           StorageDead(_10);
-          StorageLive(_14);
           StorageLive(_15);
           StorageLive(_16);
-          _16 = _1;
--         _17 = CheckedMul(_16, const 1_u64);
--         assert(!move (_17.1: bool), "attempt to compute `{} * {}`, which would overflow", move _16, const 1_u64) -> [success: bb7, unwind continue];
-+         _17 = CheckedMul(_1, const 1_u64);
-+         assert(!move (_17.1: bool), "attempt to compute `{} * {}`, which would overflow", _1, const 1_u64) -> [success: bb7, unwind continue];
+          StorageLive(_17);
+          _17 = _1;
+-         _18 = CheckedMul(_17, const 0_u64);
+-         assert(!move (_18.1: bool), "attempt to compute `{} * {}`, which would overflow", move _17, const 0_u64) -> [success: bb7, unwind continue];
++         _18 = const (0_u64, false);
++         assert(!const false, "attempt to compute `{} * {}`, which would overflow", _1, const 0_u64) -> [success: bb7, unwind continue];
       }
   
       bb7: {
-          _15 = move (_17.0: u64);
-          StorageDead(_16);
-          _14 = opaque::<u64>(move _15) -> [return: bb8, unwind continue];
+-         _16 = move (_18.0: u64);
++         _16 = const 0_u64;
+          StorageDead(_17);
+-         _15 = opaque::<u64>(move _16) -> [return: bb8, unwind continue];
++         _15 = opaque::<u64>(const 0_u64) -> [return: bb8, unwind continue];
       }
   
       bb8: {
+          StorageDead(_16);
           StorageDead(_15);
-          StorageDead(_14);
+          StorageLive(_19);
+          StorageLive(_20);
+          StorageLive(_21);
+          _21 = _1;
+-         _22 = CheckedMul(_21, const 1_u64);
+-         assert(!move (_22.1: bool), "attempt to compute `{} * {}`, which would overflow", move _21, const 1_u64) -> [success: bb9, unwind continue];
++         _22 = _5;
++         assert(!const false, "attempt to compute `{} * {}`, which would overflow", _1, const 1_u64) -> [success: bb9, unwind continue];
+      }
+  
+      bb9: {
+-         _20 = move (_22.0: u64);
++         _20 = _1;
+          StorageDead(_21);
+-         _19 = opaque::<u64>(move _20) -> [return: bb10, unwind continue];
++         _19 = opaque::<u64>(_1) -> [return: bb10, unwind continue];
+      }
+  
+      bb10: {
+          StorageDead(_20);
+          StorageDead(_19);
           _0 = const ();
           return;
       }
++ }
++ 
++ ALLOC0 (size: 16, align: 8) {
++     00 00 00 00 00 00 00 00 00 __ __ __ __ __ __ __ │ .........░░░░░░░
   }
   
diff --git a/tests/mir-opt/gvn.comparison.GVN.panic-abort.diff b/tests/mir-opt/gvn.comparison.GVN.panic-abort.diff
index ee3b9da2122..fefdf14bddc 100644
--- a/tests/mir-opt/gvn.comparison.GVN.panic-abort.diff
+++ b/tests/mir-opt/gvn.comparison.GVN.panic-abort.diff
@@ -30,10 +30,11 @@
           StorageLive(_6);
           _6 = _1;
 -         _4 = Eq(move _5, move _6);
-+         _4 = Eq(_1, _1);
++         _4 = const true;
           StorageDead(_6);
           StorageDead(_5);
-          _3 = opaque::<bool>(move _4) -> [return: bb1, unwind unreachable];
+-         _3 = opaque::<bool>(move _4) -> [return: bb1, unwind unreachable];
++         _3 = opaque::<bool>(const true) -> [return: bb1, unwind unreachable];
       }
   
       bb1: {
@@ -46,10 +47,11 @@
           StorageLive(_10);
           _10 = _1;
 -         _8 = Ne(move _9, move _10);
-+         _8 = Ne(_1, _1);
++         _8 = const false;
           StorageDead(_10);
           StorageDead(_9);
-          _7 = opaque::<bool>(move _8) -> [return: bb2, unwind unreachable];
+-         _7 = opaque::<bool>(move _8) -> [return: bb2, unwind unreachable];
++         _7 = opaque::<bool>(const false) -> [return: bb2, unwind unreachable];
       }
   
       bb2: {
diff --git a/tests/mir-opt/gvn.comparison.GVN.panic-unwind.diff b/tests/mir-opt/gvn.comparison.GVN.panic-unwind.diff
index a1408fe3434..9f19b2b59fa 100644
--- a/tests/mir-opt/gvn.comparison.GVN.panic-unwind.diff
+++ b/tests/mir-opt/gvn.comparison.GVN.panic-unwind.diff
@@ -30,10 +30,11 @@
           StorageLive(_6);
           _6 = _1;
 -         _4 = Eq(move _5, move _6);
-+         _4 = Eq(_1, _1);
++         _4 = const true;
           StorageDead(_6);
           StorageDead(_5);
-          _3 = opaque::<bool>(move _4) -> [return: bb1, unwind continue];
+-         _3 = opaque::<bool>(move _4) -> [return: bb1, unwind continue];
++         _3 = opaque::<bool>(const true) -> [return: bb1, unwind continue];
       }
   
       bb1: {
@@ -46,10 +47,11 @@
           StorageLive(_10);
           _10 = _1;
 -         _8 = Ne(move _9, move _10);
-+         _8 = Ne(_1, _1);
++         _8 = const false;
           StorageDead(_10);
           StorageDead(_9);
-          _7 = opaque::<bool>(move _8) -> [return: bb2, unwind continue];
+-         _7 = opaque::<bool>(move _8) -> [return: bb2, unwind continue];
++         _7 = opaque::<bool>(const false) -> [return: bb2, unwind continue];
       }
   
       bb2: {
diff --git a/tests/mir-opt/gvn.fn_pointers.GVN.panic-abort.diff b/tests/mir-opt/gvn.fn_pointers.GVN.panic-abort.diff
index d8248d22d38..02bf95840da 100644
--- a/tests/mir-opt/gvn.fn_pointers.GVN.panic-abort.diff
+++ b/tests/mir-opt/gvn.fn_pointers.GVN.panic-abort.diff
@@ -8,10 +8,10 @@
       let mut _3: fn(u8) -> u8;
       let _5: ();
       let mut _6: fn(u8) -> u8;
-      let mut _9: {closure@$DIR/gvn.rs:591:19: 591:21};
+      let mut _9: {closure@$DIR/gvn.rs:610:19: 610:21};
       let _10: ();
       let mut _11: fn();
-      let mut _13: {closure@$DIR/gvn.rs:591:19: 591:21};
+      let mut _13: {closure@$DIR/gvn.rs:610:19: 610:21};
       let _14: ();
       let mut _15: fn();
       scope 1 {
@@ -19,7 +19,7 @@
           let _4: fn(u8) -> u8;
           scope 2 {
               debug g => _4;
-              let _7: {closure@$DIR/gvn.rs:591:19: 591:21};
+              let _7: {closure@$DIR/gvn.rs:610:19: 610:21};
               scope 3 {
                   debug closure => _7;
                   let _8: fn();
@@ -62,16 +62,16 @@
           StorageDead(_6);
           StorageDead(_5);
 -         StorageLive(_7);
--         _7 = {closure@$DIR/gvn.rs:591:19: 591:21};
+-         _7 = {closure@$DIR/gvn.rs:610:19: 610:21};
 -         StorageLive(_8);
 +         nop;
-+         _7 = const ZeroSized: {closure@$DIR/gvn.rs:591:19: 591:21};
++         _7 = const ZeroSized: {closure@$DIR/gvn.rs:610:19: 610:21};
 +         nop;
           StorageLive(_9);
 -         _9 = _7;
 -         _8 = move _9 as fn() (PointerCoercion(ClosureFnPointer(Normal)));
-+         _9 = const ZeroSized: {closure@$DIR/gvn.rs:591:19: 591:21};
-+         _8 = const ZeroSized: {closure@$DIR/gvn.rs:591:19: 591:21} as fn() (PointerCoercion(ClosureFnPointer(Normal)));
++         _9 = const ZeroSized: {closure@$DIR/gvn.rs:610:19: 610:21};
++         _8 = const ZeroSized: {closure@$DIR/gvn.rs:610:19: 610:21} as fn() (PointerCoercion(ClosureFnPointer(Normal)));
           StorageDead(_9);
           StorageLive(_10);
           StorageLive(_11);
@@ -88,8 +88,8 @@
           StorageLive(_13);
 -         _13 = _7;
 -         _12 = move _13 as fn() (PointerCoercion(ClosureFnPointer(Normal)));
-+         _13 = const ZeroSized: {closure@$DIR/gvn.rs:591:19: 591:21};
-+         _12 = const ZeroSized: {closure@$DIR/gvn.rs:591:19: 591:21} as fn() (PointerCoercion(ClosureFnPointer(Normal)));
++         _13 = const ZeroSized: {closure@$DIR/gvn.rs:610:19: 610:21};
++         _12 = const ZeroSized: {closure@$DIR/gvn.rs:610:19: 610:21} as fn() (PointerCoercion(ClosureFnPointer(Normal)));
           StorageDead(_13);
           StorageLive(_14);
           StorageLive(_15);
diff --git a/tests/mir-opt/gvn.fn_pointers.GVN.panic-unwind.diff b/tests/mir-opt/gvn.fn_pointers.GVN.panic-unwind.diff
index e38a3d85209..c5dcc8a8ec9 100644
--- a/tests/mir-opt/gvn.fn_pointers.GVN.panic-unwind.diff
+++ b/tests/mir-opt/gvn.fn_pointers.GVN.panic-unwind.diff
@@ -8,10 +8,10 @@
       let mut _3: fn(u8) -> u8;
       let _5: ();
       let mut _6: fn(u8) -> u8;
-      let mut _9: {closure@$DIR/gvn.rs:591:19: 591:21};
+      let mut _9: {closure@$DIR/gvn.rs:610:19: 610:21};
       let _10: ();
       let mut _11: fn();
-      let mut _13: {closure@$DIR/gvn.rs:591:19: 591:21};
+      let mut _13: {closure@$DIR/gvn.rs:610:19: 610:21};
       let _14: ();
       let mut _15: fn();
       scope 1 {
@@ -19,7 +19,7 @@
           let _4: fn(u8) -> u8;
           scope 2 {
               debug g => _4;
-              let _7: {closure@$DIR/gvn.rs:591:19: 591:21};
+              let _7: {closure@$DIR/gvn.rs:610:19: 610:21};
               scope 3 {
                   debug closure => _7;
                   let _8: fn();
@@ -62,16 +62,16 @@
           StorageDead(_6);
           StorageDead(_5);
 -         StorageLive(_7);
--         _7 = {closure@$DIR/gvn.rs:591:19: 591:21};
+-         _7 = {closure@$DIR/gvn.rs:610:19: 610:21};
 -         StorageLive(_8);
 +         nop;
-+         _7 = const ZeroSized: {closure@$DIR/gvn.rs:591:19: 591:21};
++         _7 = const ZeroSized: {closure@$DIR/gvn.rs:610:19: 610:21};
 +         nop;
           StorageLive(_9);
 -         _9 = _7;
 -         _8 = move _9 as fn() (PointerCoercion(ClosureFnPointer(Normal)));
-+         _9 = const ZeroSized: {closure@$DIR/gvn.rs:591:19: 591:21};
-+         _8 = const ZeroSized: {closure@$DIR/gvn.rs:591:19: 591:21} as fn() (PointerCoercion(ClosureFnPointer(Normal)));
++         _9 = const ZeroSized: {closure@$DIR/gvn.rs:610:19: 610:21};
++         _8 = const ZeroSized: {closure@$DIR/gvn.rs:610:19: 610:21} as fn() (PointerCoercion(ClosureFnPointer(Normal)));
           StorageDead(_9);
           StorageLive(_10);
           StorageLive(_11);
@@ -88,8 +88,8 @@
           StorageLive(_13);
 -         _13 = _7;
 -         _12 = move _13 as fn() (PointerCoercion(ClosureFnPointer(Normal)));
-+         _13 = const ZeroSized: {closure@$DIR/gvn.rs:591:19: 591:21};
-+         _12 = const ZeroSized: {closure@$DIR/gvn.rs:591:19: 591:21} as fn() (PointerCoercion(ClosureFnPointer(Normal)));
++         _13 = const ZeroSized: {closure@$DIR/gvn.rs:610:19: 610:21};
++         _12 = const ZeroSized: {closure@$DIR/gvn.rs:610:19: 610:21} as fn() (PointerCoercion(ClosureFnPointer(Normal)));
           StorageDead(_13);
           StorageLive(_14);
           StorageLive(_15);
diff --git a/tests/mir-opt/gvn.repeated_index.GVN.panic-abort.diff b/tests/mir-opt/gvn.repeated_index.GVN.panic-abort.diff
index d937902e891..8ce05c9b340 100644
--- a/tests/mir-opt/gvn.repeated_index.GVN.panic-abort.diff
+++ b/tests/mir-opt/gvn.repeated_index.GVN.panic-abort.diff
@@ -32,11 +32,12 @@
           StorageLive(_6);
           StorageLive(_7);
           _7 = const 0_usize;
-          _8 = Len(_3);
+-         _8 = Len(_3);
 -         _9 = Lt(_7, _8);
 -         assert(move _9, "index out of bounds: the length is {} but the index is {}", move _8, _7) -> [success: bb1, unwind unreachable];
-+         _9 = Lt(const 0_usize, _8);
-+         assert(move _9, "index out of bounds: the length is {} but the index is {}", _8, const 0_usize) -> [success: bb1, unwind unreachable];
++         _8 = const N;
++         _9 = Lt(const 0_usize, const N);
++         assert(move _9, "index out of bounds: the length is {} but the index is {}", const N, const 0_usize) -> [success: bb1, unwind unreachable];
       }
   
       bb1: {
@@ -57,9 +58,9 @@
 -         _13 = Len(_3);
 -         _14 = Lt(_12, _13);
 -         assert(move _14, "index out of bounds: the length is {} but the index is {}", move _13, _12) -> [success: bb3, unwind unreachable];
-+         _13 = _8;
-+         _14 = Lt(_2, _8);
-+         assert(move _14, "index out of bounds: the length is {} but the index is {}", _8, _2) -> [success: bb3, unwind unreachable];
++         _13 = const N;
++         _14 = Lt(_2, const N);
++         assert(move _14, "index out of bounds: the length is {} but the index is {}", const N, _2) -> [success: bb3, unwind unreachable];
       }
   
       bb3: {
diff --git a/tests/mir-opt/gvn.repeated_index.GVN.panic-unwind.diff b/tests/mir-opt/gvn.repeated_index.GVN.panic-unwind.diff
index dd4d24b12ea..7ed547eeb4a 100644
--- a/tests/mir-opt/gvn.repeated_index.GVN.panic-unwind.diff
+++ b/tests/mir-opt/gvn.repeated_index.GVN.panic-unwind.diff
@@ -32,11 +32,12 @@
           StorageLive(_6);
           StorageLive(_7);
           _7 = const 0_usize;
-          _8 = Len(_3);
+-         _8 = Len(_3);
 -         _9 = Lt(_7, _8);
 -         assert(move _9, "index out of bounds: the length is {} but the index is {}", move _8, _7) -> [success: bb1, unwind continue];
-+         _9 = Lt(const 0_usize, _8);
-+         assert(move _9, "index out of bounds: the length is {} but the index is {}", _8, const 0_usize) -> [success: bb1, unwind continue];
++         _8 = const N;
++         _9 = Lt(const 0_usize, const N);
++         assert(move _9, "index out of bounds: the length is {} but the index is {}", const N, const 0_usize) -> [success: bb1, unwind continue];
       }
   
       bb1: {
@@ -57,9 +58,9 @@
 -         _13 = Len(_3);
 -         _14 = Lt(_12, _13);
 -         assert(move _14, "index out of bounds: the length is {} but the index is {}", move _13, _12) -> [success: bb3, unwind continue];
-+         _13 = _8;
-+         _14 = Lt(_2, _8);
-+         assert(move _14, "index out of bounds: the length is {} but the index is {}", _8, _2) -> [success: bb3, unwind continue];
++         _13 = const N;
++         _14 = Lt(_2, const N);
++         assert(move _14, "index out of bounds: the length is {} but the index is {}", const N, _2) -> [success: bb3, unwind continue];
       }
   
       bb3: {
diff --git a/tests/mir-opt/gvn.rs b/tests/mir-opt/gvn.rs
index 23e33a0fa49..31ea237cbec 100644
--- a/tests/mir-opt/gvn.rs
+++ b/tests/mir-opt/gvn.rs
@@ -166,69 +166,89 @@ fn repeated_index<T: Copy, const N: usize>(x: T, idx: usize) {
     opaque(a[idx]);
 }
 
+fn unary(x: i64) {
+    // CHECK-LABEL: fn unary(
+    // CHECK: opaque::<i64>(_1)
+    opaque(--x); // This is `x`.
+
+    // CHECK: [[b:_.*]] = Lt(_1, const 13_i64);
+    // CHECK: opaque::<bool>([[b]])
+    let b = x < 13;
+    opaque(!!b); // This is `b`.
+
+    // Both lines should test the same thing.
+    // CHECK: [[c:_.*]] = Ne(_1, const 15_i64);
+    // CHECK: opaque::<bool>([[c]])
+    // CHECK: opaque::<bool>([[c]])
+    opaque(x != 15);
+    opaque(!(x == 15));
+
+    // Both lines should test the same thing.
+    // CHECK: [[d:_.*]] = Eq(_1, const 35_i64);
+    // CHECK: opaque::<bool>([[d]])
+    // CHECK: opaque::<bool>([[d]])
+    opaque(x == 35);
+    opaque(!(x != 35));
+}
+
 /// Verify symbolic integer arithmetic simplifications.
 fn arithmetic(x: u64) {
     // CHECK-LABEL: fn arithmetic(
-    // CHECK: [[add:_.*]] = Add(_1, const 0_u64);
-    // CHECK: opaque::<u64>(move [[add]])
+    // CHECK: opaque::<u64>(_1)
     opaque(x + 0);
-    // CHECK: [[sub:_.*]] = Sub(_1, const 0_u64);
-    // CHECK: opaque::<u64>(move [[sub]])
+    // CHECK: opaque::<u64>(_1)
     opaque(x - 0);
-    // CHECK: [[mul0:_.*]] = Mul(_1, const 0_u64);
-    // CHECK: opaque::<u64>(move [[mul0]])
+    // CHECK: opaque::<u64>(const 0_u64)
+    opaque(x - x);
+    // CHECK: opaque::<u64>(const 0_u64)
     opaque(x * 0);
-    // CHECK: [[mul1:_.*]] = Mul(_1, const 1_u64);
-    // CHECK: opaque::<u64>(move [[mul1]])
+    // CHECK: opaque::<u64>(_1)
     opaque(x * 1);
+    // CHECK: assert(!const true, "attempt to divide `{}` by zero",
     // CHECK: [[div0:_.*]] = Div(_1, const 0_u64);
     // CHECK: opaque::<u64>(move [[div0]])
     opaque(x / 0);
-    // CHECK: [[div1:_.*]] = Div(_1, const 1_u64);
-    // CHECK: opaque::<u64>(move [[div1]])
+    // CHECK: opaque::<u64>(_1)
     opaque(x / 1);
-    // CHECK: [[zdiv:_.*]] = Div(const 0_u64, _1);
-    // CHECK: opaque::<u64>(move [[zdiv]])
+    // CHECK: opaque::<u64>(const 0_u64)
     opaque(0 / x);
     // CHECK: [[odiv:_.*]] = Div(const 1_u64, _1);
     // CHECK: opaque::<u64>(move [[odiv]])
     opaque(1 / x);
+    // CHECK: assert(!const true, "attempt to calculate the remainder of `{}` with a divisor of zero"
     // CHECK: [[rem0:_.*]] = Rem(_1, const 0_u64);
     // CHECK: opaque::<u64>(move [[rem0]])
     opaque(x % 0);
-    // CHECK: [[rem1:_.*]] = Rem(_1, const 1_u64);
-    // CHECK: opaque::<u64>(move [[rem1]])
+    // CHECK: opaque::<u64>(const 0_u64)
     opaque(x % 1);
-    // CHECK: [[zrem:_.*]] = Rem(const 0_u64, _1);
-    // CHECK: opaque::<u64>(move [[zrem]])
+    // CHECK: opaque::<u64>(const 0_u64)
     opaque(0 % x);
     // CHECK: [[orem:_.*]] = Rem(const 1_u64, _1);
     // CHECK: opaque::<u64>(move [[orem]])
     opaque(1 % x);
-    // CHECK: [[and:_.*]] = BitAnd(_1, const 0_u64);
-    // CHECK: opaque::<u64>(move [[and]])
+    // CHECK: opaque::<u64>(const 0_u64)
     opaque(x & 0);
-    // CHECK: [[or:_.*]] = BitOr(_1, const 0_u64);
-    // CHECK: opaque::<u64>(move [[or]])
+    // CHECK: opaque::<u64>(_1)
+    opaque(x & u64::MAX);
+    // CHECK: opaque::<u64>(_1)
     opaque(x | 0);
-    // CHECK: [[xor:_.*]] = BitXor(_1, const 0_u64);
-    // CHECK: opaque::<u64>(move [[xor]])
+    // CHECK: opaque::<u64>(const u64::MAX)
+    opaque(x | u64::MAX);
+    // CHECK: opaque::<u64>(_1)
     opaque(x ^ 0);
-    // CHECK: [[shr:_.*]] = Shr(_1, const 0_i32);
-    // CHECK: opaque::<u64>(move [[shr]])
+    // CHECK: opaque::<u64>(const 0_u64)
+    opaque(x ^ x);
+    // CHECK: opaque::<u64>(_1)
     opaque(x >> 0);
-    // CHECK: [[shl:_.*]] = Shl(_1, const 0_i32);
-    // CHECK: opaque::<u64>(move [[shl]])
+    // CHECK: opaque::<u64>(_1)
     opaque(x << 0);
 }
 
 fn comparison(x: u64, y: u64) {
     // CHECK-LABEL: fn comparison(
-    // CHECK: [[eqxx:_.*]] = Eq(_1, _1);
-    // CHECK: opaque::<bool>(move [[eqxx]])
+    // CHECK: opaque::<bool>(const true)
     opaque(x == x);
-    // CHECK: [[nexx:_.*]] = Ne(_1, _1);
-    // CHECK: opaque::<bool>(move [[nexx]])
+    // CHECK: opaque::<bool>(const false)
     opaque(x != x);
     // CHECK: [[eqxy:_.*]] = Eq(_1, _2);
     // CHECK: opaque::<bool>(move [[eqxy]])
@@ -242,21 +262,20 @@ fn comparison(x: u64, y: u64) {
 #[rustc_inherit_overflow_checks]
 fn arithmetic_checked(x: u64) {
     // CHECK-LABEL: fn arithmetic_checked(
-    // CHECK: [[cadd:_.*]] = CheckedAdd(_1, const 0_u64);
-    // CHECK: [[add:_.*]] = move ([[cadd]].0: u64);
-    // CHECK: opaque::<u64>(move [[add]])
+    // CHECK: assert(!const false,
+    // CHECK: opaque::<u64>(_1)
     opaque(x + 0);
-    // CHECK: [[csub:_.*]] = CheckedSub(_1, const 0_u64);
-    // CHECK: [[sub:_.*]] = move ([[csub]].0: u64);
-    // CHECK: opaque::<u64>(move [[sub]])
+    // CHECK: assert(!const false,
+    // CHECK: opaque::<u64>(_1)
     opaque(x - 0);
-    // CHECK: [[cmul0:_.*]] = CheckedMul(_1, const 0_u64);
-    // CHECK: [[mul0:_.*]] = move ([[cmul0]].0: u64);
-    // CHECK: opaque::<u64>(move [[mul0]])
+    // CHECK: assert(!const false,
+    // CHECK: opaque::<u64>(const 0_u64)
+    opaque(x - x);
+    // CHECK: assert(!const false,
+    // CHECK: opaque::<u64>(const 0_u64)
     opaque(x * 0);
-    // CHECK: [[cmul1:_.*]] = CheckedMul(_1, const 1_u64);
-    // CHECK: [[mul1:_.*]] = move ([[cmul1]].0: u64);
-    // CHECK: opaque::<u64>(move [[mul1]])
+    // CHECK: assert(!const false,
+    // CHECK: opaque::<u64>(_1)
     opaque(x * 1);
 }
 
@@ -625,10 +644,32 @@ fn constant_index_overflow<T: Copy>(x: &[T]) {
     opaque(b)
 }
 
+fn wide_ptr_ops() {
+    let a: *const dyn Send = &1 as &dyn Send;
+    let b: *const dyn Send = &1 as &dyn Send;
+    let _val = a == b;
+    let _val = a != b;
+    let _val = a < b;
+    let _val = a <= b;
+    let _val = a > b;
+    let _val = a >= b;
+
+    let a: *const [u8] = unsafe { transmute((1usize, 1usize)) };
+    let b: *const [u8] = unsafe { transmute((1usize, 2usize)) };
+
+    opaque(!(a == b));
+    opaque(a != b);
+    opaque(a <= b);
+    opaque(a < b);
+    opaque(!(a >= b));
+    opaque(!(a > b));
+}
+
 fn main() {
     subexpression_elimination(2, 4, 5);
     wrap_unwrap(5);
     repeated_index::<u32, 7>(5, 3);
+    unary(i64::MIN);
     arithmetic(5);
     comparison(5, 6);
     arithmetic_checked(5);
@@ -644,6 +685,7 @@ fn main() {
     fn_pointers();
     indirect_static();
     constant_index_overflow(&[5, 3]);
+    wide_ptr_ops();
 }
 
 #[inline(never)]
@@ -657,6 +699,7 @@ fn identity<T>(x: T) -> T {
 // EMIT_MIR gvn.subexpression_elimination.GVN.diff
 // EMIT_MIR gvn.wrap_unwrap.GVN.diff
 // EMIT_MIR gvn.repeated_index.GVN.diff
+// EMIT_MIR gvn.unary.GVN.diff
 // EMIT_MIR gvn.arithmetic.GVN.diff
 // EMIT_MIR gvn.comparison.GVN.diff
 // EMIT_MIR gvn.arithmetic_checked.GVN.diff
@@ -671,3 +714,4 @@ fn identity<T>(x: T) -> T {
 // EMIT_MIR gvn.fn_pointers.GVN.diff
 // EMIT_MIR gvn.indirect_static.GVN.diff
 // EMIT_MIR gvn.constant_index_overflow.GVN.diff
+// EMIT_MIR gvn.wide_ptr_ops.GVN.diff
diff --git a/tests/mir-opt/gvn.unary.GVN.panic-abort.diff b/tests/mir-opt/gvn.unary.GVN.panic-abort.diff
new file mode 100644
index 00000000000..9469032f294
--- /dev/null
+++ b/tests/mir-opt/gvn.unary.GVN.panic-abort.diff
@@ -0,0 +1,153 @@
+- // MIR for `unary` before GVN
++ // MIR for `unary` after GVN
+  
+  fn unary(_1: i64) -> () {
+      debug x => _1;
+      let mut _0: ();
+      let _2: ();
+      let mut _3: i64;
+      let mut _4: i64;
+      let mut _5: i64;
+      let _6: bool;
+      let mut _7: i64;
+      let _8: ();
+      let mut _9: bool;
+      let mut _10: bool;
+      let mut _11: bool;
+      let _12: ();
+      let mut _13: bool;
+      let mut _14: i64;
+      let _15: ();
+      let mut _16: bool;
+      let mut _17: bool;
+      let mut _18: i64;
+      let _19: ();
+      let mut _20: bool;
+      let mut _21: i64;
+      let _22: ();
+      let mut _23: bool;
+      let mut _24: bool;
+      let mut _25: i64;
+      scope 1 {
+          debug b => _6;
+      }
+  
+      bb0: {
+          StorageLive(_2);
+          StorageLive(_3);
+          StorageLive(_4);
+          StorageLive(_5);
+          _5 = _1;
+-         _4 = Neg(move _5);
++         _4 = Neg(_1);
+          StorageDead(_5);
+-         _3 = Neg(move _4);
++         _3 = _1;
+          StorageDead(_4);
+-         _2 = opaque::<i64>(move _3) -> [return: bb1, unwind unreachable];
++         _2 = opaque::<i64>(_1) -> [return: bb1, unwind unreachable];
+      }
+  
+      bb1: {
+          StorageDead(_3);
+          StorageDead(_2);
+-         StorageLive(_6);
++         nop;
+          StorageLive(_7);
+          _7 = _1;
+-         _6 = Lt(move _7, const 13_i64);
++         _6 = Lt(_1, const 13_i64);
+          StorageDead(_7);
+          StorageLive(_8);
+          StorageLive(_9);
+          StorageLive(_10);
+          StorageLive(_11);
+          _11 = _6;
+-         _10 = Not(move _11);
++         _10 = Not(_6);
+          StorageDead(_11);
+-         _9 = Not(move _10);
++         _9 = _6;
+          StorageDead(_10);
+-         _8 = opaque::<bool>(move _9) -> [return: bb2, unwind unreachable];
++         _8 = opaque::<bool>(_6) -> [return: bb2, unwind unreachable];
+      }
+  
+      bb2: {
+          StorageDead(_9);
+          StorageDead(_8);
+          StorageLive(_12);
+-         StorageLive(_13);
++         nop;
+          StorageLive(_14);
+          _14 = _1;
+-         _13 = Ne(move _14, const 15_i64);
++         _13 = Ne(_1, const 15_i64);
+          StorageDead(_14);
+-         _12 = opaque::<bool>(move _13) -> [return: bb3, unwind unreachable];
++         _12 = opaque::<bool>(_13) -> [return: bb3, unwind unreachable];
+      }
+  
+      bb3: {
+-         StorageDead(_13);
++         nop;
+          StorageDead(_12);
+          StorageLive(_15);
+          StorageLive(_16);
+          StorageLive(_17);
+          StorageLive(_18);
+          _18 = _1;
+-         _17 = Eq(move _18, const 15_i64);
++         _17 = Eq(_1, const 15_i64);
+          StorageDead(_18);
+-         _16 = Not(move _17);
++         _16 = _13;
+          StorageDead(_17);
+-         _15 = opaque::<bool>(move _16) -> [return: bb4, unwind unreachable];
++         _15 = opaque::<bool>(_13) -> [return: bb4, unwind unreachable];
+      }
+  
+      bb4: {
+          StorageDead(_16);
+          StorageDead(_15);
+          StorageLive(_19);
+-         StorageLive(_20);
++         nop;
+          StorageLive(_21);
+          _21 = _1;
+-         _20 = Eq(move _21, const 35_i64);
++         _20 = Eq(_1, const 35_i64);
+          StorageDead(_21);
+-         _19 = opaque::<bool>(move _20) -> [return: bb5, unwind unreachable];
++         _19 = opaque::<bool>(_20) -> [return: bb5, unwind unreachable];
+      }
+  
+      bb5: {
+-         StorageDead(_20);
++         nop;
+          StorageDead(_19);
+          StorageLive(_22);
+          StorageLive(_23);
+          StorageLive(_24);
+          StorageLive(_25);
+          _25 = _1;
+-         _24 = Ne(move _25, const 35_i64);
++         _24 = Ne(_1, const 35_i64);
+          StorageDead(_25);
+-         _23 = Not(move _24);
++         _23 = _20;
+          StorageDead(_24);
+-         _22 = opaque::<bool>(move _23) -> [return: bb6, unwind unreachable];
++         _22 = opaque::<bool>(_20) -> [return: bb6, unwind unreachable];
+      }
+  
+      bb6: {
+          StorageDead(_23);
+          StorageDead(_22);
+          _0 = const ();
+-         StorageDead(_6);
++         nop;
+          return;
+      }
+  }
+  
diff --git a/tests/mir-opt/gvn.unary.GVN.panic-unwind.diff b/tests/mir-opt/gvn.unary.GVN.panic-unwind.diff
new file mode 100644
index 00000000000..e672f6fb6ba
--- /dev/null
+++ b/tests/mir-opt/gvn.unary.GVN.panic-unwind.diff
@@ -0,0 +1,153 @@
+- // MIR for `unary` before GVN
++ // MIR for `unary` after GVN
+  
+  fn unary(_1: i64) -> () {
+      debug x => _1;
+      let mut _0: ();
+      let _2: ();
+      let mut _3: i64;
+      let mut _4: i64;
+      let mut _5: i64;
+      let _6: bool;
+      let mut _7: i64;
+      let _8: ();
+      let mut _9: bool;
+      let mut _10: bool;
+      let mut _11: bool;
+      let _12: ();
+      let mut _13: bool;
+      let mut _14: i64;
+      let _15: ();
+      let mut _16: bool;
+      let mut _17: bool;
+      let mut _18: i64;
+      let _19: ();
+      let mut _20: bool;
+      let mut _21: i64;
+      let _22: ();
+      let mut _23: bool;
+      let mut _24: bool;
+      let mut _25: i64;
+      scope 1 {
+          debug b => _6;
+      }
+  
+      bb0: {
+          StorageLive(_2);
+          StorageLive(_3);
+          StorageLive(_4);
+          StorageLive(_5);
+          _5 = _1;
+-         _4 = Neg(move _5);
++         _4 = Neg(_1);
+          StorageDead(_5);
+-         _3 = Neg(move _4);
++         _3 = _1;
+          StorageDead(_4);
+-         _2 = opaque::<i64>(move _3) -> [return: bb1, unwind continue];
++         _2 = opaque::<i64>(_1) -> [return: bb1, unwind continue];
+      }
+  
+      bb1: {
+          StorageDead(_3);
+          StorageDead(_2);
+-         StorageLive(_6);
++         nop;
+          StorageLive(_7);
+          _7 = _1;
+-         _6 = Lt(move _7, const 13_i64);
++         _6 = Lt(_1, const 13_i64);
+          StorageDead(_7);
+          StorageLive(_8);
+          StorageLive(_9);
+          StorageLive(_10);
+          StorageLive(_11);
+          _11 = _6;
+-         _10 = Not(move _11);
++         _10 = Not(_6);
+          StorageDead(_11);
+-         _9 = Not(move _10);
++         _9 = _6;
+          StorageDead(_10);
+-         _8 = opaque::<bool>(move _9) -> [return: bb2, unwind continue];
++         _8 = opaque::<bool>(_6) -> [return: bb2, unwind continue];
+      }
+  
+      bb2: {
+          StorageDead(_9);
+          StorageDead(_8);
+          StorageLive(_12);
+-         StorageLive(_13);
++         nop;
+          StorageLive(_14);
+          _14 = _1;
+-         _13 = Ne(move _14, const 15_i64);
++         _13 = Ne(_1, const 15_i64);
+          StorageDead(_14);
+-         _12 = opaque::<bool>(move _13) -> [return: bb3, unwind continue];
++         _12 = opaque::<bool>(_13) -> [return: bb3, unwind continue];
+      }
+  
+      bb3: {
+-         StorageDead(_13);
++         nop;
+          StorageDead(_12);
+          StorageLive(_15);
+          StorageLive(_16);
+          StorageLive(_17);
+          StorageLive(_18);
+          _18 = _1;
+-         _17 = Eq(move _18, const 15_i64);
++         _17 = Eq(_1, const 15_i64);
+          StorageDead(_18);
+-         _16 = Not(move _17);
++         _16 = _13;
+          StorageDead(_17);
+-         _15 = opaque::<bool>(move _16) -> [return: bb4, unwind continue];
++         _15 = opaque::<bool>(_13) -> [return: bb4, unwind continue];
+      }
+  
+      bb4: {
+          StorageDead(_16);
+          StorageDead(_15);
+          StorageLive(_19);
+-         StorageLive(_20);
++         nop;
+          StorageLive(_21);
+          _21 = _1;
+-         _20 = Eq(move _21, const 35_i64);
++         _20 = Eq(_1, const 35_i64);
+          StorageDead(_21);
+-         _19 = opaque::<bool>(move _20) -> [return: bb5, unwind continue];
++         _19 = opaque::<bool>(_20) -> [return: bb5, unwind continue];
+      }
+  
+      bb5: {
+-         StorageDead(_20);
++         nop;
+          StorageDead(_19);
+          StorageLive(_22);
+          StorageLive(_23);
+          StorageLive(_24);
+          StorageLive(_25);
+          _25 = _1;
+-         _24 = Ne(move _25, const 35_i64);
++         _24 = Ne(_1, const 35_i64);
+          StorageDead(_25);
+-         _23 = Not(move _24);
++         _23 = _20;
+          StorageDead(_24);
+-         _22 = opaque::<bool>(move _23) -> [return: bb6, unwind continue];
++         _22 = opaque::<bool>(_20) -> [return: bb6, unwind continue];
+      }
+  
+      bb6: {
+          StorageDead(_23);
+          StorageDead(_22);
+          _0 = const ();
+-         StorageDead(_6);
++         nop;
+          return;
+      }
+  }
+  
diff --git a/tests/mir-opt/gvn.wide_ptr_ops.GVN.panic-abort.diff b/tests/mir-opt/gvn.wide_ptr_ops.GVN.panic-abort.diff
new file mode 100644
index 00000000000..e49d759b8fc
--- /dev/null
+++ b/tests/mir-opt/gvn.wide_ptr_ops.GVN.panic-abort.diff
@@ -0,0 +1,386 @@
+- // MIR for `wide_ptr_ops` before GVN
++ // MIR for `wide_ptr_ops` after GVN
+  
+  fn wide_ptr_ops() -> () {
+      let mut _0: ();
+      let _1: *const dyn std::marker::Send;
+      let mut _2: *const dyn std::marker::Send;
+      let _3: &dyn std::marker::Send;
+      let mut _4: &i32;
+      let _5: &i32;
+      let _6: i32;
+      let mut _8: *const dyn std::marker::Send;
+      let _9: &dyn std::marker::Send;
+      let mut _10: &i32;
+      let _11: &i32;
+      let _12: i32;
+      let mut _14: *const dyn std::marker::Send;
+      let mut _15: *const dyn std::marker::Send;
+      let mut _16: *const dyn std::marker::Send;
+      let mut _18: *const dyn std::marker::Send;
+      let mut _19: *const dyn std::marker::Send;
+      let mut _20: *const dyn std::marker::Send;
+      let mut _22: *const dyn std::marker::Send;
+      let mut _23: *const dyn std::marker::Send;
+      let mut _24: *const dyn std::marker::Send;
+      let mut _26: *const dyn std::marker::Send;
+      let mut _27: *const dyn std::marker::Send;
+      let mut _28: *const dyn std::marker::Send;
+      let mut _30: *const dyn std::marker::Send;
+      let mut _31: *const dyn std::marker::Send;
+      let mut _32: *const dyn std::marker::Send;
+      let mut _34: *const dyn std::marker::Send;
+      let mut _35: *const dyn std::marker::Send;
+      let mut _36: *const dyn std::marker::Send;
+      let mut _38: (usize, usize);
+      let mut _40: (usize, usize);
+      let _41: ();
+      let mut _42: bool;
+      let mut _43: bool;
+      let mut _44: *const [u8];
+      let mut _45: *const [u8];
+      let _46: ();
+      let mut _47: bool;
+      let mut _48: *const [u8];
+      let mut _49: *const [u8];
+      let _50: ();
+      let mut _51: bool;
+      let mut _52: *const [u8];
+      let mut _53: *const [u8];
+      let _54: ();
+      let mut _55: bool;
+      let mut _56: *const [u8];
+      let mut _57: *const [u8];
+      let _58: ();
+      let mut _59: bool;
+      let mut _60: bool;
+      let mut _61: *const [u8];
+      let mut _62: *const [u8];
+      let _63: ();
+      let mut _64: bool;
+      let mut _65: bool;
+      let mut _66: *const [u8];
+      let mut _67: *const [u8];
+      let mut _69: &i32;
+      scope 1 {
+          debug a => _1;
+          let _7: *const dyn std::marker::Send;
+          let mut _68: &i32;
+          scope 2 {
+              debug b => _7;
+              let _13: bool;
+              scope 3 {
+                  debug _val => _13;
+                  let _17: bool;
+                  scope 4 {
+                      debug _val => _17;
+                      let _21: bool;
+                      scope 5 {
+                          debug _val => _21;
+                          let _25: bool;
+                          scope 6 {
+                              debug _val => _25;
+                              let _29: bool;
+                              scope 7 {
+                                  debug _val => _29;
+                                  let _33: bool;
+                                  scope 8 {
+                                      debug _val => _33;
+                                      let _37: *const [u8];
+                                      scope 9 {
+                                          debug a => _37;
+                                          let _39: *const [u8];
+                                          scope 11 {
+                                              debug b => _39;
+                                          }
+                                          scope 12 {
+                                          }
+                                      }
+                                      scope 10 {
+                                      }
+                                  }
+                              }
+                          }
+                      }
+                  }
+              }
+          }
+      }
+  
+      bb0: {
+-         StorageLive(_1);
++         nop;
+          StorageLive(_2);
+          StorageLive(_3);
+          StorageLive(_4);
+          StorageLive(_5);
+          _69 = const _;
+          _5 = &(*_69);
+          _4 = &(*_5);
+          _3 = move _4 as &dyn std::marker::Send (PointerCoercion(Unsize));
+          StorageDead(_4);
+          _2 = &raw const (*_3);
+          _1 = move _2 as *const dyn std::marker::Send (PointerCoercion(Unsize));
+          StorageDead(_2);
+          StorageDead(_5);
+          StorageDead(_3);
+-         StorageLive(_7);
++         nop;
+          StorageLive(_8);
+          StorageLive(_9);
+          StorageLive(_10);
+          StorageLive(_11);
+          _68 = const _;
+          _11 = &(*_68);
+          _10 = &(*_11);
+          _9 = move _10 as &dyn std::marker::Send (PointerCoercion(Unsize));
+          StorageDead(_10);
+          _8 = &raw const (*_9);
+          _7 = move _8 as *const dyn std::marker::Send (PointerCoercion(Unsize));
+          StorageDead(_8);
+          StorageDead(_11);
+          StorageDead(_9);
+          StorageLive(_13);
+          StorageLive(_14);
+          _14 = _1;
+-         StorageLive(_15);
++         nop;
+          StorageLive(_16);
+          _16 = _7;
+-         _15 = move _16 as *const dyn std::marker::Send (PointerCoercion(Unsize));
++         _15 = _7 as *const dyn std::marker::Send (PointerCoercion(Unsize));
+          StorageDead(_16);
+-         _13 = Eq(move _14, move _15);
+-         StorageDead(_15);
++         _13 = Eq(_1, _15);
++         nop;
+          StorageDead(_14);
+          StorageLive(_17);
+          StorageLive(_18);
+          _18 = _1;
+          StorageLive(_19);
+          StorageLive(_20);
+          _20 = _7;
+-         _19 = move _20 as *const dyn std::marker::Send (PointerCoercion(Unsize));
++         _19 = _15;
+          StorageDead(_20);
+-         _17 = Ne(move _18, move _19);
++         _17 = Ne(_1, _15);
+          StorageDead(_19);
+          StorageDead(_18);
+          StorageLive(_21);
+          StorageLive(_22);
+          _22 = _1;
+          StorageLive(_23);
+          StorageLive(_24);
+          _24 = _7;
+-         _23 = move _24 as *const dyn std::marker::Send (PointerCoercion(Unsize));
++         _23 = _15;
+          StorageDead(_24);
+-         _21 = Lt(move _22, move _23);
++         _21 = Lt(_1, _15);
+          StorageDead(_23);
+          StorageDead(_22);
+          StorageLive(_25);
+          StorageLive(_26);
+          _26 = _1;
+          StorageLive(_27);
+          StorageLive(_28);
+          _28 = _7;
+-         _27 = move _28 as *const dyn std::marker::Send (PointerCoercion(Unsize));
++         _27 = _15;
+          StorageDead(_28);
+-         _25 = Le(move _26, move _27);
++         _25 = Le(_1, _15);
+          StorageDead(_27);
+          StorageDead(_26);
+          StorageLive(_29);
+          StorageLive(_30);
+          _30 = _1;
+          StorageLive(_31);
+          StorageLive(_32);
+          _32 = _7;
+-         _31 = move _32 as *const dyn std::marker::Send (PointerCoercion(Unsize));
++         _31 = _15;
+          StorageDead(_32);
+-         _29 = Gt(move _30, move _31);
++         _29 = Gt(_1, _15);
+          StorageDead(_31);
+          StorageDead(_30);
+          StorageLive(_33);
+          StorageLive(_34);
+          _34 = _1;
+          StorageLive(_35);
+          StorageLive(_36);
+          _36 = _7;
+-         _35 = move _36 as *const dyn std::marker::Send (PointerCoercion(Unsize));
++         _35 = _15;
+          StorageDead(_36);
+-         _33 = Ge(move _34, move _35);
++         _33 = Ge(_1, _15);
+          StorageDead(_35);
+          StorageDead(_34);
+-         StorageLive(_37);
++         nop;
+          StorageLive(_38);
+-         _38 = (const 1_usize, const 1_usize);
+-         _37 = move _38 as *const [u8] (Transmute);
++         _38 = const (1_usize, 1_usize);
++         _37 = const Indirect { alloc_id: ALLOC0, offset: Size(0 bytes) }: *const [u8];
+          StorageDead(_38);
+-         StorageLive(_39);
++         nop;
+          StorageLive(_40);
+-         _40 = (const 1_usize, const 2_usize);
+-         _39 = move _40 as *const [u8] (Transmute);
++         _40 = const (1_usize, 2_usize);
++         _39 = const Indirect { alloc_id: ALLOC1, offset: Size(0 bytes) }: *const [u8];
+          StorageDead(_40);
+          StorageLive(_41);
+-         StorageLive(_42);
++         nop;
+          StorageLive(_43);
+          StorageLive(_44);
+-         _44 = _37;
++         _44 = const Indirect { alloc_id: ALLOC0, offset: Size(0 bytes) }: *const [u8];
+          StorageLive(_45);
+-         _45 = _39;
+-         _43 = Eq(move _44, move _45);
++         _45 = const Indirect { alloc_id: ALLOC1, offset: Size(0 bytes) }: *const [u8];
++         _43 = Eq(const Indirect { alloc_id: ALLOC0, offset: Size(0 bytes) }: *const [u8], const Indirect { alloc_id: ALLOC1, offset: Size(0 bytes) }: *const [u8]);
+          StorageDead(_45);
+          StorageDead(_44);
+          _42 = Not(move _43);
+          StorageDead(_43);
+-         _41 = opaque::<bool>(move _42) -> [return: bb1, unwind unreachable];
++         _41 = opaque::<bool>(_42) -> [return: bb1, unwind unreachable];
+      }
+  
+      bb1: {
+-         StorageDead(_42);
++         nop;
+          StorageDead(_41);
+          StorageLive(_46);
+          StorageLive(_47);
+          StorageLive(_48);
+-         _48 = _37;
++         _48 = const Indirect { alloc_id: ALLOC0, offset: Size(0 bytes) }: *const [u8];
+          StorageLive(_49);
+-         _49 = _39;
+-         _47 = Ne(move _48, move _49);
++         _49 = const Indirect { alloc_id: ALLOC1, offset: Size(0 bytes) }: *const [u8];
++         _47 = _42;
+          StorageDead(_49);
+          StorageDead(_48);
+-         _46 = opaque::<bool>(move _47) -> [return: bb2, unwind unreachable];
++         _46 = opaque::<bool>(_42) -> [return: bb2, unwind unreachable];
+      }
+  
+      bb2: {
+          StorageDead(_47);
+          StorageDead(_46);
+          StorageLive(_50);
+          StorageLive(_51);
+          StorageLive(_52);
+-         _52 = _37;
++         _52 = const Indirect { alloc_id: ALLOC0, offset: Size(0 bytes) }: *const [u8];
+          StorageLive(_53);
+-         _53 = _39;
+-         _51 = Le(move _52, move _53);
++         _53 = const Indirect { alloc_id: ALLOC1, offset: Size(0 bytes) }: *const [u8];
++         _51 = Le(const Indirect { alloc_id: ALLOC0, offset: Size(0 bytes) }: *const [u8], const Indirect { alloc_id: ALLOC1, offset: Size(0 bytes) }: *const [u8]);
+          StorageDead(_53);
+          StorageDead(_52);
+          _50 = opaque::<bool>(move _51) -> [return: bb3, unwind unreachable];
+      }
+  
+      bb3: {
+          StorageDead(_51);
+          StorageDead(_50);
+          StorageLive(_54);
+          StorageLive(_55);
+          StorageLive(_56);
+-         _56 = _37;
++         _56 = const Indirect { alloc_id: ALLOC0, offset: Size(0 bytes) }: *const [u8];
+          StorageLive(_57);
+-         _57 = _39;
+-         _55 = Lt(move _56, move _57);
++         _57 = const Indirect { alloc_id: ALLOC1, offset: Size(0 bytes) }: *const [u8];
++         _55 = Lt(const Indirect { alloc_id: ALLOC0, offset: Size(0 bytes) }: *const [u8], const Indirect { alloc_id: ALLOC1, offset: Size(0 bytes) }: *const [u8]);
+          StorageDead(_57);
+          StorageDead(_56);
+          _54 = opaque::<bool>(move _55) -> [return: bb4, unwind unreachable];
+      }
+  
+      bb4: {
+          StorageDead(_55);
+          StorageDead(_54);
+          StorageLive(_58);
+          StorageLive(_59);
+          StorageLive(_60);
+          StorageLive(_61);
+-         _61 = _37;
++         _61 = const Indirect { alloc_id: ALLOC0, offset: Size(0 bytes) }: *const [u8];
+          StorageLive(_62);
+-         _62 = _39;
+-         _60 = Ge(move _61, move _62);
++         _62 = const Indirect { alloc_id: ALLOC1, offset: Size(0 bytes) }: *const [u8];
++         _60 = Ge(const Indirect { alloc_id: ALLOC0, offset: Size(0 bytes) }: *const [u8], const Indirect { alloc_id: ALLOC1, offset: Size(0 bytes) }: *const [u8]);
+          StorageDead(_62);
+          StorageDead(_61);
+          _59 = Not(move _60);
+          StorageDead(_60);
+          _58 = opaque::<bool>(move _59) -> [return: bb5, unwind unreachable];
+      }
+  
+      bb5: {
+          StorageDead(_59);
+          StorageDead(_58);
+          StorageLive(_63);
+          StorageLive(_64);
+          StorageLive(_65);
+          StorageLive(_66);
+-         _66 = _37;
++         _66 = const Indirect { alloc_id: ALLOC0, offset: Size(0 bytes) }: *const [u8];
+          StorageLive(_67);
+-         _67 = _39;
+-         _65 = Gt(move _66, move _67);
++         _67 = const Indirect { alloc_id: ALLOC1, offset: Size(0 bytes) }: *const [u8];
++         _65 = Gt(const Indirect { alloc_id: ALLOC0, offset: Size(0 bytes) }: *const [u8], const Indirect { alloc_id: ALLOC1, offset: Size(0 bytes) }: *const [u8]);
+          StorageDead(_67);
+          StorageDead(_66);
+          _64 = Not(move _65);
+          StorageDead(_65);
+          _63 = opaque::<bool>(move _64) -> [return: bb6, unwind unreachable];
+      }
+  
+      bb6: {
+          StorageDead(_64);
+          StorageDead(_63);
+          _0 = const ();
+-         StorageDead(_39);
+-         StorageDead(_37);
++         nop;
++         nop;
+          StorageDead(_33);
+          StorageDead(_29);
+          StorageDead(_25);
+          StorageDead(_21);
+          StorageDead(_17);
+          StorageDead(_13);
+-         StorageDead(_7);
+-         StorageDead(_1);
++         nop;
++         nop;
+          return;
+      }
++ }
++ 
++ ALLOC1 (size: 16, align: 8) {
++     01 00 00 00 00 00 00 00 02 00 00 00 00 00 00 00 │ ................
++ }
++ 
++ ALLOC0 (size: 16, align: 8) {
++     01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 │ ................
+  }
+  
diff --git a/tests/mir-opt/gvn.wide_ptr_ops.GVN.panic-unwind.diff b/tests/mir-opt/gvn.wide_ptr_ops.GVN.panic-unwind.diff
new file mode 100644
index 00000000000..4e5608a4425
--- /dev/null
+++ b/tests/mir-opt/gvn.wide_ptr_ops.GVN.panic-unwind.diff
@@ -0,0 +1,386 @@
+- // MIR for `wide_ptr_ops` before GVN
++ // MIR for `wide_ptr_ops` after GVN
+  
+  fn wide_ptr_ops() -> () {
+      let mut _0: ();
+      let _1: *const dyn std::marker::Send;
+      let mut _2: *const dyn std::marker::Send;
+      let _3: &dyn std::marker::Send;
+      let mut _4: &i32;
+      let _5: &i32;
+      let _6: i32;
+      let mut _8: *const dyn std::marker::Send;
+      let _9: &dyn std::marker::Send;
+      let mut _10: &i32;
+      let _11: &i32;
+      let _12: i32;
+      let mut _14: *const dyn std::marker::Send;
+      let mut _15: *const dyn std::marker::Send;
+      let mut _16: *const dyn std::marker::Send;
+      let mut _18: *const dyn std::marker::Send;
+      let mut _19: *const dyn std::marker::Send;
+      let mut _20: *const dyn std::marker::Send;
+      let mut _22: *const dyn std::marker::Send;
+      let mut _23: *const dyn std::marker::Send;
+      let mut _24: *const dyn std::marker::Send;
+      let mut _26: *const dyn std::marker::Send;
+      let mut _27: *const dyn std::marker::Send;
+      let mut _28: *const dyn std::marker::Send;
+      let mut _30: *const dyn std::marker::Send;
+      let mut _31: *const dyn std::marker::Send;
+      let mut _32: *const dyn std::marker::Send;
+      let mut _34: *const dyn std::marker::Send;
+      let mut _35: *const dyn std::marker::Send;
+      let mut _36: *const dyn std::marker::Send;
+      let mut _38: (usize, usize);
+      let mut _40: (usize, usize);
+      let _41: ();
+      let mut _42: bool;
+      let mut _43: bool;
+      let mut _44: *const [u8];
+      let mut _45: *const [u8];
+      let _46: ();
+      let mut _47: bool;
+      let mut _48: *const [u8];
+      let mut _49: *const [u8];
+      let _50: ();
+      let mut _51: bool;
+      let mut _52: *const [u8];
+      let mut _53: *const [u8];
+      let _54: ();
+      let mut _55: bool;
+      let mut _56: *const [u8];
+      let mut _57: *const [u8];
+      let _58: ();
+      let mut _59: bool;
+      let mut _60: bool;
+      let mut _61: *const [u8];
+      let mut _62: *const [u8];
+      let _63: ();
+      let mut _64: bool;
+      let mut _65: bool;
+      let mut _66: *const [u8];
+      let mut _67: *const [u8];
+      let mut _69: &i32;
+      scope 1 {
+          debug a => _1;
+          let _7: *const dyn std::marker::Send;
+          let mut _68: &i32;
+          scope 2 {
+              debug b => _7;
+              let _13: bool;
+              scope 3 {
+                  debug _val => _13;
+                  let _17: bool;
+                  scope 4 {
+                      debug _val => _17;
+                      let _21: bool;
+                      scope 5 {
+                          debug _val => _21;
+                          let _25: bool;
+                          scope 6 {
+                              debug _val => _25;
+                              let _29: bool;
+                              scope 7 {
+                                  debug _val => _29;
+                                  let _33: bool;
+                                  scope 8 {
+                                      debug _val => _33;
+                                      let _37: *const [u8];
+                                      scope 9 {
+                                          debug a => _37;
+                                          let _39: *const [u8];
+                                          scope 11 {
+                                              debug b => _39;
+                                          }
+                                          scope 12 {
+                                          }
+                                      }
+                                      scope 10 {
+                                      }
+                                  }
+                              }
+                          }
+                      }
+                  }
+              }
+          }
+      }
+  
+      bb0: {
+-         StorageLive(_1);
++         nop;
+          StorageLive(_2);
+          StorageLive(_3);
+          StorageLive(_4);
+          StorageLive(_5);
+          _69 = const _;
+          _5 = &(*_69);
+          _4 = &(*_5);
+          _3 = move _4 as &dyn std::marker::Send (PointerCoercion(Unsize));
+          StorageDead(_4);
+          _2 = &raw const (*_3);
+          _1 = move _2 as *const dyn std::marker::Send (PointerCoercion(Unsize));
+          StorageDead(_2);
+          StorageDead(_5);
+          StorageDead(_3);
+-         StorageLive(_7);
++         nop;
+          StorageLive(_8);
+          StorageLive(_9);
+          StorageLive(_10);
+          StorageLive(_11);
+          _68 = const _;
+          _11 = &(*_68);
+          _10 = &(*_11);
+          _9 = move _10 as &dyn std::marker::Send (PointerCoercion(Unsize));
+          StorageDead(_10);
+          _8 = &raw const (*_9);
+          _7 = move _8 as *const dyn std::marker::Send (PointerCoercion(Unsize));
+          StorageDead(_8);
+          StorageDead(_11);
+          StorageDead(_9);
+          StorageLive(_13);
+          StorageLive(_14);
+          _14 = _1;
+-         StorageLive(_15);
++         nop;
+          StorageLive(_16);
+          _16 = _7;
+-         _15 = move _16 as *const dyn std::marker::Send (PointerCoercion(Unsize));
++         _15 = _7 as *const dyn std::marker::Send (PointerCoercion(Unsize));
+          StorageDead(_16);
+-         _13 = Eq(move _14, move _15);
+-         StorageDead(_15);
++         _13 = Eq(_1, _15);
++         nop;
+          StorageDead(_14);
+          StorageLive(_17);
+          StorageLive(_18);
+          _18 = _1;
+          StorageLive(_19);
+          StorageLive(_20);
+          _20 = _7;
+-         _19 = move _20 as *const dyn std::marker::Send (PointerCoercion(Unsize));
++         _19 = _15;
+          StorageDead(_20);
+-         _17 = Ne(move _18, move _19);
++         _17 = Ne(_1, _15);
+          StorageDead(_19);
+          StorageDead(_18);
+          StorageLive(_21);
+          StorageLive(_22);
+          _22 = _1;
+          StorageLive(_23);
+          StorageLive(_24);
+          _24 = _7;
+-         _23 = move _24 as *const dyn std::marker::Send (PointerCoercion(Unsize));
++         _23 = _15;
+          StorageDead(_24);
+-         _21 = Lt(move _22, move _23);
++         _21 = Lt(_1, _15);
+          StorageDead(_23);
+          StorageDead(_22);
+          StorageLive(_25);
+          StorageLive(_26);
+          _26 = _1;
+          StorageLive(_27);
+          StorageLive(_28);
+          _28 = _7;
+-         _27 = move _28 as *const dyn std::marker::Send (PointerCoercion(Unsize));
++         _27 = _15;
+          StorageDead(_28);
+-         _25 = Le(move _26, move _27);
++         _25 = Le(_1, _15);
+          StorageDead(_27);
+          StorageDead(_26);
+          StorageLive(_29);
+          StorageLive(_30);
+          _30 = _1;
+          StorageLive(_31);
+          StorageLive(_32);
+          _32 = _7;
+-         _31 = move _32 as *const dyn std::marker::Send (PointerCoercion(Unsize));
++         _31 = _15;
+          StorageDead(_32);
+-         _29 = Gt(move _30, move _31);
++         _29 = Gt(_1, _15);
+          StorageDead(_31);
+          StorageDead(_30);
+          StorageLive(_33);
+          StorageLive(_34);
+          _34 = _1;
+          StorageLive(_35);
+          StorageLive(_36);
+          _36 = _7;
+-         _35 = move _36 as *const dyn std::marker::Send (PointerCoercion(Unsize));
++         _35 = _15;
+          StorageDead(_36);
+-         _33 = Ge(move _34, move _35);
++         _33 = Ge(_1, _15);
+          StorageDead(_35);
+          StorageDead(_34);
+-         StorageLive(_37);
++         nop;
+          StorageLive(_38);
+-         _38 = (const 1_usize, const 1_usize);
+-         _37 = move _38 as *const [u8] (Transmute);
++         _38 = const (1_usize, 1_usize);
++         _37 = const Indirect { alloc_id: ALLOC0, offset: Size(0 bytes) }: *const [u8];
+          StorageDead(_38);
+-         StorageLive(_39);
++         nop;
+          StorageLive(_40);
+-         _40 = (const 1_usize, const 2_usize);
+-         _39 = move _40 as *const [u8] (Transmute);
++         _40 = const (1_usize, 2_usize);
++         _39 = const Indirect { alloc_id: ALLOC1, offset: Size(0 bytes) }: *const [u8];
+          StorageDead(_40);
+          StorageLive(_41);
+-         StorageLive(_42);
++         nop;
+          StorageLive(_43);
+          StorageLive(_44);
+-         _44 = _37;
++         _44 = const Indirect { alloc_id: ALLOC0, offset: Size(0 bytes) }: *const [u8];
+          StorageLive(_45);
+-         _45 = _39;
+-         _43 = Eq(move _44, move _45);
++         _45 = const Indirect { alloc_id: ALLOC1, offset: Size(0 bytes) }: *const [u8];
++         _43 = Eq(const Indirect { alloc_id: ALLOC0, offset: Size(0 bytes) }: *const [u8], const Indirect { alloc_id: ALLOC1, offset: Size(0 bytes) }: *const [u8]);
+          StorageDead(_45);
+          StorageDead(_44);
+          _42 = Not(move _43);
+          StorageDead(_43);
+-         _41 = opaque::<bool>(move _42) -> [return: bb1, unwind continue];
++         _41 = opaque::<bool>(_42) -> [return: bb1, unwind continue];
+      }
+  
+      bb1: {
+-         StorageDead(_42);
++         nop;
+          StorageDead(_41);
+          StorageLive(_46);
+          StorageLive(_47);
+          StorageLive(_48);
+-         _48 = _37;
++         _48 = const Indirect { alloc_id: ALLOC0, offset: Size(0 bytes) }: *const [u8];
+          StorageLive(_49);
+-         _49 = _39;
+-         _47 = Ne(move _48, move _49);
++         _49 = const Indirect { alloc_id: ALLOC1, offset: Size(0 bytes) }: *const [u8];
++         _47 = _42;
+          StorageDead(_49);
+          StorageDead(_48);
+-         _46 = opaque::<bool>(move _47) -> [return: bb2, unwind continue];
++         _46 = opaque::<bool>(_42) -> [return: bb2, unwind continue];
+      }
+  
+      bb2: {
+          StorageDead(_47);
+          StorageDead(_46);
+          StorageLive(_50);
+          StorageLive(_51);
+          StorageLive(_52);
+-         _52 = _37;
++         _52 = const Indirect { alloc_id: ALLOC0, offset: Size(0 bytes) }: *const [u8];
+          StorageLive(_53);
+-         _53 = _39;
+-         _51 = Le(move _52, move _53);
++         _53 = const Indirect { alloc_id: ALLOC1, offset: Size(0 bytes) }: *const [u8];
++         _51 = Le(const Indirect { alloc_id: ALLOC0, offset: Size(0 bytes) }: *const [u8], const Indirect { alloc_id: ALLOC1, offset: Size(0 bytes) }: *const [u8]);
+          StorageDead(_53);
+          StorageDead(_52);
+          _50 = opaque::<bool>(move _51) -> [return: bb3, unwind continue];
+      }
+  
+      bb3: {
+          StorageDead(_51);
+          StorageDead(_50);
+          StorageLive(_54);
+          StorageLive(_55);
+          StorageLive(_56);
+-         _56 = _37;
++         _56 = const Indirect { alloc_id: ALLOC0, offset: Size(0 bytes) }: *const [u8];
+          StorageLive(_57);
+-         _57 = _39;
+-         _55 = Lt(move _56, move _57);
++         _57 = const Indirect { alloc_id: ALLOC1, offset: Size(0 bytes) }: *const [u8];
++         _55 = Lt(const Indirect { alloc_id: ALLOC0, offset: Size(0 bytes) }: *const [u8], const Indirect { alloc_id: ALLOC1, offset: Size(0 bytes) }: *const [u8]);
+          StorageDead(_57);
+          StorageDead(_56);
+          _54 = opaque::<bool>(move _55) -> [return: bb4, unwind continue];
+      }
+  
+      bb4: {
+          StorageDead(_55);
+          StorageDead(_54);
+          StorageLive(_58);
+          StorageLive(_59);
+          StorageLive(_60);
+          StorageLive(_61);
+-         _61 = _37;
++         _61 = const Indirect { alloc_id: ALLOC0, offset: Size(0 bytes) }: *const [u8];
+          StorageLive(_62);
+-         _62 = _39;
+-         _60 = Ge(move _61, move _62);
++         _62 = const Indirect { alloc_id: ALLOC1, offset: Size(0 bytes) }: *const [u8];
++         _60 = Ge(const Indirect { alloc_id: ALLOC0, offset: Size(0 bytes) }: *const [u8], const Indirect { alloc_id: ALLOC1, offset: Size(0 bytes) }: *const [u8]);
+          StorageDead(_62);
+          StorageDead(_61);
+          _59 = Not(move _60);
+          StorageDead(_60);
+          _58 = opaque::<bool>(move _59) -> [return: bb5, unwind continue];
+      }
+  
+      bb5: {
+          StorageDead(_59);
+          StorageDead(_58);
+          StorageLive(_63);
+          StorageLive(_64);
+          StorageLive(_65);
+          StorageLive(_66);
+-         _66 = _37;
++         _66 = const Indirect { alloc_id: ALLOC0, offset: Size(0 bytes) }: *const [u8];
+          StorageLive(_67);
+-         _67 = _39;
+-         _65 = Gt(move _66, move _67);
++         _67 = const Indirect { alloc_id: ALLOC1, offset: Size(0 bytes) }: *const [u8];
++         _65 = Gt(const Indirect { alloc_id: ALLOC0, offset: Size(0 bytes) }: *const [u8], const Indirect { alloc_id: ALLOC1, offset: Size(0 bytes) }: *const [u8]);
+          StorageDead(_67);
+          StorageDead(_66);
+          _64 = Not(move _65);
+          StorageDead(_65);
+          _63 = opaque::<bool>(move _64) -> [return: bb6, unwind continue];
+      }
+  
+      bb6: {
+          StorageDead(_64);
+          StorageDead(_63);
+          _0 = const ();
+-         StorageDead(_39);
+-         StorageDead(_37);
++         nop;
++         nop;
+          StorageDead(_33);
+          StorageDead(_29);
+          StorageDead(_25);
+          StorageDead(_21);
+          StorageDead(_17);
+          StorageDead(_13);
+-         StorageDead(_7);
+-         StorageDead(_1);
++         nop;
++         nop;
+          return;
+      }
++ }
++ 
++ ALLOC1 (size: 16, align: 8) {
++     01 00 00 00 00 00 00 00 02 00 00 00 00 00 00 00 │ ................
++ }
++ 
++ ALLOC0 (size: 16, align: 8) {
++     01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 │ ................
+  }
+  
diff --git a/tests/mir-opt/issue_101973.inner.GVN.panic-abort.diff b/tests/mir-opt/issue_101973.inner.GVN.panic-abort.diff
index b04728a9b0f..187290785c0 100644
--- a/tests/mir-opt/issue_101973.inner.GVN.panic-abort.diff
+++ b/tests/mir-opt/issue_101973.inner.GVN.panic-abort.diff
@@ -19,7 +19,6 @@
       scope 1 (inlined imm8) {
           debug x => _5;
           let mut _14: u32;
-          let mut _15: u32;
           scope 2 {
               debug out => _4;
           }
@@ -36,14 +35,14 @@
           StorageLive(_5);
           _5 = _1;
           _4 = const 0_u32;
-          StorageLive(_15);
-          StorageLive(_14);
--         _14 = Shr(_5, const 0_i32);
-+         _14 = Shr(_1, const 0_i32);
-          _15 = BitAnd(move _14, const 255_u32);
-          StorageDead(_14);
-          _4 = BitOr(const 0_u32, move _15);
-          StorageDead(_15);
+-         StorageLive(_14);
+-         _14 = BitAnd(_5, const 255_u32);
+-         _4 = BitOr(const 0_u32, move _14);
+-         StorageDead(_14);
++         nop;
++         _14 = BitAnd(_1, const 255_u32);
++         _4 = _14;
++         nop;
           StorageDead(_5);
           StorageLive(_6);
           StorageLive(_7);
diff --git a/tests/mir-opt/issue_101973.inner.GVN.panic-unwind.diff b/tests/mir-opt/issue_101973.inner.GVN.panic-unwind.diff
index fcf99ac6918..99350bac478 100644
--- a/tests/mir-opt/issue_101973.inner.GVN.panic-unwind.diff
+++ b/tests/mir-opt/issue_101973.inner.GVN.panic-unwind.diff
@@ -19,7 +19,6 @@
       scope 1 (inlined imm8) {
           debug x => _5;
           let mut _14: u32;
-          let mut _15: u32;
           scope 2 {
               debug out => _4;
           }
@@ -36,14 +35,14 @@
           StorageLive(_5);
           _5 = _1;
           _4 = const 0_u32;
-          StorageLive(_15);
-          StorageLive(_14);
--         _14 = Shr(_5, const 0_i32);
-+         _14 = Shr(_1, const 0_i32);
-          _15 = BitAnd(move _14, const 255_u32);
-          StorageDead(_14);
-          _4 = BitOr(const 0_u32, move _15);
-          StorageDead(_15);
+-         StorageLive(_14);
+-         _14 = BitAnd(_5, const 255_u32);
+-         _4 = BitOr(const 0_u32, move _14);
+-         StorageDead(_14);
++         nop;
++         _14 = BitAnd(_1, const 255_u32);
++         _4 = _14;
++         nop;
           StorageDead(_5);
           StorageLive(_6);
           StorageLive(_7);
diff --git a/tests/ui/borrowck/fn-item-check-trait-ref.rs b/tests/ui/borrowck/fn-item-check-trait-ref.rs
new file mode 100644
index 00000000000..bdbb52e974f
--- /dev/null
+++ b/tests/ui/borrowck/fn-item-check-trait-ref.rs
@@ -0,0 +1,15 @@
+// The method `assert_static` should be callable only for static values,
+// because the impl has an implied bound `where T: 'static`.
+
+// check-fail
+
+trait AnyStatic<Witness>: Sized {
+    fn assert_static(self) {}
+}
+
+impl<T> AnyStatic<&'static T> for T {}
+
+fn main() {
+    (&String::new()).assert_static();
+    //~^ ERROR temporary value dropped while borrowed
+}
diff --git a/tests/ui/borrowck/fn-item-check-trait-ref.stderr b/tests/ui/borrowck/fn-item-check-trait-ref.stderr
new file mode 100644
index 00000000000..92fd67c316c
--- /dev/null
+++ b/tests/ui/borrowck/fn-item-check-trait-ref.stderr
@@ -0,0 +1,12 @@
+error[E0716]: temporary value dropped while borrowed
+  --> $DIR/fn-item-check-trait-ref.rs:13:7
+   |
+LL |     (&String::new()).assert_static();
+   |     --^^^^^^^^^^^^^------------------ temporary value is freed at the end of this statement
+   |     | |
+   |     | creates a temporary value which is freed while still in use
+   |     argument requires that borrow lasts for `'static`
+
+error: aborting due to 1 previous error
+
+For more information about this error, try `rustc --explain E0716`.
diff --git a/tests/ui/borrowck/fn-item-check-type-params.rs b/tests/ui/borrowck/fn-item-check-type-params.rs
new file mode 100644
index 00000000000..805c0d00de5
--- /dev/null
+++ b/tests/ui/borrowck/fn-item-check-type-params.rs
@@ -0,0 +1,57 @@
+// Regression test for #104005.
+//
+// Previously, different borrowck implementations used to disagree here.
+// The status of each is documented on `fn test_*`.
+
+// check-fail
+
+use std::fmt::Display;
+
+trait Displayable {
+    fn display(self) -> Box<dyn Display>;
+}
+
+impl<T: Display> Displayable for (T, Option<&'static T>) {
+    fn display(self) -> Box<dyn Display> {
+        Box::new(self.0)
+    }
+}
+
+fn extend_lt<T, U>(val: T) -> Box<dyn Display>
+where
+    (T, Option<U>): Displayable,
+{
+    Displayable::display((val, None))
+}
+
+// AST: fail
+// HIR: pass
+// MIR: pass
+pub fn test_call<'a>(val: &'a str) {
+    extend_lt(val);
+    //~^ ERROR borrowed data escapes outside of function
+}
+
+// AST: fail
+// HIR: fail
+// MIR: pass
+pub fn test_coercion<'a>() {
+    let _: fn(&'a str) -> _ = extend_lt;
+    //~^ ERROR lifetime may not live long enough
+}
+
+// AST: fail
+// HIR: fail
+// MIR: fail
+pub fn test_arg() {
+    fn want<I, O>(_: I, _: impl Fn(I) -> O) {}
+    want(&String::new(), extend_lt);
+    //~^ ERROR temporary value dropped while borrowed
+}
+
+// An exploit of the unsoundness.
+fn main() {
+    let val = extend_lt(&String::from("blah blah blah"));
+    //~^ ERROR temporary value dropped while borrowed
+    println!("{}", val);
+}
diff --git a/tests/ui/borrowck/fn-item-check-type-params.stderr b/tests/ui/borrowck/fn-item-check-type-params.stderr
new file mode 100644
index 00000000000..3a29edc55c5
--- /dev/null
+++ b/tests/ui/borrowck/fn-item-check-type-params.stderr
@@ -0,0 +1,43 @@
+error[E0521]: borrowed data escapes outside of function
+  --> $DIR/fn-item-check-type-params.rs:31:5
+   |
+LL | pub fn test_call<'a>(val: &'a str) {
+   |                  --  --- `val` is a reference that is only valid in the function body
+   |                  |
+   |                  lifetime `'a` defined here
+LL |     extend_lt(val);
+   |     ^^^^^^^^^^^^^^
+   |     |
+   |     `val` escapes the function body here
+   |     argument requires that `'a` must outlive `'static`
+
+error: lifetime may not live long enough
+  --> $DIR/fn-item-check-type-params.rs:39:12
+   |
+LL | pub fn test_coercion<'a>() {
+   |                      -- lifetime `'a` defined here
+LL |     let _: fn(&'a str) -> _ = extend_lt;
+   |            ^^^^^^^^^^^^^^^^ type annotation requires that `'a` must outlive `'static`
+
+error[E0716]: temporary value dropped while borrowed
+  --> $DIR/fn-item-check-type-params.rs:48:11
+   |
+LL |     want(&String::new(), extend_lt);
+   |     ------^^^^^^^^^^^^^------------- temporary value is freed at the end of this statement
+   |     |     |
+   |     |     creates a temporary value which is freed while still in use
+   |     argument requires that borrow lasts for `'static`
+
+error[E0716]: temporary value dropped while borrowed
+  --> $DIR/fn-item-check-type-params.rs:54:26
+   |
+LL |     let val = extend_lt(&String::from("blah blah blah"));
+   |               -----------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^-- temporary value is freed at the end of this statement
+   |               |          |
+   |               |          creates a temporary value which is freed while still in use
+   |               argument requires that borrow lasts for `'static`
+
+error: aborting due to 4 previous errors
+
+Some errors have detailed explanations: E0521, E0716.
+For more information about an error, try `rustc --explain E0521`.
diff --git a/tests/ui/check-cfg/cargo-feature.none.stderr b/tests/ui/check-cfg/cargo-feature.none.stderr
index 9a308429484..aed4fd2a8c0 100644
--- a/tests/ui/check-cfg/cargo-feature.none.stderr
+++ b/tests/ui/check-cfg/cargo-feature.none.stderr
@@ -1,34 +1,36 @@
-warning: unexpected `cfg` condition name: `feature`
-  --> $DIR/cargo-feature.rs:13:7
+warning: unexpected `cfg` condition value: `serde`
+  --> $DIR/cargo-feature.rs:14:7
    |
 LL | #[cfg(feature = "serde")]
-   |       ^^^^^^^^^^^^^^^^^
+   |       ^^^^^^^^^^^^^^^^^ help: remove the condition
    |
-   = help: consider defining some features in `Cargo.toml`
+   = note: no expected values for `feature`
+   = help: consider adding `serde` as a feature in `Cargo.toml`
    = note: see <https://doc.rust-lang.org/nightly/cargo/reference/unstable.html#check-cfg> for more information about checking conditional configuration
    = note: `#[warn(unexpected_cfgs)]` on by default
 
-warning: unexpected `cfg` condition name: `feature`
+warning: unexpected `cfg` condition value: (none)
   --> $DIR/cargo-feature.rs:18:7
    |
 LL | #[cfg(feature)]
-   |       ^^^^^^^
+   |       ^^^^^^^ help: remove the condition
    |
+   = note: no expected values for `feature`
    = help: consider defining some features in `Cargo.toml`
    = note: see <https://doc.rust-lang.org/nightly/cargo/reference/unstable.html#check-cfg> for more information about checking conditional configuration
 
 warning: unexpected `cfg` condition name: `tokio_unstable`
-  --> $DIR/cargo-feature.rs:23:7
+  --> $DIR/cargo-feature.rs:22:7
    |
 LL | #[cfg(tokio_unstable)]
    |       ^^^^^^^^^^^^^^
    |
-   = help: expected names are: `debug_assertions`, `doc`, `doctest`, `miri`, `overflow_checks`, `panic`, `proc_macro`, `relocation_model`, `sanitize`, `sanitizer_cfi_generalize_pointers`, `sanitizer_cfi_normalize_integers`, `target_abi`, `target_arch`, `target_endian`, `target_env`, `target_family`, `target_feature`, `target_has_atomic`, `target_has_atomic_equal_alignment`, `target_has_atomic_load_store`, `target_os`, `target_pointer_width`, `target_thread_local`, `target_vendor`, `test`, `unix`, `windows`
+   = help: expected names are: `debug_assertions`, `doc`, `doctest`, `feature`, `miri`, `overflow_checks`, `panic`, `proc_macro`, `relocation_model`, `sanitize`, `sanitizer_cfi_generalize_pointers`, `sanitizer_cfi_normalize_integers`, `target_abi`, `target_arch`, `target_endian`, `target_env`, `target_family`, `target_feature`, `target_has_atomic`, `target_has_atomic_equal_alignment`, `target_has_atomic_load_store`, `target_os`, `target_pointer_width`, `target_thread_local`, `target_vendor`, `test`, `unix`, `windows`
    = help: consider using a Cargo feature instead or adding `println!("cargo:rustc-check-cfg=cfg(tokio_unstable)");` to the top of a `build.rs`
    = note: see <https://doc.rust-lang.org/nightly/cargo/reference/unstable.html#check-cfg> for more information about checking conditional configuration
 
 warning: unexpected `cfg` condition name: `CONFIG_NVME`
-  --> $DIR/cargo-feature.rs:27:7
+  --> $DIR/cargo-feature.rs:26:7
    |
 LL | #[cfg(CONFIG_NVME = "m")]
    |       ^^^^^^^^^^^^^^^^^
diff --git a/tests/ui/check-cfg/cargo-feature.rs b/tests/ui/check-cfg/cargo-feature.rs
index f2fd0fd6420..8542174d0c0 100644
--- a/tests/ui/check-cfg/cargo-feature.rs
+++ b/tests/ui/check-cfg/cargo-feature.rs
@@ -5,19 +5,18 @@
 // check-pass
 // revisions: some none
 // rustc-env:CARGO=/usr/bin/cargo
-// compile-flags: --check-cfg=cfg() -Z unstable-options
+// compile-flags: -Z unstable-options
+// [none]compile-flags: --check-cfg=cfg(feature,values())
 // [some]compile-flags: --check-cfg=cfg(feature,values("bitcode"))
 // [some]compile-flags: --check-cfg=cfg(CONFIG_NVME,values("y"))
 // [none]error-pattern:Cargo.toml
 
 #[cfg(feature = "serde")]
-//[none]~^ WARNING unexpected `cfg` condition name
-//[some]~^^ WARNING unexpected `cfg` condition value
+//~^ WARNING unexpected `cfg` condition value
 fn ser() {}
 
 #[cfg(feature)]
-//[none]~^ WARNING unexpected `cfg` condition name
-//[some]~^^ WARNING unexpected `cfg` condition value
+//~^ WARNING unexpected `cfg` condition value
 fn feat() {}
 
 #[cfg(tokio_unstable)]
diff --git a/tests/ui/check-cfg/cargo-feature.some.stderr b/tests/ui/check-cfg/cargo-feature.some.stderr
index fc6951b5617..74d65e550bb 100644
--- a/tests/ui/check-cfg/cargo-feature.some.stderr
+++ b/tests/ui/check-cfg/cargo-feature.some.stderr
@@ -1,5 +1,5 @@
 warning: unexpected `cfg` condition value: `serde`
-  --> $DIR/cargo-feature.rs:13:7
+  --> $DIR/cargo-feature.rs:14:7
    |
 LL | #[cfg(feature = "serde")]
    |       ^^^^^^^^^^^^^^^^^
@@ -16,10 +16,11 @@ LL | #[cfg(feature)]
    |       ^^^^^^^- help: specify a config value: `= "bitcode"`
    |
    = note: expected values for `feature` are: `bitcode`
+   = help: consider defining some features in `Cargo.toml`
    = note: see <https://doc.rust-lang.org/nightly/cargo/reference/unstable.html#check-cfg> for more information about checking conditional configuration
 
 warning: unexpected `cfg` condition name: `tokio_unstable`
-  --> $DIR/cargo-feature.rs:23:7
+  --> $DIR/cargo-feature.rs:22:7
    |
 LL | #[cfg(tokio_unstable)]
    |       ^^^^^^^^^^^^^^
@@ -29,7 +30,7 @@ LL | #[cfg(tokio_unstable)]
    = note: see <https://doc.rust-lang.org/nightly/cargo/reference/unstable.html#check-cfg> for more information about checking conditional configuration
 
 warning: unexpected `cfg` condition value: `m`
-  --> $DIR/cargo-feature.rs:27:7
+  --> $DIR/cargo-feature.rs:26:7
    |
 LL | #[cfg(CONFIG_NVME = "m")]
    |       ^^^^^^^^^^^^^^---
diff --git a/tests/ui/check-cfg/concat-values.rs b/tests/ui/check-cfg/concat-values.rs
index 0f9178ce6a5..ad922f8c908 100644
--- a/tests/ui/check-cfg/concat-values.rs
+++ b/tests/ui/check-cfg/concat-values.rs
@@ -1,6 +1,7 @@
 // check-pass
 // compile-flags: -Z unstable-options
 // compile-flags: --check-cfg=cfg(my_cfg,values("foo")) --check-cfg=cfg(my_cfg,values("bar"))
+// compile-flags: --check-cfg=cfg(my_cfg,values())
 
 #[cfg(my_cfg)]
 //~^ WARNING unexpected `cfg` condition value
@@ -10,4 +11,7 @@ fn my_cfg() {}
 //~^ WARNING unexpected `cfg` condition value
 fn my_cfg() {}
 
+#[cfg(any(my_cfg = "foo", my_cfg = "bar"))]
+fn foo_and_bar() {}
+
 fn main() {}
diff --git a/tests/ui/check-cfg/concat-values.stderr b/tests/ui/check-cfg/concat-values.stderr
index dec43f5bda3..6fe9f2baa09 100644
--- a/tests/ui/check-cfg/concat-values.stderr
+++ b/tests/ui/check-cfg/concat-values.stderr
@@ -1,5 +1,5 @@
 warning: unexpected `cfg` condition value: (none)
-  --> $DIR/concat-values.rs:5:7
+  --> $DIR/concat-values.rs:6:7
    |
 LL | #[cfg(my_cfg)]
    |       ^^^^^^
@@ -10,7 +10,7 @@ LL | #[cfg(my_cfg)]
    = note: `#[warn(unexpected_cfgs)]` on by default
 
 warning: unexpected `cfg` condition value: `unk`
-  --> $DIR/concat-values.rs:9:7
+  --> $DIR/concat-values.rs:10:7
    |
 LL | #[cfg(my_cfg = "unk")]
    |       ^^^^^^^^^^^^^^
diff --git a/tests/ui/check-cfg/empty-values.rs b/tests/ui/check-cfg/empty-values.rs
new file mode 100644
index 00000000000..7e6ba6ae84a
--- /dev/null
+++ b/tests/ui/check-cfg/empty-values.rs
@@ -0,0 +1,14 @@
+// Check that we detect unexpected value when none are allowed
+//
+// check-pass
+// compile-flags: --check-cfg=cfg(foo,values()) -Zunstable-options
+
+#[cfg(foo = "foo")]
+//~^ WARNING unexpected `cfg` condition value
+fn do_foo() {}
+
+#[cfg(foo)]
+//~^ WARNING unexpected `cfg` condition value
+fn do_foo() {}
+
+fn main() {}
diff --git a/tests/ui/check-cfg/empty-values.stderr b/tests/ui/check-cfg/empty-values.stderr
new file mode 100644
index 00000000000..e7b0b05d561
--- /dev/null
+++ b/tests/ui/check-cfg/empty-values.stderr
@@ -0,0 +1,23 @@
+warning: unexpected `cfg` condition value: `foo`
+  --> $DIR/empty-values.rs:6:7
+   |
+LL | #[cfg(foo = "foo")]
+   |       ^^^^^^^^^^^ help: remove the condition
+   |
+   = note: no expected values for `foo`
+   = help: to expect this configuration use `--check-cfg=cfg(foo, values("foo"))`
+   = note: see <https://doc.rust-lang.org/nightly/unstable-book/compiler-flags/check-cfg.html> for more information about checking conditional configuration
+   = note: `#[warn(unexpected_cfgs)]` on by default
+
+warning: unexpected `cfg` condition value: (none)
+  --> $DIR/empty-values.rs:10:7
+   |
+LL | #[cfg(foo)]
+   |       ^^^ help: remove the condition
+   |
+   = note: no expected values for `foo`
+   = help: to expect this configuration use `--check-cfg=cfg(foo)`
+   = note: see <https://doc.rust-lang.org/nightly/unstable-book/compiler-flags/check-cfg.html> for more information about checking conditional configuration
+
+warning: 2 warnings emitted
+
diff --git a/tests/ui/consts/const-eval/infinite_loop.rs b/tests/ui/consts/const-eval/infinite_loop.rs
index 21781490637..9bdb9929bec 100644
--- a/tests/ui/consts/const-eval/infinite_loop.rs
+++ b/tests/ui/consts/const-eval/infinite_loop.rs
@@ -1,7 +1,13 @@
+//! This test tests two things at once:
+//! 1. we error if a const evaluation hits the deny-by-default lint limit
+//! 2. we do not ICE on invalid follow-up code
+
+// compile-flags: -Z tiny-const-eval-limit
+
 fn main() {
     // Tests the Collatz conjecture with an incorrect base case (0 instead of 1).
     // The value of `n` will loop indefinitely (4 - 2 - 1 - 4).
-    let _ = [(); {
+    let s = [(); {
         let mut n = 113383; // #20 in https://oeis.org/A006884
         while n != 0 {
             //~^ ERROR is taking a long time
@@ -9,4 +15,6 @@ fn main() {
         }
         n
     }];
+
+    s.nonexistent_method();
 }
diff --git a/tests/ui/consts/const-eval/infinite_loop.stderr b/tests/ui/consts/const-eval/infinite_loop.stderr
index e7a0a96a1e6..37cd94bf7b7 100644
--- a/tests/ui/consts/const-eval/infinite_loop.stderr
+++ b/tests/ui/consts/const-eval/infinite_loop.stderr
@@ -1,5 +1,5 @@
 error: constant evaluation is taking a long time
-  --> $DIR/infinite_loop.rs:6:9
+  --> $DIR/infinite_loop.rs:12:9
    |
 LL | /         while n != 0 {
 LL | |
@@ -10,9 +10,9 @@ LL | |         }
    = note: this lint makes sure the compiler doesn't get stuck due to infinite loops in const eval.
            If your compilation actually takes a long time, you can safely allow the lint.
 help: the constant being evaluated
-  --> $DIR/infinite_loop.rs:4:18
+  --> $DIR/infinite_loop.rs:10:18
    |
-LL |       let _ = [(); {
+LL |       let s = [(); {
    |  __________________^
 LL | |         let mut n = 113383; // #20 in https://oeis.org/A006884
 LL | |         while n != 0 {
diff --git a/tests/ui/feature-gates/feature-gate-proc_macro_c_str_literals.rs b/tests/ui/feature-gates/feature-gate-proc_macro_c_str_literals.rs
new file mode 100644
index 00000000000..5554c813925
--- /dev/null
+++ b/tests/ui/feature-gates/feature-gate-proc_macro_c_str_literals.rs
@@ -0,0 +1,11 @@
+// edition: 2021
+// force-host
+#![crate_type = "proc-macro"]
+
+extern crate proc_macro;
+
+use proc_macro::Literal;
+
+fn test() {
+    Literal::c_string(c"a"); //~ ERROR use of unstable library feature 'proc_macro_c_str_literals'
+}
diff --git a/tests/ui/feature-gates/feature-gate-proc_macro_c_str_literals.stderr b/tests/ui/feature-gates/feature-gate-proc_macro_c_str_literals.stderr
new file mode 100644
index 00000000000..9bba1d50ce3
--- /dev/null
+++ b/tests/ui/feature-gates/feature-gate-proc_macro_c_str_literals.stderr
@@ -0,0 +1,13 @@
+error[E0658]: use of unstable library feature 'proc_macro_c_str_literals'
+  --> $DIR/feature-gate-proc_macro_c_str_literals.rs:10:5
+   |
+LL |     Literal::c_string(c"a");
+   |     ^^^^^^^^^^^^^^^^^
+   |
+   = note: see issue #119750 <https://github.com/rust-lang/rust/issues/119750> for more information
+   = help: add `#![feature(proc_macro_c_str_literals)]` to the crate attributes to enable
+   = note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
+
+error: aborting due to 1 previous error
+
+For more information about this error, try `rustc --explain E0658`.
diff --git a/tests/ui/higher-ranked/trait-bounds/issue-59311.rs b/tests/ui/higher-ranked/trait-bounds/issue-59311.rs
index 3ad548450e5..387c78a802a 100644
--- a/tests/ui/higher-ranked/trait-bounds/issue-59311.rs
+++ b/tests/ui/higher-ranked/trait-bounds/issue-59311.rs
@@ -17,6 +17,7 @@ where
     v.t(|| {});
     //~^ ERROR: higher-ranked lifetime error
     //~| ERROR: higher-ranked lifetime error
+    //~| ERROR: higher-ranked lifetime error
 }
 
 fn main() {}
diff --git a/tests/ui/higher-ranked/trait-bounds/issue-59311.stderr b/tests/ui/higher-ranked/trait-bounds/issue-59311.stderr
index e50aad876d8..3053a299802 100644
--- a/tests/ui/higher-ranked/trait-bounds/issue-59311.stderr
+++ b/tests/ui/higher-ranked/trait-bounds/issue-59311.stderr
@@ -7,6 +7,15 @@ LL |     v.t(|| {});
    = note: could not prove `{closure@$DIR/issue-59311.rs:17:9: 17:11} well-formed`
 
 error: higher-ranked lifetime error
+  --> $DIR/issue-59311.rs:17:5
+   |
+LL |     v.t(|| {});
+   |     ^^^^^^^^^^
+   |
+   = note: could not prove `{closure@$DIR/issue-59311.rs:17:9: 17:11} well-formed`
+   = note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
+
+error: higher-ranked lifetime error
   --> $DIR/issue-59311.rs:17:9
    |
 LL |     v.t(|| {});
@@ -14,5 +23,5 @@ LL |     v.t(|| {});
    |
    = note: could not prove `for<'a> &'a V: 'b`
 
-error: aborting due to 2 previous errors
+error: aborting due to 3 previous errors
 
diff --git a/tests/ui/implied-bounds/implied-bounds-on-trait-hierarchy.rs b/tests/ui/implied-bounds/implied-bounds-on-trait-hierarchy-1.rs
index 9c26cd59d10..b532a110a1c 100644
--- a/tests/ui/implied-bounds/implied-bounds-on-trait-hierarchy.rs
+++ b/tests/ui/implied-bounds/implied-bounds-on-trait-hierarchy-1.rs
@@ -1,9 +1,7 @@
-// check-pass
-// known-bug: #84591
+// issue: #84591
 
-// Should fail. Subtrait can incorrectly extend supertrait lifetimes even when
-// supertrait has weaker implied bounds than subtrait. Strongly related to
-// issue #25860.
+// Subtrait was able to incorrectly extend supertrait lifetimes even when
+// supertrait had weaker implied bounds than subtrait.
 
 trait Subtrait<T>: Supertrait {}
 trait Supertrait {
@@ -34,6 +32,7 @@ fn main() {
     {
         let x = "Hello World".to_string();
         subs_to_soup((x.as_str(), &mut d));
+        //~^ does not live long enough
     }
     println!("{}", d);
 }
diff --git a/tests/ui/implied-bounds/implied-bounds-on-trait-hierarchy-1.stderr b/tests/ui/implied-bounds/implied-bounds-on-trait-hierarchy-1.stderr
new file mode 100644
index 00000000000..f44defccf58
--- /dev/null
+++ b/tests/ui/implied-bounds/implied-bounds-on-trait-hierarchy-1.stderr
@@ -0,0 +1,16 @@
+error[E0597]: `x` does not live long enough
+  --> $DIR/implied-bounds-on-trait-hierarchy-1.rs:34:23
+   |
+LL |         let x = "Hello World".to_string();
+   |             - binding `x` declared here
+LL |         subs_to_soup((x.as_str(), &mut d));
+   |                       ^ borrowed value does not live long enough
+LL |
+LL |     }
+   |     - `x` dropped here while still borrowed
+LL |     println!("{}", d);
+   |                    - borrow later used here
+
+error: aborting due to 1 previous error
+
+For more information about this error, try `rustc --explain E0597`.
diff --git a/tests/ui/implied-bounds/implied-bounds-on-trait-hierarchy-2.rs b/tests/ui/implied-bounds/implied-bounds-on-trait-hierarchy-2.rs
new file mode 100644
index 00000000000..511a9ad9a2a
--- /dev/null
+++ b/tests/ui/implied-bounds/implied-bounds-on-trait-hierarchy-2.rs
@@ -0,0 +1,45 @@
+// check-pass
+// known-bug: #84591
+
+trait Subtrait<'a, 'b, R>: Supertrait<'a, 'b> {}
+trait Supertrait<'a, 'b> {
+    fn convert<T: ?Sized>(x: &'a T) -> &'b T;
+}
+
+fn need_hrtb_subtrait<'a_, 'b_, S, T: ?Sized>(x: &'a_ T) -> &'b_ T
+where
+    S: for<'a, 'b> Subtrait<'a, 'b, &'b &'a ()>,
+{
+    need_hrtb_supertrait::<S, T>(x)
+    // This call works and drops the implied bound `'a: 'b`
+    // of the where-bound. This means the where-bound can
+    // now be used to transmute any two lifetimes.
+}
+
+fn need_hrtb_supertrait<'a_, 'b_, S, T: ?Sized>(x: &'a_ T) -> &'b_ T
+where
+    S: for<'a, 'b> Supertrait<'a, 'b>,
+{
+    S::convert(x)
+}
+
+struct MyStruct;
+impl<'a: 'b, 'b> Supertrait<'a, 'b> for MyStruct {
+    fn convert<T: ?Sized>(x: &'a T) -> &'b T {
+        x
+    }
+}
+impl<'a, 'b> Subtrait<'a, 'b, &'b &'a ()> for MyStruct {}
+
+fn extend_lifetime<'a, 'b, T: ?Sized>(x: &'a T) -> &'b T {
+    need_hrtb_subtrait::<MyStruct, T>(x)
+}
+
+fn main() {
+    let d;
+    {
+        let x = "Hello World".to_string();
+        d = extend_lifetime(&x);
+    }
+    println!("{}", d);
+}
diff --git a/tests/ui/lifetimes/lifetime-errors/issue_74400.rs b/tests/ui/lifetimes/lifetime-errors/issue_74400.rs
index ddb8bacce8f..f17e0a678c9 100644
--- a/tests/ui/lifetimes/lifetime-errors/issue_74400.rs
+++ b/tests/ui/lifetimes/lifetime-errors/issue_74400.rs
@@ -11,6 +11,8 @@ fn f<T, S>(data: &[T], key: impl Fn(&T) -> S) {
 fn g<T>(data: &[T]) {
     f(data, identity)
     //~^ ERROR the parameter type
+    //~| ERROR the parameter type
+    //~| ERROR the parameter type
     //~| ERROR mismatched types
     //~| ERROR implementation of `FnOnce` is not general
 }
diff --git a/tests/ui/lifetimes/lifetime-errors/issue_74400.stderr b/tests/ui/lifetimes/lifetime-errors/issue_74400.stderr
index 677f918fe93..beb838d2ff8 100644
--- a/tests/ui/lifetimes/lifetime-errors/issue_74400.stderr
+++ b/tests/ui/lifetimes/lifetime-errors/issue_74400.stderr
@@ -12,6 +12,36 @@ help: consider adding an explicit lifetime bound
 LL | fn g<T: 'static>(data: &[T]) {
    |       +++++++++
 
+error[E0310]: the parameter type `T` may not live long enough
+  --> $DIR/issue_74400.rs:12:5
+   |
+LL |     f(data, identity)
+   |     ^^^^^^^^^^^^^^^^^
+   |     |
+   |     the parameter type `T` must be valid for the static lifetime...
+   |     ...so that the type `T` will meet its required lifetime bounds
+   |
+   = note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
+help: consider adding an explicit lifetime bound
+   |
+LL | fn g<T: 'static>(data: &[T]) {
+   |       +++++++++
+
+error[E0310]: the parameter type `T` may not live long enough
+  --> $DIR/issue_74400.rs:12:5
+   |
+LL |     f(data, identity)
+   |     ^^^^^^^^^^^^^^^^^
+   |     |
+   |     the parameter type `T` must be valid for the static lifetime...
+   |     ...so that the type `T` will meet its required lifetime bounds
+   |
+   = note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
+help: consider adding an explicit lifetime bound
+   |
+LL | fn g<T: 'static>(data: &[T]) {
+   |       +++++++++
+
 error[E0308]: mismatched types
   --> $DIR/issue_74400.rs:12:5
    |
@@ -35,7 +65,7 @@ LL |     f(data, identity)
    = note: `fn(&'2 T) -> &'2 T {identity::<&'2 T>}` must implement `FnOnce<(&'1 T,)>`, for any lifetime `'1`...
    = note: ...but it actually implements `FnOnce<(&'2 T,)>`, for some specific lifetime `'2`
 
-error: aborting due to 3 previous errors
+error: aborting due to 5 previous errors
 
 Some errors have detailed explanations: E0308, E0310.
 For more information about an error, try `rustc --explain E0308`.
diff --git a/tests/ui/proc-macro/auxiliary/api/mod.rs b/tests/ui/proc-macro/auxiliary/api/mod.rs
index 3bea5d75779..5a533b9e17e 100644
--- a/tests/ui/proc-macro/auxiliary/api/mod.rs
+++ b/tests/ui/proc-macro/auxiliary/api/mod.rs
@@ -1,10 +1,12 @@
 // force-host
 // no-prefer-dynamic
+// edition: 2021
 
 #![crate_type = "proc-macro"]
 #![crate_name = "proc_macro_api_tests"]
 #![feature(proc_macro_span)]
 #![feature(proc_macro_byte_character)]
+#![feature(proc_macro_c_str_literals)]
 #![deny(dead_code)] // catch if a test function is never called
 
 extern crate proc_macro;
diff --git a/tests/ui/proc-macro/auxiliary/api/parse.rs b/tests/ui/proc-macro/auxiliary/api/parse.rs
index 07c9f464961..801c616c804 100644
--- a/tests/ui/proc-macro/auxiliary/api/parse.rs
+++ b/tests/ui/proc-macro/auxiliary/api/parse.rs
@@ -19,10 +19,8 @@ fn test_display_literal() {
         "10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.0",
     );
 
-    assert_eq!(
-        Literal::string("a \t ❤ ' \" \u{1}").to_string(),
-        "\"a \\t ❤ ' \\\" \\u{1}\"",
-    );
+    assert_eq!(Literal::string("a \t ❤ ' \" \u{1}").to_string(), "\"a \\t ❤ ' \\\" \\u{1}\"",);
+    assert_eq!(Literal::c_string(c"\'\"\x7f\u{7fff}").to_string(), r#"c"\'\"\x7f\xe7\xbf\xbf""#);
     assert_eq!(Literal::character('a').to_string(), "'a'");
     assert_eq!(Literal::character('\t').to_string(), "'\\t'");
     assert_eq!(Literal::character('❤').to_string(), "'❤'");
@@ -41,6 +39,7 @@ fn test_parse_literal() {
     assert_eq!("b'a'".parse::<Literal>().unwrap().to_string(), "b'a'");
     assert_eq!("\"\n\"".parse::<Literal>().unwrap().to_string(), "\"\n\"");
     assert_eq!("b\"\"".parse::<Literal>().unwrap().to_string(), "b\"\"");
+    assert_eq!("c\"\"".parse::<Literal>().unwrap().to_string(), "c\"\"");
     assert_eq!("r##\"\"##".parse::<Literal>().unwrap().to_string(), "r##\"\"##");
     assert_eq!("10ulong".parse::<Literal>().unwrap().to_string(), "10ulong");
     assert_eq!("-10ulong".parse::<Literal>().unwrap().to_string(), "-10ulong");
diff --git a/tests/ui/proc-macro/test.rs b/tests/ui/proc-macro/test.rs
index c96aa73175f..2ec62072020 100644
--- a/tests/ui/proc-macro/test.rs
+++ b/tests/ui/proc-macro/test.rs
@@ -1,5 +1,6 @@
 // check-pass
 // aux-build:api/mod.rs
+// edition: 2021
 
 //! This is for everything that *would* be a #[test] inside of libproc_macro,
 //! except for the fact that proc_macro objects are not capable of existing
diff --git a/tests/ui/type-alias-impl-trait/closure_infer.rs b/tests/ui/type-alias-impl-trait/closure_infer.rs
new file mode 100644
index 00000000000..04e2323ec4a
--- /dev/null
+++ b/tests/ui/type-alias-impl-trait/closure_infer.rs
@@ -0,0 +1,35 @@
+// check-pass
+
+// Regression test for an ICE: https://github.com/rust-lang/rust/issues/119916
+
+#![feature(impl_trait_in_assoc_type)]
+#![feature(type_alias_impl_trait)]
+
+// `impl_trait_in_assoc_type` example from the bug report.
+pub trait StreamConsumer {
+    type BarrierStream;
+    fn execute() -> Self::BarrierStream;
+}
+
+pub struct DispatchExecutor;
+
+impl StreamConsumer for DispatchExecutor {
+    type BarrierStream = impl Sized;
+    fn execute() -> Self::BarrierStream {
+        || -> _ {}
+    }
+}
+
+// Functions that constrain TAITs can contain closures with an `_` in the return type.
+type Foo = impl Sized;
+fn foo() -> Foo {
+    || -> _ {}
+}
+
+// The `_` in the closure return type can also be the TAIT itself.
+type Bar = impl Sized;
+fn bar() -> impl FnOnce() -> Bar {
+    || -> _ {}
+}
+
+fn main() {}
diff --git a/tests/ui/type-alias-impl-trait/issue-77179.rs b/tests/ui/type-alias-impl-trait/issue-77179.rs
index 093aeb4b279..3d6c826d6ac 100644
--- a/tests/ui/type-alias-impl-trait/issue-77179.rs
+++ b/tests/ui/type-alias-impl-trait/issue-77179.rs
@@ -12,3 +12,8 @@ fn test() -> Pointer<_> {
 fn main() {
     test();
 }
+
+extern "Rust" {
+    fn bar() -> Pointer<_>;
+    //~^ ERROR: the placeholder `_` is not allowed within types
+}
diff --git a/tests/ui/type-alias-impl-trait/issue-77179.stderr b/tests/ui/type-alias-impl-trait/issue-77179.stderr
index 68dd6570d00..c5cacfd3cd3 100644
--- a/tests/ui/type-alias-impl-trait/issue-77179.stderr
+++ b/tests/ui/type-alias-impl-trait/issue-77179.stderr
@@ -7,6 +7,15 @@ LL | fn test() -> Pointer<_> {
    |              |       not allowed in type signatures
    |              help: replace with the correct return type: `Pointer<i32>`
 
-error: aborting due to 1 previous error
+error[E0121]: the placeholder `_` is not allowed within types on item signatures for functions
+  --> $DIR/issue-77179.rs:17:25
+   |
+LL |     fn bar() -> Pointer<_>;
+   |                         ^
+   |                         |
+   |                         not allowed in type signatures
+   |                         help: use type parameters instead: `T`
+
+error: aborting due to 2 previous errors
 
 For more information about this error, try `rustc --explain E0121`.
diff --git a/tests/ui/type-alias-impl-trait/wf-nested.fail.stderr b/tests/ui/type-alias-impl-trait/wf-nested.fail.stderr
index dcc4b8021ea..17c1f8897bf 100644
--- a/tests/ui/type-alias-impl-trait/wf-nested.fail.stderr
+++ b/tests/ui/type-alias-impl-trait/wf-nested.fail.stderr
@@ -1,5 +1,5 @@
 error[E0310]: the parameter type `T` may not live long enough
-  --> $DIR/wf-nested.rs:55:27
+  --> $DIR/wf-nested.rs:57:27
    |
 LL |     type InnerOpaque<T> = impl Sized;
    |                           ^^^^^^^^^^
diff --git a/tests/ui/type-alias-impl-trait/wf-nested.pass_sound.stderr b/tests/ui/type-alias-impl-trait/wf-nested.pass_sound.stderr
index 121664bd956..f5d3a218542 100644
--- a/tests/ui/type-alias-impl-trait/wf-nested.pass_sound.stderr
+++ b/tests/ui/type-alias-impl-trait/wf-nested.pass_sound.stderr
@@ -12,6 +12,21 @@ help: consider adding an explicit lifetime bound
 LL |     fn test<T: 'static>() {
    |              +++++++++
 
-error: aborting due to 1 previous error
+error[E0310]: the parameter type `T` may not live long enough
+  --> $DIR/wf-nested.rs:46:17
+   |
+LL |         let _ = outer.get();
+   |                 ^^^^^^^^^^^
+   |                 |
+   |                 the parameter type `T` must be valid for the static lifetime...
+   |                 ...so that the type `T` will meet its required lifetime bounds
+   |
+   = note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
+help: consider adding an explicit lifetime bound
+   |
+LL |     fn test<T: 'static>() {
+   |              +++++++++
+
+error: aborting due to 2 previous errors
 
 For more information about this error, try `rustc --explain E0310`.
diff --git a/tests/ui/type-alias-impl-trait/wf-nested.rs b/tests/ui/type-alias-impl-trait/wf-nested.rs
index de388329489..2f90c4e00e3 100644
--- a/tests/ui/type-alias-impl-trait/wf-nested.rs
+++ b/tests/ui/type-alias-impl-trait/wf-nested.rs
@@ -43,7 +43,9 @@ mod pass_sound {
 
     fn test<T>() {
         let outer = define::<T>();
-        let _ = outer.get(); //[pass_sound]~ ERROR `T` may not live long enough
+        let _ = outer.get();
+        //[pass_sound]~^ ERROR `T` may not live long enough
+        //[pass_sound]~| ERROR `T` may not live long enough
     }
 }
 
diff --git a/tests/ui/wf/wf-associated-const.rs b/tests/ui/wf/wf-associated-const.rs
new file mode 100644
index 00000000000..629d807cb7f
--- /dev/null
+++ b/tests/ui/wf/wf-associated-const.rs
@@ -0,0 +1,41 @@
+// check that associated consts can assume the impl header is well-formed.
+
+trait Foo<'a, 'b, T>: Sized {
+    const EVIL: fn(u: &'b u32) -> &'a u32;
+}
+
+struct Evil<'a, 'b: 'a>(Option<&'a &'b ()>);
+
+impl<'a, 'b> Foo<'a, 'b, Evil<'a, 'b>> for () {
+    const EVIL: fn(&'b u32) -> &'a u32 = { |u| u };
+}
+
+struct IndirectEvil<'a, 'b: 'a>(Option<&'a &'b ()>);
+
+impl<'a, 'b> Foo<'a, 'b, ()> for IndirectEvil<'a, 'b> {
+    const EVIL: fn(&'b u32) -> &'a u32 = { |u| u };
+}
+
+impl<'a, 'b> Evil<'a, 'b> {
+    const INHERENT_EVIL: fn(&'b u32) -> &'a u32 = { |u| u };
+}
+
+// while static methods can *assume* this, we should still
+// *check* that it holds at the use site.
+
+fn evil<'a, 'b>(b: &'b u32) -> &'a u32 {
+    <()>::EVIL(b)
+    //~^ ERROR lifetime may not live long enough
+}
+
+fn indirect_evil<'a, 'b>(b: &'b u32) -> &'a u32 {
+    <IndirectEvil>::EVIL(b)
+    //~^ ERROR lifetime may not live long enough
+}
+
+fn inherent_evil<'a, 'b>(b: &'b u32) -> &'a u32 {
+    <Evil>::INHERENT_EVIL(b)
+    //~^ ERROR lifetime may not live long enough
+}
+
+fn main() {}
diff --git a/tests/ui/wf/wf-associated-const.stderr b/tests/ui/wf/wf-associated-const.stderr
new file mode 100644
index 00000000000..b0e1a118fab
--- /dev/null
+++ b/tests/ui/wf/wf-associated-const.stderr
@@ -0,0 +1,38 @@
+error: lifetime may not live long enough
+  --> $DIR/wf-associated-const.rs:27:5
+   |
+LL | fn evil<'a, 'b>(b: &'b u32) -> &'a u32 {
+   |         --  -- lifetime `'b` defined here
+   |         |
+   |         lifetime `'a` defined here
+LL |     <()>::EVIL(b)
+   |     ^^^^^^^^^^^^^ function was supposed to return data with lifetime `'a` but it is returning data with lifetime `'b`
+   |
+   = help: consider adding the following bound: `'b: 'a`
+
+error: lifetime may not live long enough
+  --> $DIR/wf-associated-const.rs:32:5
+   |
+LL | fn indirect_evil<'a, 'b>(b: &'b u32) -> &'a u32 {
+   |                  --  -- lifetime `'b` defined here
+   |                  |
+   |                  lifetime `'a` defined here
+LL |     <IndirectEvil>::EVIL(b)
+   |     ^^^^^^^^^^^^^^^^^^^^^^^ function was supposed to return data with lifetime `'a` but it is returning data with lifetime `'b`
+   |
+   = help: consider adding the following bound: `'b: 'a`
+
+error: lifetime may not live long enough
+  --> $DIR/wf-associated-const.rs:37:5
+   |
+LL | fn inherent_evil<'a, 'b>(b: &'b u32) -> &'a u32 {
+   |                  --  -- lifetime `'b` defined here
+   |                  |
+   |                  lifetime `'a` defined here
+LL |     <Evil>::INHERENT_EVIL(b)
+   |     ^^^^^^^^^^^^^^^^^^^^^^^^ function was supposed to return data with lifetime `'a` but it is returning data with lifetime `'b`
+   |
+   = help: consider adding the following bound: `'b: 'a`
+
+error: aborting due to 3 previous errors
+
diff --git a/tests/ui/wf/wf-in-fn-type-implicit.rs b/tests/ui/wf/wf-in-fn-type-implicit.rs
deleted file mode 100644
index c5ff92c8875..00000000000
--- a/tests/ui/wf/wf-in-fn-type-implicit.rs
+++ /dev/null
@@ -1,37 +0,0 @@
-// check-pass
-// known-bug: #104005
-
-// Should fail. Function type parameters with implicit type annotations are not
-// checked for well-formedness, which allows incorrect borrowing.
-
-// In contrast, user annotations are always checked for well-formedness, and the
-// commented code below is correctly rejected by the borrow checker.
-
-use std::fmt::Display;
-
-trait Displayable {
-    fn display(self) -> Box<dyn Display>;
-}
-
-impl<T: Display> Displayable for (T, Option<&'static T>) {
-    fn display(self) -> Box<dyn Display> {
-        Box::new(self.0)
-    }
-}
-
-fn extend_lt<T, U>(val: T) -> Box<dyn Display>
-where
-    (T, Option<U>): Displayable,
-{
-    Displayable::display((val, None))
-}
-
-fn main() {
-    // *incorrectly* compiles
-    let val = extend_lt(&String::from("blah blah blah"));
-    println!("{}", val);
-
-    // *correctly* fails to compile
-    // let val = extend_lt::<_, &_>(&String::from("blah blah blah"));
-    // println!("{}", val);
-}
diff --git a/tests/ui/wf/wf-static-method.rs b/tests/ui/wf/wf-static-method.rs
index 7ff195230bf..66546ac489d 100644
--- a/tests/ui/wf/wf-static-method.rs
+++ b/tests/ui/wf/wf-static-method.rs
@@ -1,8 +1,4 @@
-// check that static methods don't get to assume their trait-ref
-// is well-formed.
-// FIXME(#27579): this is just a bug. However, our checking with
-// static inherent methods isn't quite working - need to
-// fix that before removing the check.
+// check that static methods can assume their trait-ref is well-formed.
 
 trait Foo<'a, 'b, T>: Sized {
     fn make_me() -> Self { loop {} }
@@ -15,7 +11,6 @@ impl<'a, 'b> Foo<'a, 'b, Evil<'a, 'b>> for () {
     fn make_me() -> Self { }
     fn static_evil(u: &'b u32) -> &'a u32 {
         u
-        //~^ ERROR lifetime may not live long enough
     }
 }
 
@@ -25,7 +20,6 @@ impl<'a, 'b> Foo<'a, 'b, ()> for IndirectEvil<'a, 'b> {
     fn make_me() -> Self { IndirectEvil(None) }
     fn static_evil(u: &'b u32) -> &'a u32 {
         let me = Self::make_me();
-        //~^ ERROR lifetime may not live long enough
         loop {} // (`me` could be used for the lifetime transmute).
     }
 }
@@ -33,12 +27,11 @@ impl<'a, 'b> Foo<'a, 'b, ()> for IndirectEvil<'a, 'b> {
 impl<'a, 'b> Evil<'a, 'b> {
     fn inherent_evil(u: &'b u32) -> &'a u32 {
         u
-        //~^ ERROR lifetime may not live long enough
     }
 }
 
-// while static methods don't get to *assume* this, we still
-// *check* that they hold.
+// while static methods can *assume* this, we should still
+// *check* that it holds at the use site.
 
 fn evil<'a, 'b>(b: &'b u32) -> &'a u32 {
     <()>::static_evil(b)
diff --git a/tests/ui/wf/wf-static-method.stderr b/tests/ui/wf/wf-static-method.stderr
index 161609a5f86..6c49098aad3 100644
--- a/tests/ui/wf/wf-static-method.stderr
+++ b/tests/ui/wf/wf-static-method.stderr
@@ -1,44 +1,5 @@
 error: lifetime may not live long enough
-  --> $DIR/wf-static-method.rs:17:9
-   |
-LL | impl<'a, 'b> Foo<'a, 'b, Evil<'a, 'b>> for () {
-   |      --  -- lifetime `'b` defined here
-   |      |
-   |      lifetime `'a` defined here
-...
-LL |         u
-   |         ^ associated function was supposed to return data with lifetime `'a` but it is returning data with lifetime `'b`
-   |
-   = help: consider adding the following bound: `'b: 'a`
-
-error: lifetime may not live long enough
-  --> $DIR/wf-static-method.rs:27:18
-   |
-LL | impl<'a, 'b> Foo<'a, 'b, ()> for IndirectEvil<'a, 'b> {
-   |      --  -- lifetime `'b` defined here
-   |      |
-   |      lifetime `'a` defined here
-...
-LL |         let me = Self::make_me();
-   |                  ^^^^^^^^^^^^^ requires that `'b` must outlive `'a`
-   |
-   = help: consider adding the following bound: `'b: 'a`
-
-error: lifetime may not live long enough
-  --> $DIR/wf-static-method.rs:35:9
-   |
-LL | impl<'a, 'b> Evil<'a, 'b> {
-   |      --  -- lifetime `'b` defined here
-   |      |
-   |      lifetime `'a` defined here
-LL |     fn inherent_evil(u: &'b u32) -> &'a u32 {
-LL |         u
-   |         ^ associated function was supposed to return data with lifetime `'a` but it is returning data with lifetime `'b`
-   |
-   = help: consider adding the following bound: `'b: 'a`
-
-error: lifetime may not live long enough
-  --> $DIR/wf-static-method.rs:44:5
+  --> $DIR/wf-static-method.rs:37:5
    |
 LL | fn evil<'a, 'b>(b: &'b u32) -> &'a u32 {
    |         --  -- lifetime `'b` defined here
@@ -50,7 +11,7 @@ LL |     <()>::static_evil(b)
    = help: consider adding the following bound: `'b: 'a`
 
 error: lifetime may not live long enough
-  --> $DIR/wf-static-method.rs:49:5
+  --> $DIR/wf-static-method.rs:42:5
    |
 LL | fn indirect_evil<'a, 'b>(b: &'b u32) -> &'a u32 {
    |                  --  -- lifetime `'b` defined here
@@ -62,7 +23,7 @@ LL |     <IndirectEvil>::static_evil(b)
    = help: consider adding the following bound: `'b: 'a`
 
 error: lifetime may not live long enough
-  --> $DIR/wf-static-method.rs:54:5
+  --> $DIR/wf-static-method.rs:47:5
    |
 LL | fn inherent_evil<'a, 'b>(b: &'b u32) -> &'a u32 {
    |                  --  -- lifetime `'b` defined here
@@ -73,5 +34,5 @@ LL |     <Evil>::inherent_evil(b)
    |
    = help: consider adding the following bound: `'b: 'a`
 
-error: aborting due to 6 previous errors
+error: aborting due to 3 previous errors