Skip to content

Commit 0820004

Browse files
committed
const_panic: don't wrap it in a separate function
1 parent dffc5e7 commit 0820004

File tree

4 files changed

+34
-10
lines changed

4 files changed

+34
-10
lines changed

core/src/intrinsics/mod.rs

+23-2
Original file line numberDiff line numberDiff line change
@@ -2965,14 +2965,35 @@ pub(crate) macro const_eval_select {
29652965
$(#[$compiletime_attr:meta])* $compiletime:block
29662966
else
29672967
$(#[$runtime_attr:meta])* $runtime:block
2968+
) => {
2969+
// Use the `noinline` arm, after adding explicit `inline` attributes
2970+
$crate::intrinsics::const_eval_select!(
2971+
@capture { $($arg : $ty = $val),* } $(-> $ret)? :
2972+
#[noinline]
2973+
if const
2974+
#[inline] // prevent codegen on this function
2975+
$(#[$compiletime_attr])*
2976+
$compiletime
2977+
else
2978+
#[inline] // avoid the overhead of an extra fn call
2979+
$(#[$runtime_attr])*
2980+
$runtime
2981+
)
2982+
},
2983+
// With a leading #[noinline], we don't add inline attributes
2984+
(
2985+
@capture { $($arg:ident : $ty:ty = $val:expr),* $(,)? } $( -> $ret:ty )? :
2986+
#[noinline]
2987+
if const
2988+
$(#[$compiletime_attr:meta])* $compiletime:block
2989+
else
2990+
$(#[$runtime_attr:meta])* $runtime:block
29682991
) => {{
2969-
#[inline] // avoid the overhead of an extra fn call
29702992
$(#[$runtime_attr])*
29712993
fn runtime($($arg: $ty),*) $( -> $ret )? {
29722994
$runtime
29732995
}
29742996

2975-
#[inline] // prevent codegen on this function
29762997
$(#[$compiletime_attr])*
29772998
const fn compiletime($($arg: $ty),*) $( -> $ret )? {
29782999
// Don't warn if one of the arguments is unused.

core/src/num/f128.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -1268,8 +1268,9 @@ impl f128 {
12681268
min <= max,
12691269
"min > max, or either was NaN",
12701270
"min > max, or either was NaN. min = {min:?}, max = {max:?}",
1271-
min: f128,
1272-
max: f128,
1271+
// FIXME(f16_f128): Passed by-ref to avoid codegen crashes
1272+
min: &f128 = &min,
1273+
max: &f128 = &max,
12731274
);
12741275

12751276
if self < min {

core/src/num/f16.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -1243,8 +1243,9 @@ impl f16 {
12431243
min <= max,
12441244
"min > max, or either was NaN",
12451245
"min > max, or either was NaN. min = {min:?}, max = {max:?}",
1246-
min: f16,
1247-
max: f16,
1246+
// FIXME(f16_f128): Passed by-ref to avoid codegen crashes
1247+
min: &f16 = &min,
1248+
max: &f16 = &max,
12481249
);
12491250

12501251
if self < min {

core/src/panic.rs

+5-4
Original file line numberDiff line numberDiff line change
@@ -206,15 +206,16 @@ pub macro const_panic {
206206
// add the `rustc_allow_const_fn_unstable`. This is okay to do
207207
// because both variants will panic, just with different messages.
208208
#[rustc_allow_const_fn_unstable(const_eval_select)]
209-
#[inline(always)]
209+
#[inline(always)] // inline the wrapper
210210
#[track_caller]
211211
#[cfg_attr(bootstrap, rustc_const_stable(feature = "const_panic", since = "CURRENT_RUSTC_VERSION"))]
212212
const fn do_panic($($arg: $ty),*) -> ! {
213213
$crate::intrinsics::const_eval_select!(
214-
@capture { $($arg: $ty),* } -> !:
215-
if const #[track_caller] {
214+
@capture { $($arg: $ty = $arg),* } -> !:
215+
#[noinline]
216+
if const #[track_caller] #[inline] { // Inline this, to prevent codegen
216217
$crate::panic!($const_msg)
217-
} else #[track_caller] {
218+
} else #[track_caller] { // Do not inline this, it makes perf worse
218219
$crate::panic!($runtime_msg)
219220
}
220221
)

0 commit comments

Comments
 (0)