Skip to content

Commit 08959bf

Browse files
committed
Auto merge of rust-lang#136543 - RalfJung:round-ties-even, r=<try>
intrinsics: unify rint, roundeven, nearbyint in a single round_ties_even intrinsic LLVM has three intrinsics here that all do the same thing (when used in the default FP environment). There's no reason Rust needs to copy that historically-grown mess -- let's just have one intrinsic and leave it up to the LLVM backend to decide how to lower that. Suggested by `@hanna-kruppe` in rust-lang#136459; Cc `@tgross35` try-job: test-various
2 parents bb2cc59 + b9d0555 commit 08959bf

File tree

13 files changed

+127
-208
lines changed

13 files changed

+127
-208
lines changed

Diff for: compiler/rustc_codegen_cranelift/src/intrinsics/mod.rs

+7-9
Original file line numberDiff line numberDiff line change
@@ -340,14 +340,10 @@ fn codegen_float_intrinsic_call<'tcx>(
340340
sym::ceilf64 => ("ceil", 1, fx.tcx.types.f64, types::F64),
341341
sym::truncf32 => ("truncf", 1, fx.tcx.types.f32, types::F32),
342342
sym::truncf64 => ("trunc", 1, fx.tcx.types.f64, types::F64),
343-
sym::rintf32 => ("rintf", 1, fx.tcx.types.f32, types::F32),
344-
sym::rintf64 => ("rint", 1, fx.tcx.types.f64, types::F64),
343+
sym::round_ties_even_f32 => ("rintf", 1, fx.tcx.types.f32, types::F32),
344+
sym::round_ties_even_f64 => ("rint", 1, fx.tcx.types.f64, types::F64),
345345
sym::roundf32 => ("roundf", 1, fx.tcx.types.f32, types::F32),
346346
sym::roundf64 => ("round", 1, fx.tcx.types.f64, types::F64),
347-
sym::roundevenf32 => ("roundevenf", 1, fx.tcx.types.f32, types::F32),
348-
sym::roundevenf64 => ("roundeven", 1, fx.tcx.types.f64, types::F64),
349-
sym::nearbyintf32 => ("nearbyintf", 1, fx.tcx.types.f32, types::F32),
350-
sym::nearbyintf64 => ("nearbyint", 1, fx.tcx.types.f64, types::F64),
351347
sym::sinf32 => ("sinf", 1, fx.tcx.types.f32, types::F32),
352348
sym::sinf64 => ("sin", 1, fx.tcx.types.f64, types::F64),
353349
sym::cosf32 => ("cosf", 1, fx.tcx.types.f32, types::F32),
@@ -399,16 +395,18 @@ fn codegen_float_intrinsic_call<'tcx>(
399395
| sym::ceilf64
400396
| sym::truncf32
401397
| sym::truncf64
402-
| sym::nearbyintf32
403-
| sym::nearbyintf64
398+
| sym::round_ties_even_f32
399+
| sym::round_ties_even_f64
404400
| sym::sqrtf32
405401
| sym::sqrtf64 => {
406402
let val = match intrinsic {
407403
sym::fabsf32 | sym::fabsf64 => fx.bcx.ins().fabs(args[0]),
408404
sym::floorf32 | sym::floorf64 => fx.bcx.ins().floor(args[0]),
409405
sym::ceilf32 | sym::ceilf64 => fx.bcx.ins().ceil(args[0]),
410406
sym::truncf32 | sym::truncf64 => fx.bcx.ins().trunc(args[0]),
411-
sym::nearbyintf32 | sym::nearbyintf64 => fx.bcx.ins().nearest(args[0]),
407+
sym::round_ties_even_f32 | sym::round_ties_even_f64 => {
408+
fx.bcx.ins().nearest(args[0])
409+
}
412410
sym::sqrtf32 | sym::sqrtf64 => fx.bcx.ins().sqrt(args[0]),
413411
_ => unreachable!(),
414412
};

Diff for: compiler/rustc_codegen_gcc/src/intrinsic/mod.rs

+3-6
Original file line numberDiff line numberDiff line change
@@ -84,14 +84,11 @@ fn get_simple_intrinsic<'gcc, 'tcx>(
8484
sym::ceilf64 => "ceil",
8585
sym::truncf32 => "truncf",
8686
sym::truncf64 => "trunc",
87-
sym::rintf32 => "rintf",
88-
sym::rintf64 => "rint",
89-
sym::nearbyintf32 => "nearbyintf",
90-
sym::nearbyintf64 => "nearbyint",
87+
// We match the LLVM backend and lower this to `rint`.
88+
sym::round_ties_even_f32 => "rintf",
89+
sym::round_ties_even_f64 => "rint",
9190
sym::roundf32 => "roundf",
9291
sym::roundf64 => "round",
93-
sym::roundevenf32 => "roundevenf",
94-
sym::roundevenf64 => "roundeven",
9592
sym::abort => "abort",
9693
_ => return None,
9794
};

Diff for: compiler/rustc_codegen_llvm/src/intrinsic.rs

+8-14
Original file line numberDiff line numberDiff line change
@@ -127,15 +127,14 @@ fn get_simple_intrinsic<'ll>(
127127
sym::truncf64 => "llvm.trunc.f64",
128128
sym::truncf128 => "llvm.trunc.f128",
129129

130-
sym::rintf16 => "llvm.rint.f16",
131-
sym::rintf32 => "llvm.rint.f32",
132-
sym::rintf64 => "llvm.rint.f64",
133-
sym::rintf128 => "llvm.rint.f128",
134-
135-
sym::nearbyintf16 => "llvm.nearbyint.f16",
136-
sym::nearbyintf32 => "llvm.nearbyint.f32",
137-
sym::nearbyintf64 => "llvm.nearbyint.f64",
138-
sym::nearbyintf128 => "llvm.nearbyint.f128",
130+
// We could use any of `rint`, `nearbyint`, or `roundeven`
131+
// for this -- they are all identical in semantics when
132+
// assuming the default FP environment.
133+
// `rint` is what we used for $forever.
134+
sym::round_ties_even_f16 => "llvm.rint.f16",
135+
sym::round_ties_even_f32 => "llvm.rint.f32",
136+
sym::round_ties_even_f64 => "llvm.rint.f64",
137+
sym::round_ties_even_f128 => "llvm.rint.f128",
139138

140139
sym::roundf16 => "llvm.round.f16",
141140
sym::roundf32 => "llvm.round.f32",
@@ -144,11 +143,6 @@ fn get_simple_intrinsic<'ll>(
144143

145144
sym::ptr_mask => "llvm.ptrmask",
146145

147-
sym::roundevenf16 => "llvm.roundeven.f16",
148-
sym::roundevenf32 => "llvm.roundeven.f32",
149-
sym::roundevenf64 => "llvm.roundeven.f64",
150-
sym::roundevenf128 => "llvm.roundeven.f128",
151-
152146
_ => return None,
153147
};
154148
Some(cx.get_intrinsic(llvm_name))

