From 2c2346e3d4f999b95a56444d978c3ea792828263 Mon Sep 17 00:00:00 2001 From: James Miller Date: Sun, 26 May 2013 17:40:07 +1200 Subject: [PATCH] Mark &mut parameters as noalias --- src/librustc/middle/trans/base.rs | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) 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 } }) }