diff options
| author | John Kåre Alsaker <john.kare.alsaker@gmail.com> | 2014-07-25 07:29:12 +0200 |
|---|---|---|
| committer | John Kåre Alsaker <john.kare.alsaker@gmail.com> | 2014-07-25 07:29:12 +0200 |
| commit | 4c2d4cd3dea344e81e4df24382ac3f23e2f86f40 (patch) | |
| tree | f324d6391ca41766748328870cc3fa3f7159fe37 | |
| parent | a4553453a0f928a4d49492d87b352552919ae4c2 (diff) | |
| download | rust-4c2d4cd3dea344e81e4df24382ac3f23e2f86f40.tar.gz rust-4c2d4cd3dea344e81e4df24382ac3f23e2f86f40.zip | |
Add noalias to safe shared reference parameters
This add the LLVM noalias attribute to parameters of a shared reference type (&) which have a safe interior.
| -rw-r--r-- | src/librustc/middle/trans/base.rs | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/src/librustc/middle/trans/base.rs b/src/librustc/middle/trans/base.rs index 68d8ab3f04c..fcdcb7847cb 100644 --- a/src/librustc/middle/trans/base.rs +++ b/src/librustc/middle/trans/base.rs @@ -2140,7 +2140,10 @@ pub fn get_fn_llvm_attributes(ccx: &CrateContext, fn_ty: ty::t) attrs.push((idx, llvm::NonNullAttribute as u64)); } // `&mut` pointer parameters never alias other parameters, or mutable global data - ty::ty_rptr(b, mt) if mt.mutbl == ast::MutMutable => { + // `&` pointer parameters never alias either (for LLVM's purposes) as long as the + // interior is safe + ty::ty_rptr(b, mt) if mt.mutbl == ast::MutMutable || + !ty::type_contents(ccx.tcx(), mt.ty).interior_unsafe() => { attrs.push((idx, llvm::NoAliasAttribute as u64)); attrs.push((idx, llvm::NonNullAttribute as u64)); match b { |
