Merging r213726:

------------------------------------------------------------------------
r213726 | nicholas | 2014-07-22 23:24:49 -0700 (Tue, 22 Jul 2014) | 2 lines

We may visit a call that uses an alloca multiple times in callUsesLocalStack, sometimes with IsNocapture true and sometimes with IsNocapture false. We accidentally skipped work we needed to do in the IsNocapture=false case if we were called with IsNocapture=true the first time. Fixes PR20405!

------------------------------------------------------------------------


git-svn-id: https://llvm.org/svn/llvm-project/llvm/branches/release_35@214688 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Bill Wendling 2014-08-04 04:28:45 +00:00
parent ed44a9d567
commit 92a10767eb
2 changed files with 17 additions and 5 deletions

View File

@ -227,12 +227,10 @@ struct AllocaDerivedValueTracker {
} }
void callUsesLocalStack(CallSite CS, bool IsNocapture) { void callUsesLocalStack(CallSite CS, bool IsNocapture) {
// Add it to the list of alloca users. If it's already there, skip further // Add it to the list of alloca users.
// processing. AllocaUsers.insert(CS.getInstruction());
if (!AllocaUsers.insert(CS.getInstruction()))
return;
// If it's nocapture then it can't capture the alloca. // If it's nocapture then it can't capture this alloca.
if (IsNocapture) if (IsNocapture)
return; return;

View File

@ -174,3 +174,17 @@ if.end:
return: return:
ret void ret void
} }
declare void @test11_helper1(i8** nocapture, i8*)
declare void @test11_helper2(i8*)
define void @test11() {
; CHECK-LABEL: @test11
; CHECK-NOT: tail
%a = alloca i8*
%b = alloca i8
call void @test11_helper1(i8** %a, i8* %b) ; a = &b
%c = load i8** %a
call void @test11_helper2(i8* %c)
; CHECK: call void @test11_helper2
ret void
}