Auto merge of #124932 - RalfJung:temporal, r=compiler-errors

codegen: memmove/memset cannot be non-temporal

non-temporal memset is not a thing.
And for memmove, since the LLVM backend doesn't support this, surely we don't need it in the GCC backend.
This commit is contained in:
bors 2024-05-10 13:55:59 +00:00
commit 66f877007d
2 changed files with 5 additions and 9 deletions

View File

@ -1301,19 +1301,13 @@ impl<'a, 'gcc, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'gcc, 'tcx> {
fn memmove( fn memmove(
&mut self, &mut self,
dst: RValue<'gcc>, dst: RValue<'gcc>,
dst_align: Align, _dst_align: Align,
src: RValue<'gcc>, src: RValue<'gcc>,
src_align: Align, _src_align: Align,
size: RValue<'gcc>, size: RValue<'gcc>,
flags: MemFlags, flags: MemFlags,
) { ) {
if flags.contains(MemFlags::NONTEMPORAL) { assert!(!flags.contains(MemFlags::NONTEMPORAL), "non-temporal memmove not supported");
// HACK(nox): This is inefficient but there is no nontemporal memmove.
let val = self.load(src.get_type().get_pointee().expect("get_pointee"), src, src_align);
let ptr = self.pointercast(dst, self.type_ptr_to(self.val_ty(val)));
self.store_with_flags(val, ptr, dst_align, flags);
return;
}
let size = self.intcast(size, self.type_size_t(), false); let size = self.intcast(size, self.type_size_t(), false);
let _is_volatile = flags.contains(MemFlags::VOLATILE); let _is_volatile = flags.contains(MemFlags::VOLATILE);
let dst = self.pointercast(dst, self.type_i8p()); let dst = self.pointercast(dst, self.type_i8p());
@ -1335,6 +1329,7 @@ impl<'a, 'gcc, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'gcc, 'tcx> {
_align: Align, _align: Align,
flags: MemFlags, flags: MemFlags,
) { ) {
assert!(!flags.contains(MemFlags::NONTEMPORAL), "non-temporal memset not supported");
let _is_volatile = flags.contains(MemFlags::VOLATILE); let _is_volatile = flags.contains(MemFlags::VOLATILE);
let ptr = self.pointercast(ptr, self.type_i8p()); let ptr = self.pointercast(ptr, self.type_i8p());
let memset = self.context.get_builtin_function("memset"); let memset = self.context.get_builtin_function("memset");

View File

@ -976,6 +976,7 @@ impl<'a, 'll, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'll, 'tcx> {
align: Align, align: Align,
flags: MemFlags, flags: MemFlags,
) { ) {
assert!(!flags.contains(MemFlags::NONTEMPORAL), "non-temporal memset not supported");
let is_volatile = flags.contains(MemFlags::VOLATILE); let is_volatile = flags.contains(MemFlags::VOLATILE);
unsafe { unsafe {
llvm::LLVMRustBuildMemSet( llvm::LLVMRustBuildMemSet(