[llvm-commits] [poolalloc] r168381 - in /poolalloc/trunk: lib/DSA/TopDownClosure.cpp test/dsa/regression/2012-11-20.TDUnresolvedIncomplete.ll

John Criswell criswell at illinois.edu
Mon Nov 26 08:36:10 PST 2012


On 11/20/12 1:45 PM, Will Dietz wrote:
> Author: wdietz2
> Date: Tue Nov 20 13:45:51 2012
> New Revision: 168381

Will, were these changes made after the release_32 branch was created?  
If so, can you merge the changes into the poolalloc release_32 branch?

SAFECode (and, therefore, poolalloc) is sticking with LLVM 3.2 until we 
feel like chasing LLVM mainline again.  If you (or others) need 
poolalloc to track LLVM mainline, then we should discuss how to manage that.

-- John T.


>
> URL: http://llvm.org/viewvc/llvm-project?rev=168381&view=rev
> Log:
> Don't clear AuxCalls at start of TD, we need these to track Incomplete.
>
> Partially reverts r122039, adds test verifying expected behavior.
>
> Should fix PR14190.
>
> Added:
>      poolalloc/trunk/test/dsa/regression/2012-11-20.TDUnresolvedIncomplete.ll
> Modified:
>      poolalloc/trunk/lib/DSA/TopDownClosure.cpp
>
> Modified: poolalloc/trunk/lib/DSA/TopDownClosure.cpp
> URL: http://llvm.org/viewvc/llvm-project/poolalloc/trunk/lib/DSA/TopDownClosure.cpp?rev=168381&r1=168380&r2=168381&view=diff
> ==============================================================================
> --- poolalloc/trunk/lib/DSA/TopDownClosure.cpp (original)
> +++ poolalloc/trunk/lib/DSA/TopDownClosure.cpp Tue Nov 20 13:45:51 2012
> @@ -77,13 +77,6 @@
>     init(useEQBU ? &getAnalysis<EquivBUDataStructures>()
>          : &getAnalysis<BUDataStructures>(),
>          true, true, true, false);
> -
> -  for (Module::iterator F = M.begin(); F != M.end(); ++F) {
> -    if (!(F->isDeclaration())){
> -      DSGraph *G = getOrCreateGraph(F);
> -      G->getAuxFunctionCalls().clear();
> -    }
> -  }
>     // Figure out which functions must not mark their arguments complete because
>     // they are accessible outside this compilation unit.  Currently, these
>     // arguments are functions which are reachable by incomplete or external
>
> Added: poolalloc/trunk/test/dsa/regression/2012-11-20.TDUnresolvedIncomplete.ll
> URL: http://llvm.org/viewvc/llvm-project/poolalloc/trunk/test/dsa/regression/2012-11-20.TDUnresolvedIncomplete.ll?rev=168381&view=auto
> ==============================================================================
> --- poolalloc/trunk/test/dsa/regression/2012-11-20.TDUnresolvedIncomplete.ll (added)
> +++ poolalloc/trunk/test/dsa/regression/2012-11-20.TDUnresolvedIncomplete.ll Tue Nov 20 13:45:51 2012
> @@ -0,0 +1,71 @@
> +; PR14190
> +; Verify that TD keeps unresolved callsites and properly
> +; marks nodes reachable from them as incomplete.
> +; This is important as otherwise a DSA client (like DSAA) will
> +; erroneously conclude that retptr/ptr in @indirect cannot alias.
> +
> +; Verify we do eventually discover direct/indirect/indirect2 call foo
> +; RUN: dsaopt %s -dsa-td -analyze -check-callees=direct,foo
> +; RUN: dsaopt %s -dsa-td -analyze -check-callees=indirect,foo
> +; RUN: dsaopt %s -dsa-td -analyze -check-callees=indirect2,foo
> +; Within each, by the end of TD, we should either know the effects of calling @foo
> +; or mark the related nodes incomplete.
> +; Check this:
> +; RUN: dsaopt %s -dsa-td -analyze -check-same-node=@direct:ptr, at direct:retptr
> +; RUN: dsaopt %s -dsa-td -analyze -verify-flags=@direct:ptr-I, at direct:retptr-I
> +; RUN: dsaopt %s -dsa-td -analyze -check-not-same-node=@indirect:ptr, at indirect:retptr
> +; RUN: dsaopt %s -dsa-td -analyze -verify-flags=@indirect:ptr+I, at indirect:retptr+I
> +; RUN: dsaopt %s -dsa-td -analyze -check-not-same-node=@indirect2:ptr, at indirect2:retptr
> +; RUN: dsaopt %s -dsa-td -analyze -verify-flags=@indirect2:ptr+I, at indirect2:retptr+I
> +; Check that EQTD also has this behavior.
> +; RUN: dsaopt %s -dsa-eqtd -analyze -check-same-node=@direct:ptr, at direct:retptr
> +; RUN: dsaopt %s -dsa-eqtd -analyze -verify-flags=@direct:ptr-I, at direct:retptr-I
> +; RUN: dsaopt %s -dsa-eqtd -analyze -check-not-same-node=@indirect:ptr, at indirect:retptr
> +; RUN: dsaopt %s -dsa-eqtd -analyze -verify-flags=@indirect:ptr+I, at indirect:retptr+I
> +; RUN: dsaopt %s -dsa-eqtd -analyze -check-not-same-node=@indirect2:ptr, at indirect2:retptr
> +; RUN: dsaopt %s -dsa-eqtd -analyze -verify-flags=@indirect2:ptr+I, at indirect2:retptr+I
> +; ModuleID = 'test-fp.bc'
> +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
> +target triple = "x86_64-unknown-linux-gnu"
> +
> +define i8* @foo(i8* %ptr) nounwind {
> +  ret i8* %ptr
> +}
> +
> +; Call foo with ptr
> +define void @direct(i8* %ptr) {
> +  %retptr = call i8* @foo(i8* %ptr)
> +  %val = load i8* %retptr
> +  ret void
> +}
> +
> +; Same, but using indirect fp not resolved until inlined into main
> +define void @indirect(i8* (i8*)* %fp, i8* %ptr) {
> +  %retptr = call i8* %fp(i8* %ptr)
> +  %val = load i8* %retptr
> +  ret void
> +}
> +
> +; Same, but using indirect fp not resolved until inlined into main
> +; with an additional level of indirection
> +define void @indirect2(i8* (i8*)** %fpp, i8* %ptr) {
> +  %fp = load i8* (i8*)** %fpp
> +  %retptr = call i8* %fp(i8* %ptr)
> +  %val = load i8* %retptr
> +  ret void
> +}
> +
> +define i32 @main(i32 %argc, i8** nocapture %argv) nounwind {
> +  ; Conjure some i8*
> +  %ptr = load i8** %argv, align 8
> +
> +  call void @direct(i8* %ptr)
> +
> +  call void @indirect(i8* (i8*)* @foo, i8* %ptr)
> +
> +  %fpp = alloca i8* (i8*)*, align 8
> +  store i8* (i8*)* @foo, i8* (i8*)** %fpp, align 8
> +  call void @indirect2(i8* (i8*)** %fpp, i8* %ptr)
> +
> +  ret i32 0
> +}
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits




More information about the llvm-commits mailing list