Skip to content

Commit c5172fd

Browse files
Rollup merge of rust-lang#128149 - RalfJung:nontemporal_store, r=jieyouxu,Amanieu,Jubilee
nontemporal_store: make sure that the intrinsic is truly just a hint The `!nontemporal` flag for stores in LLVM *sounds* like it is just a hint, but actually, it is not -- at least on x86, non-temporal stores need very special treatment by the programmer or else the Rust memory model breaks down. LLVM still treats these stores as-if they were normal stores for optimizations, which is [highly dubious](llvm/llvm-project#64521). Let's avoid all that dubiousness by making our own non-temporal stores be truly just a hint, which is possible on some targets (e.g. ARM). On all other targets, non-temporal stores become regular stores. ~~Blocked on rust-lang/stdarch#1541 propagating to the rustc repo, to make sure the `_mm_stream` intrinsics are unaffected by this change.~~ Fixes rust-lang#114582 Cc `@Amanieu` `@workingjubilee`
2 parents 18c7d54 + 1361fdc commit c5172fd

File tree

1 file changed

+2
-0
lines changed

1 file changed

+2
-0
lines changed

src/builder.rs

+2
Original file line numberDiff line numberDiff line change
@@ -1127,6 +1127,8 @@ impl<'a, 'gcc, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'gcc, 'tcx> {
11271127
self.llbb().add_assignment(self.location, aligned_destination, val);
11281128
// TODO(antoyo): handle align and flags.
11291129
// NOTE: dummy value here since it's never used. FIXME(antoyo): API should not return a value here?
1130+
// When adding support for NONTEMPORAL, make sure to not just emit MOVNT on x86; see the
1131+
// LLVM backend for details.
11301132
self.cx.context.new_rvalue_zero(self.type_i32())
11311133
}
11321134

0 commit comments

Comments
 (0)