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.

llvm-svn: 174119
This commit is contained in:
Dan Gohman 2013-01-31 23:49:33 +00:00
parent e5d8d0d64b
commit 995d40e1e2
2 changed files with 13 additions and 12 deletions

View File

@ -1828,18 +1828,6 @@ static Value *SimplifyICmpInst(unsigned Predicate, Value *LHS, Value *RHS,
else if (Pred == CmpInst::ICMP_NE)
return ConstantInt::get(ITy, true);
}
} else if (Argument *LHSArg = dyn_cast<Argument>(LHSPtr)) {
RHSPtr = RHSPtr->stripInBoundsOffsets();
// An alloca can't be equal to an argument unless they come from separate
// functions via inlining.
if (AllocaInst *RHSInst = dyn_cast<AllocaInst>(RHSPtr)) {
if (LHSArg->getParent() == RHSInst->getParent()->getParent()) {
if (Pred == CmpInst::ICMP_EQ)
return ConstantInt::get(ITy, false);
else if (Pred == CmpInst::ICMP_NE)
return ConstantInt::get(ITy, true);
}
}
}
// If we are comparing with zero then try hard since this is a common case.

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
}