Skip to content

Commit

Permalink
Always inline functions signatures containing f16 or f128
Browse files Browse the repository at this point in the history
There are a handful of tier 2 and tier 3 targets that cause a LLVM crash
or linker error when generating code that contains `f16` or `f128`. The
cranelift backend also does not support these types. To work around
this, every function in `std` or `core` that contains these types must
be marked `#[inline]` in order to avoid sending any code to the backend
unless specifically requested.

However, this is inconvenient and easy to forget. Introduce a check for
these types in the frontend that automatically inlines any function
signatures that take or return `f16` or `f128`.

Note that this is not a perfect fix because it does not account for the
types being passed by reference or as members of aggregate types, but
this is sufficient for what is currently needed in the standard library.

Fixes: #133035
Closes: #133037
  • Loading branch information
tgross35 committed Nov 14, 2024
1 parent b77dbbd commit 781ea18
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 0 deletions.
10 changes: 10 additions & 0 deletions compiler/rustc_mir_transform/src/cross_crate_inline.rs
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,16 @@ fn cross_crate_inlinable(tcx: TyCtxt<'_>, def_id: LocalDefId) -> bool {
_ => {}
}

let sig = tcx.fn_sig(def_id).instantiate_identity();
for ty in sig.inputs().skip_binder().iter().chain(std::iter::once(&sig.output().skip_binder()))
{
// FIXME(f16_f128): in order to avoid crashes building `core`, always inline to skip
// codegen if the function is not used.
if ty == &tcx.types.f16 || ty == &tcx.types.f128 {
return true;
}
}

// Don't do any inference when incremental compilation is enabled; the additional inlining that
// inference permits also creates more work for small edits.
if tcx.sess.opts.incremental.is_some() {
Expand Down
29 changes: 29 additions & 0 deletions tests/codegen/float/f16-f128-inline.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
//@ revisions: default nopt
//@[nopt] compile-flags: -Zcross-crate-inline-threshold=never -Zmir-opt-level=0 -Cno-prepopulate-passes

// Ensure that functions using `f16` and `f128` are always inlined to avoid crashes
// when the backend does not support these types.

#![crate_type = "lib"]
#![feature(f128)]
#![feature(f16)]

pub fn f16_arg(_a: f16) {
// CHECK-NOT: f16_arg
todo!()
}

pub fn f16_ret() -> f16 {
// CHECK-NOT: f16_ret
todo!()
}

pub fn f128_arg(_a: f128) {
// CHECK-NOT: f128_arg
todo!()
}

pub fn f128_ret() -> f128 {
// CHECK-NOT: f128_ret
todo!()
}

0 comments on commit 781ea18

Please sign in to comment.