Rust: Invalid monomorphization when `-C link-dead-code` is used

Created on 4 Oct 2020  路  9Comments  路  Source: rust-lang/rust

I've tried to compile this crate https://github.com/yoanlcq/vek as part of running code coverage and with RUSTFLAGS="-C link-dead-code" and --features platform_intrinsics it fails to build. But without -C link-dead-code it builds and runs fine which is what I'd expect with the flag present.

Sample error (they're all the same error just different bits of code:

error[E0511]: invalid monomorphization of `simd_reduce_any` intrinsic: unsupported simd_reduce_any from `vec::repr_simd::extent2::Extent2<bool>` with element `bool` to `bool`
    --> src/vec.rs:1346:43
     |
1346 |                       simd_llvm => unsafe { simd_llvm::simd_reduce_any(self) },
     |                                             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
...
3195 | /     vec_impl_all_vecs!{
3196 | |         simd
3197 | |         #[repr(simd)]
3198 | |     }
     | |_____- in this macro invocation
     |
     = note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)

error: aborting due to 14 previous errors
A-diagnostics A-intrinsics A-simd D-confusing I-monomorphization P-medium T-compiler requires-nightly

Most helpful comment

I believe the code should never be compiled. Because if you manually replace Vec3<bool> with a struct
of 3 members of type bool, repr(simd) will error.
https://rust.godbolt.org/z/KG5fKT

#![feature(repr_simd)]

#[repr(simd)]
pub struct Vec3 { // error[E0077]: SIMD vector element type should be machine type
    pub x: bool,
    pub y: bool,
    pub z: bool,
}

In short, an useful error message is lost, instead a less useful error message replaces it.

All 9 comments

(Not sure if I-monomorphization is correct, remove it if it's not.)

Any progress on this error ? There are many projects which are having problems, as they use vek in one of their dependencies

Since this crate cannot be built with --features platform_intrinsics on stable:

   Compiling approx v0.3.2
error[E0658]: platform intrinsics are experimental and possibly buggy
  --> src/simd_llvm.rs:13:8
   |
13 | extern "platform-intrinsic" {
   |        ^^^^^^^^^^^^^^^^^^^^
   |
   = note: see issue #27731 <https://github.com/rust-lang/rust/issues/27731> for more information

warning: unused import: `crate::simd_llvm`
  --> src/vec.rs:21:5
   |
21 | use crate::simd_llvm;
   |     ^^^^^^^^^^^^^^^^
   |
   = note: `#[warn(unused_imports)]` on by default

error: aborting due to previous error; 1 warning emitted

For more information about this error, try `rustc --explain E0658`.

@rustbot modify labels: requires-nightly

@xd009642 do you know if this used to work on an old version of rust? Or has it always been an issue?

MCVE: https://rust.godbolt.org/z/ax56Mj

// compile-flags: --crate-type=rlib -C link-dead-code
#![feature(platform_intrinsics)]
#![feature(repr_simd)]

extern "platform-intrinsic" {
    pub fn simd_reduce_all<T>(x: T) -> bool;
}

#[repr(simd)]
// #[repr(C)]
pub struct Vec3<T> {
    pub x: T,
    pub y: T,
    pub z: T,
}

impl Vec3<bool> {
    #[inline]
    pub fn reduce_and(self) -> bool {
        unsafe { simd_reduce_all(self) }
    }
}

I used the MCVE and checked it with those toolchains on linux. And all show exact the same error.

  • nightly-2020-10-15
  • nightly-2020-10-10
  • nightly-2020-09-15
  • nightly-2020-08-15
  • nightly-2020-06-15
  • nightly-2020-04-15
  • nightly-2020-02-15
  • nightly-2019-12-15
  • nightly-2020-10-15
  • nightly-2019-08-15
  • nightly-2018-08-15
  • nightly-2017-08-15

(long version is always: nightly-20xx-yy-zz-x86_64-unknown-linux-gnu)
so i would guess that this code has never worked

@jyn514 I've no idea when it started, it's not my code I just write a tool that adds the linker flag :sweat_smile:

I believe the code should never be compiled. Because if you manually replace Vec3<bool> with a struct
of 3 members of type bool, repr(simd) will error.
https://rust.godbolt.org/z/KG5fKT

#![feature(repr_simd)]

#[repr(simd)]
pub struct Vec3 { // error[E0077]: SIMD vector element type should be machine type
    pub x: bool,
    pub y: bool,
    pub z: bool,
}

In short, an useful error message is lost, instead a less useful error message replaces it.

Assigning P-medium as discussed as part of the Prioritization Working Group procedure and removing I-prioritize.

Was this page helpful?
0 / 5 - 0 ratings