blob: 8b0767c7a9471bb20258ffa3fff41e79958b77c2 [file] [log] [blame]
; 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
}