about summary refs log tree commit diff
diff options
context:
space:
mode:
authorJames Miller <bladeon@gmail.com>2013-05-26 17:40:07 +1200
committerJames Miller <bladeon@gmail.com>2013-05-26 17:40:07 +1200
commit2c2346e3d4f999b95a56444d978c3ea792828263 (patch)
tree41553e521c5434998a19e8d39ef6d12589483e59
parente2f8b51dc599cf1fb7f3f72252bef5e5b717f6bd (diff)
downloadrust-2c2346e3d4f999b95a56444d978c3ea792828263.tar.gz
rust-2c2346e3d4f999b95a56444d978c3ea792828263.zip
Mark &mut parameters as noalias
-rw-r--r--src/librustc/middle/trans/base.rs15
1 files changed, 14 insertions, 1 deletions
diff --git a/src/librustc/middle/trans/base.rs b/src/librustc/middle/trans/base.rs
index f92acbaf5c6..f14ea279c2d 100644
--- a/src/librustc/middle/trans/base.rs
+++ b/src/librustc/middle/trans/base.rs
@@ -1694,7 +1694,20 @@ pub fn create_llargs_for_fn_args(cx: fn_ctxt,
     vec::from_fn(args.len(), |i| {
         unsafe {
             let arg_n = first_real_arg + i;
-            llvm::LLVMGetParam(cx.llfn, arg_n as c_uint)
+            let arg = &args[i];
+            let llarg = llvm::LLVMGetParam(cx.llfn, arg_n as c_uint);
+
+            // Mark `&mut T` as no-alias, as the borrowck pass ensures it's true
+            match arg.ty.node {
+                ast::ty_rptr(_, mt) => {
+                    if mt.mutbl == ast::m_mutbl  {
+                        llvm::LLVMAddAttribute(llarg, lib::llvm::NoAliasAttribute as c_uint);
+                    }
+                }
+                _ => {}
+            }
+
+            llarg
         }
     })
 }