From accc5272f8913af57e7ebfd6a13247ecde146006 Mon Sep 17 00:00:00 2001 From: Daniel Micay Date: Tue, 28 May 2013 13:05:50 -0400 Subject: [PATCH] `noalias` on all `&mut` parameters is too coarse it can alias `&const` and `@mut` --- src/librustc/middle/trans/base.rs | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/librustc/middle/trans/base.rs b/src/librustc/middle/trans/base.rs index 28aed5368183c..0518f6993297c 100644 --- a/src/librustc/middle/trans/base.rs +++ b/src/librustc/middle/trans/base.rs @@ -1694,16 +1694,13 @@ pub fn create_llargs_for_fn_args(cx: fn_ctxt, 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); - } - } + // `~` pointers never alias other parameters, because ownership was transferred ast::ty_uniq(_) => { llvm::LLVMAddAttribute(llarg, lib::llvm::NoAliasAttribute as c_uint); } + // FIXME: #6785: `&mut` can only alias `&const` and `@mut`, we should check for + // those in the other parameters and then mark it as `noalias` if there aren't any _ => {} }