| ; Verify that TD works as expected |
| ; Verify call edges are found |
| ; RUN: dsaopt %s -dsa-td -analyze -check-callees=indirect,foo,bar |
| |
| ; Verify aliasing with @G is certainly known in @main |
| ; We can't do this with current testing, so instead look for +G |
| ; This should be known by end of BU |
| ; RUN: dsaopt %s -dsa-bu -analyze -verify-flags=@main:barptr+G |
| ; RUN: dsaopt %s -dsa-bu -analyze -verify-flags=@main:fooptr2+G |
| ; RUN: dsaopt %s -dsa-bu -analyze -verify-flags=@main:barptr2+G |
| ; RUN: dsaopt %s -dsa-td -analyze -verify-flags=@main:barptr+G |
| ; RUN: dsaopt %s -dsa-td -analyze -verify-flags=@main:fooptr2+G |
| ; RUN: dsaopt %s -dsa-td -analyze -verify-flags=@main:barptr2+G |
| |
| ; Verify %ptr in both @foo and @bar is also known to alias a global, |
| ; and that this isn't known until TD is run (BU shouldn't know this yet) |
| ; RUN: dsaopt %s -dsa-bu -analyze -verify-flags=@foo:ptr-G |
| ; RUN: dsaopt %s -dsa-bu -analyze -verify-flags=@bar:ptr-G |
| ; RUN: dsaopt %s -dsa-td -analyze -verify-flags=@foo:ptr+G |
| ; RUN: dsaopt %s -dsa-td -analyze -verify-flags=@bar:ptr+G |
| |
| ; B = indirect(foo, A) -> alias(B,A) |
| ; RUN: dsaopt %s -dsa-bu -analyze -check-same-node=@main:ptr,main:fooptr |
| ; RUN: dsaopt %s -dsa-bu -analyze -check-same-node=@main:fooptr2,main:barptr |
| ; B = indirect(bar, A) -> alias(B,G) |
| ; (We can't check this, nodes are in different graphs) |
| ; RUNX: dsaopt %s -dsa-bu -analyze -check-same-node=main:fooptr2,G |
| |
| ; Neat result: ptr/footptr aren't marked "+G" in either BU or TD: |
| ; RUN: dsaopt %s -dsa-bu -analyze -verify-flags=@main:ptr-G,@main:fooptr-G |
| ; RUN: dsaopt %s -dsa-td -analyze -verify-flags=@main:ptr-G,@main:fooptr-G |
| ; Hoewver, CBU and EQTD merge indirect's callees and thereby set +G on them. |
| ; RUN: dsaopt %s -dsa-eqtd -analyze -verify-flags=@main:ptr+G,@main:fooptr+G |
| ; RUN: dsaopt %s -dsa-cbu -analyze -verify-flags=@main:ptr+G,@main:fooptr+G |
| 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" |
| |
| @G = global i8 0 |
| |
| define i8* @foo(i8* %ptr) nounwind { |
| ret i8* %ptr |
| } |
| |
| define i8* @bar(i8* %ptr) nounwind { |
| ret i8* @G |
| } |
| |
| define i8* @indirect(i8* (i8*) * %fp, i8* %ptr) { |
| %retptr = call i8* %fp(i8* %ptr) |
| ret i8* %retptr |
| } |
| |
| define i32 @main(i32 %argc, i8** nocapture %argv) nounwind { |
| ; Conjure some i8* |
| %ptr = load i8*, i8** %argv, align 8 |
| |
| ; %fooptr = %ptr |
| %fooptr = call i8* @indirect(i8* (i8*)* @foo, i8* %ptr) |
| ; %barptr = @G |
| %barptr = call i8* @indirect(i8* (i8*)* @bar, i8* %fooptr) |
| ; fooptr2 = @G |
| %fooptr2 = call i8* @indirect(i8* (i8*)* @foo, i8* %barptr) |
| ; barptr2 = @G |
| %barptr2 = call i8* @indirect(i8* (i8*)* @bar, i8* %fooptr2) |
| |
| ret i32 0 |
| } |