[IR] Fix incorrect writeonly on llvm.allow.ubsan/runtime.check (#145492)

These intrinsics introduced in #84850 are currently marked as
`memory(inaccessiblemem: write)`. This is not correct for the intended
purpose of allowing per-block decisions, as such calls may get DCEd
across control-flow boundaries (which will start actually happening with
#145474).

Use `memory(inaccessiblemem: readwrite)` instead, just like all the
other control-flow sensitive intrinsics.
This commit is contained in:
Nikita Popov 2025-06-25 09:12:21 +02:00 committed by GitHub
parent 01b288fe6a
commit d95f46ca84
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 3 additions and 3 deletions

View File

@ -1842,11 +1842,11 @@ def int_ubsantrap : Intrinsic<[], [llvm_i8_ty],
// Return true if ubsan check is allowed. // Return true if ubsan check is allowed.
def int_allow_ubsan_check : DefaultAttrsIntrinsic<[llvm_i1_ty], [llvm_i8_ty], def int_allow_ubsan_check : DefaultAttrsIntrinsic<[llvm_i1_ty], [llvm_i8_ty],
[IntrInaccessibleMemOnly, IntrWriteMem, ImmArg<ArgIndex<0>>, NoUndef<RetIndex>]>; [IntrInaccessibleMemOnly, ImmArg<ArgIndex<0>>, NoUndef<RetIndex>]>;
// Return true if runtime check is allowed. // Return true if runtime check is allowed.
def int_allow_runtime_check : DefaultAttrsIntrinsic<[llvm_i1_ty], [llvm_metadata_ty], def int_allow_runtime_check : DefaultAttrsIntrinsic<[llvm_i1_ty], [llvm_metadata_ty],
[IntrInaccessibleMemOnly, IntrWriteMem, NoUndef<RetIndex>]>, [IntrInaccessibleMemOnly, NoUndef<RetIndex>]>,
ClangBuiltin<"__builtin_allow_runtime_check">; ClangBuiltin<"__builtin_allow_runtime_check">;
// Support for dynamic deoptimization (or de-specialization) // Support for dynamic deoptimization (or de-specialization)

View File

@ -205,7 +205,7 @@ define void @f1(i64 %x) nounwind {
; TR-GUARD: attributes #[[ATTR3]] = { nomerge noreturn nounwind } ; TR-GUARD: attributes #[[ATTR3]] = { nomerge noreturn nounwind }
;. ;.
; RT-GUARD: attributes #[[ATTR0]] = { nounwind } ; RT-GUARD: attributes #[[ATTR0]] = { nounwind }
; RT-GUARD: attributes #[[ATTR1:[0-9]+]] = { nocallback nofree nosync nounwind willreturn memory(inaccessiblemem: write) } ; RT-GUARD: attributes #[[ATTR1:[0-9]+]] = { nocallback nofree nosync nounwind willreturn memory(inaccessiblemem: readwrite) }
; RT-GUARD: attributes #[[ATTR2]] = { nomerge nounwind } ; RT-GUARD: attributes #[[ATTR2]] = { nomerge nounwind }
;. ;.
; TR: [[META0]] = !{} ; TR: [[META0]] = !{}