mark &T params without UnsafeCell<U> as readonly
These are already marked as `noalias` due to the immutability guarantee (see 4c2d4cd3dea344e81e4df24382ac3f23e2f86f40), but more information can be bubbled up to the caller via `readonly`.
This commit is contained in:
parent
cafa47506d
commit
48edb32a3f
@ -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…
x
Reference in New Issue
Block a user