mark &T params without UnsafeCell<U> as readonly
These are already marked as `noalias` due to the immutability guarantee
(see 4c2d4cd3de
), but more information can
be bubbled up to the caller via `readonly`.
This commit is contained in:
parent
cafa47506d
commit
48edb32a3f
1 changed files with 9 additions and 3 deletions
|
@ -2280,7 +2280,7 @@ pub fn get_fn_llvm_attributes(ccx: &CrateContext, fn_ty: ty::t)
|
|||
match ty::get(ret_ty).sty {
|
||||
// `~` pointer return values never alias because ownership
|
||||
// is transferred
|
||||
ty::ty_uniq(it) if match ty::get(it).sty {
|
||||
ty::ty_uniq(it) if match ty::get(it).sty {
|
||||
ty::ty_str | ty::ty_vec(..) | ty::ty_trait(..) => true, _ => false
|
||||
} => {}
|
||||
ty::ty_uniq(_) => {
|
||||
|
@ -2356,8 +2356,10 @@ pub fn get_fn_llvm_attributes(ccx: &CrateContext, fn_ty: ty::t)
|
|||
}
|
||||
|
||||
// `&mut` pointer parameters never alias other parameters, or mutable global data
|
||||
// `&` pointer parameters never alias either (for LLVM's purposes) as long as the
|
||||
// interior is safe
|
||||
//
|
||||
// `&T` where `T` contains no `UnsafeCell<U>` is immutable, and can be marked as both
|
||||
// `readonly` and `noalias`, as LLVM's definition of `noalias` is based solely on
|
||||
// memory dependencies rather than pointer equality
|
||||
ty::ty_rptr(b, mt) if mt.mutbl == ast::MutMutable ||
|
||||
!ty::type_contents(ccx.tcx(), mt.ty).interior_unsafe() => {
|
||||
|
||||
|
@ -2365,6 +2367,10 @@ pub fn get_fn_llvm_attributes(ccx: &CrateContext, fn_ty: ty::t)
|
|||
attrs.arg(idx, llvm::NoAliasAttribute)
|
||||
.arg(idx, llvm::DereferenceableAttribute(llsz));
|
||||
|
||||
if mt.mutbl == ast::MutImmutable {
|
||||
attrs.arg(idx, llvm::ReadOnlyAttribute);
|
||||
}
|
||||
|
||||
match b {
|
||||
ReLateBound(_, BrAnon(_)) => {
|
||||
attrs.arg(idx, llvm::NoCaptureAttribute);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue