[llvm] r213726 - 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!

Bill Wendling isanbard at gmail.com
Sun Aug 3 21:37:28 PDT 2014


Done. Thanks!

-bw

On Jul 22, 2014, at 11:39 PM, Nick Lewycky <nlewycky at google.com> wrote:

> Bill, please merge this into the 3.5 branch. Thanks!
> 
> Nick
> 
> On 22 July 2014 23:24, Nick Lewycky <nicholas at mxc.ca> wrote:
> Author: nicholas
> Date: Wed Jul 23 01:24:49 2014
> New Revision: 213726
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=213726&view=rev
> Log:
> 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!
> 
> Modified:
>     llvm/trunk/lib/Transforms/Scalar/TailRecursionElimination.cpp
>     llvm/trunk/test/Transforms/TailCallElim/basic.ll
> 
> Modified: llvm/trunk/lib/Transforms/Scalar/TailRecursionElimination.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/TailRecursionElimination.cpp?rev=213726&r1=213725&r2=213726&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Transforms/Scalar/TailRecursionElimination.cpp (original)
> +++ llvm/trunk/lib/Transforms/Scalar/TailRecursionElimination.cpp Wed Jul 23 01:24:49 2014
> @@ -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;
> 
> 
> Modified: llvm/trunk/test/Transforms/TailCallElim/basic.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/TailCallElim/basic.ll?rev=213726&r1=213725&r2=213726&view=diff
> ==============================================================================
> --- llvm/trunk/test/Transforms/TailCallElim/basic.ll (original)
> +++ llvm/trunk/test/Transforms/TailCallElim/basic.ll Wed Jul 23 01:24:49 2014
> @@ -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
> +}
> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
> 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20140803/b4ad3c5b/attachment.html>


More information about the llvm-commits mailing list