From: Nick Lewycky Date: Wed, 23 Jul 2014 06:24:49 +0000 (+0000) Subject: We may visit a call that uses an alloca multiple times in callUsesLocalStack, sometim... X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=aba900c2525b6bbc2bb8e294974f0c694cc8c06a;p=platform%2Fupstream%2Fllvm.git 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! llvm-svn: 213726 --- diff --git a/llvm/lib/Transforms/Scalar/TailRecursionElimination.cpp b/llvm/lib/Transforms/Scalar/TailRecursionElimination.cpp index 05b9892..b758025 100644 --- a/llvm/lib/Transforms/Scalar/TailRecursionElimination.cpp +++ b/llvm/lib/Transforms/Scalar/TailRecursionElimination.cpp @@ -227,12 +227,10 @@ struct AllocaDerivedValueTracker { } void callUsesLocalStack(CallSite CS, bool IsNocapture) { - // Add it to the list of alloca users. If it's already there, skip further - // processing. - if (!AllocaUsers.insert(CS.getInstruction())) - return; + // Add it to the list of alloca users. + AllocaUsers.insert(CS.getInstruction()); - // If it's nocapture then it can't capture the alloca. + // If it's nocapture then it can't capture this alloca. if (IsNocapture) return; diff --git a/llvm/test/Transforms/TailCallElim/basic.ll b/llvm/test/Transforms/TailCallElim/basic.ll index 341736d..8e9814b 100644 --- a/llvm/test/Transforms/TailCallElim/basic.ll +++ b/llvm/test/Transforms/TailCallElim/basic.ll @@ -174,3 +174,17 @@ if.end: return: 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 +}