Diff for: compiler/rustc_hir_analysis/src/check/intrinsic.rs

+8-14
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,10 @@ pub fn intrinsic_operation_unsafety(tcx: TyCtxt<'_>, intrinsic_id: LocalDefId) -
140140
| sym::fmul_algebraic
141141
| sym::fdiv_algebraic
142142
| sym::frem_algebraic
143+
| sym::round_ties_even_f16
144+
| sym::round_ties_even_f32
145+
| sym::round_ties_even_f64
146+
| sym::round_ties_even_f128
143147
| sym::const_eval_select => hir::Safety::Safe,
144148
_ => hir::Safety::Unsafe,
145149
};
@@ -416,26 +420,16 @@ pub fn check_intrinsic_type(
416420
sym::truncf64 => (0, 0, vec![tcx.types.f64], tcx.types.f64),
417421
sym::truncf128 => (0, 0, vec![tcx.types.f128], tcx.types.f128),
418422

419-
sym::rintf16 => (0, 0, vec![tcx.types.f16], tcx.types.f16),
420-
sym::rintf32 => (0, 0, vec![tcx.types.f32], tcx.types.f32),
421-
sym::rintf64 => (0, 0, vec![tcx.types.f64], tcx.types.f64),
422-
sym::rintf128 => (0, 0, vec![tcx.types.f128], tcx.types.f128),
423-
424-
sym::nearbyintf16 => (0, 0, vec![tcx.types.f16], tcx.types.f16),
425-
sym::nearbyintf32 => (0, 0, vec![tcx.types.f32], tcx.types.f32),
426-
sym::nearbyintf64 => (0, 0, vec![tcx.types.f64], tcx.types.f64),
427-
sym::nearbyintf128 => (0, 0, vec![tcx.types.f128], tcx.types.f128),
423+
sym::round_ties_even_f16 => (0, 0, vec![tcx.types.f16], tcx.types.f16),
424+
sym::round_ties_even_f32 => (0, 0, vec![tcx.types.f32], tcx.types.f32),
425+
sym::round_ties_even_f64 => (0, 0, vec![tcx.types.f64], tcx.types.f64),
426+
sym::round_ties_even_f128 => (0, 0, vec![tcx.types.f128], tcx.types.f128),
428427

429428
sym::roundf16 => (0, 0, vec![tcx.types.f16], tcx.types.f16),
430429
sym::roundf32 => (0, 0, vec![tcx.types.f32], tcx.types.f32),
431430
sym::roundf64 => (0, 0, vec![tcx.types.f64], tcx.types.f64),
432431
sym::roundf128 => (0, 0, vec![tcx.types.f128], tcx.types.f128),
433432

434-
sym::roundevenf16 => (0, 0, vec![tcx.types.f16], tcx.types.f16),
435-
sym::roundevenf32 => (0, 0, vec![tcx.types.f32], tcx.types.f32),
436-
sym::roundevenf64 => (0, 0, vec![tcx.types.f64], tcx.types.f64),
437-
sym::roundevenf128 => (0, 0, vec![tcx.types.f128], tcx.types.f128),
438-
439433
sym::volatile_load | sym::unaligned_volatile_load => {
440434
(1, 0, vec![Ty::new_imm_ptr(tcx, param(0))], param(0))
441435
}

Diff for: compiler/rustc_span/src/symbol.rs

+4-12
Original file line numberDiff line numberDiff line change
@@ -1367,10 +1367,6 @@ symbols! {
13671367
native_link_modifiers_whole_archive,
13681368
natvis_file,
13691369
ne,
1370-
nearbyintf128,
1371-
nearbyintf16,
1372-
nearbyintf32,
1373-
nearbyintf64,
13741370
needs_allocator,
13751371
needs_drop,
13761372
needs_panic_runtime,
@@ -1688,20 +1684,16 @@ symbols! {
16881684
return_position_impl_trait_in_trait,
16891685
return_type_notation,
16901686
rhs,
1691-
rintf128,
1692-
rintf16,
1693-
rintf32,
1694-
rintf64,
16951687
riscv_target_feature,
16961688
rlib,
16971689
ropi,
16981690
ropi_rwpi: "ropi-rwpi",
16991691
rotate_left,
17001692
rotate_right,
1701-
roundevenf128,
1702-
roundevenf16,
1703-
roundevenf32,
1704-
roundevenf64,
1693+
round_ties_even_f128,
1694+
round_ties_even_f16,
1695+
round_ties_even_f32,
1696+
round_ties_even_f64,
17051697
roundf128,
17061698
roundf16,
17071699
roundf32,

0 commit comments

Comments
 (0)