An alloca can be equal to an argument. It can't *alias* an alloca, but it could

be equal, since there's nothing preventing a caller from correctly predicting
the stack location of an alloca.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@174119 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Dan Gohman
2013-01-31 23:49:33 +00:00
parent 27aacedf7d
commit ac08785eda
2 changed files with 13 additions and 12 deletions

View File

@@ -647,3 +647,16 @@ unreachableblock:
%Y = icmp eq i32* %X, null
ret i1 %Y
}
; It's not valid to fold a comparison of an argument with an alloca, even though
; that's tempting. An argument can't *alias* an alloca, however the aliasing rule
; relies on restrictions against guessing an object's address and dereferencing.
; There are no restrictions against guessing an object's address and comparing.
define i1 @alloca_argument_compare(i64* %arg) {
%alloc = alloca i64
%cmp = icmp eq i64* %arg, %alloc
ret i1 %cmp
; CHECK: alloca_argument_compare
; CHECK: ret i1 %cmp
}