Rollup merge of #124003 - WaffleLapkin:dellvmization, r=scottmcm,RalfJung,antoyo

Dellvmize some intrinsics (use `u32` instead of `Self` in some integer intrinsics)

This implements https://github.com/rust-lang/compiler-team/issues/693 minus what was implemented in #123226.

Note: I decided to _not_ change `shl`/... builder methods, as it just doesn't seem worth it.

r? ``@scottmcm``
This commit is contained in:
Matthias Krüger 2024-04-23 20:17:51 +02:00 committed by GitHub
commit 6a2ad55108
3 changed files with 9 additions and 5 deletions

View File

@ -149,7 +149,7 @@ pub unsafe fn deref_str_ptr(s: *const str) -> &'static str {
arr arr
} }
pub unsafe fn use_ctlz_nonzero(a: u16) -> u16 { pub unsafe fn use_ctlz_nonzero(a: u16) -> u32 {
intrinsics::ctlz_nonzero(a) intrinsics::ctlz_nonzero(a)
} }

View File

@ -627,7 +627,7 @@ pub mod intrinsics {
pub fn min_align_of_val<T: ?::Sized>(val: *const T) -> usize; pub fn min_align_of_val<T: ?::Sized>(val: *const T) -> usize;
pub fn copy<T>(src: *const T, dst: *mut T, count: usize); pub fn copy<T>(src: *const T, dst: *mut T, count: usize);
pub fn transmute<T, U>(e: T) -> U; pub fn transmute<T, U>(e: T) -> U;
pub fn ctlz_nonzero<T>(x: T) -> T; pub fn ctlz_nonzero<T>(x: T) -> u32;
#[rustc_safe_intrinsic] #[rustc_safe_intrinsic]
pub fn needs_drop<T: ?::Sized>() -> bool; pub fn needs_drop<T: ?::Sized>() -> bool;
#[rustc_safe_intrinsic] #[rustc_safe_intrinsic]

View File

@ -26,6 +26,7 @@ macro_rules! intrinsic_args {
use rustc_span::symbol::{sym, Symbol}; use rustc_span::symbol::{sym, Symbol};
pub(crate) use self::llvm::codegen_llvm_intrinsic_call; pub(crate) use self::llvm::codegen_llvm_intrinsic_call;
use crate::cast::clif_intcast;
use crate::prelude::*; use crate::prelude::*;
fn bug_on_incorrect_arg_count(intrinsic: impl std::fmt::Display) -> ! { fn bug_on_incorrect_arg_count(intrinsic: impl std::fmt::Display) -> ! {
@ -627,7 +628,8 @@ fn codegen_regular_intrinsic_call<'tcx>(
// FIXME trap on `ctlz_nonzero` with zero arg. // FIXME trap on `ctlz_nonzero` with zero arg.
let res = fx.bcx.ins().clz(val); let res = fx.bcx.ins().clz(val);
let res = CValue::by_val(res, arg.layout()); let res = clif_intcast(fx, res, types::I32, false);
let res = CValue::by_val(res, ret.layout());
ret.write_cvalue(fx, res); ret.write_cvalue(fx, res);
} }
sym::cttz | sym::cttz_nonzero => { sym::cttz | sym::cttz_nonzero => {
@ -636,7 +638,8 @@ fn codegen_regular_intrinsic_call<'tcx>(
// FIXME trap on `cttz_nonzero` with zero arg. // FIXME trap on `cttz_nonzero` with zero arg.
let res = fx.bcx.ins().ctz(val); let res = fx.bcx.ins().ctz(val);
let res = CValue::by_val(res, arg.layout()); let res = clif_intcast(fx, res, types::I32, false);
let res = CValue::by_val(res, ret.layout());
ret.write_cvalue(fx, res); ret.write_cvalue(fx, res);
} }
sym::ctpop => { sym::ctpop => {
@ -644,7 +647,8 @@ fn codegen_regular_intrinsic_call<'tcx>(
let val = arg.load_scalar(fx); let val = arg.load_scalar(fx);
let res = fx.bcx.ins().popcnt(val); let res = fx.bcx.ins().popcnt(val);
let res = CValue::by_val(res, arg.layout()); let res = clif_intcast(fx, res, types::I32, false);
let res = CValue::by_val(res, ret.layout());
ret.write_cvalue(fx, res); ret.write_cvalue(fx, res);
} }
sym::bitreverse => { sym::bitreverse => {