diff options
author | Chris Lattner <sabre@nondot.org> | 2004-05-23 21:31:00 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2004-05-23 21:31:00 +0000 |
commit | 2b83af553aa3fd3d12771ba5b7c327b4a594a918 (patch) | |
tree | 2239e0f4e71acc940869c6e8b7b1684fa2f7b17a /test/Analysis | |
parent | f52988a92d61e953ed24b9287981db6421a5de5a (diff) | |
download | external_llvm-2b83af553aa3fd3d12771ba5b7c327b4a594a918.zip external_llvm-2b83af553aa3fd3d12771ba5b7c327b4a594a918.tar.gz external_llvm-2b83af553aa3fd3d12771ba5b7c327b4a594a918.tar.bz2 |
Testcases for andersen's alias analysis.
I think this is all of the stuff I had pending in my tree..
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@13703 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/Analysis')
-rw-r--r-- | test/Analysis/Andersens/arg-must-alias.ll | 17 | ||||
-rw-r--r-- | test/Analysis/Andersens/basictest.ll | 29 | ||||
-rw-r--r-- | test/Analysis/Andersens/external.ll | 22 |
3 files changed, 68 insertions, 0 deletions
diff --git a/test/Analysis/Andersens/arg-must-alias.ll b/test/Analysis/Andersens/arg-must-alias.ll new file mode 100644 index 0000000..5aef808 --- /dev/null +++ b/test/Analysis/Andersens/arg-must-alias.ll @@ -0,0 +1,17 @@ +; RUN: llvm-as < %s | opt -anders-aa -load-vn -gcse -deadargelim | llvm-dis | not grep ARG + +%G = internal constant int* null + +implementation + +internal int %internal(int* %ARG) { + ;; The 'Arg' argument must-aliases the null pointer, so it can be subsituted + ;; directly here, making it dead. + store int* %ARG, int** %G + ret int 0 +} + +int %foo() { + %V = call int %internal(int* null) + ret int %V +} diff --git a/test/Analysis/Andersens/basictest.ll b/test/Analysis/Andersens/basictest.ll new file mode 100644 index 0000000..66bf672 --- /dev/null +++ b/test/Analysis/Andersens/basictest.ll @@ -0,0 +1,29 @@ + +implementation + +void %test1() { + %X = malloc int* + %Y = malloc int + %Z = cast int* %Y to int + %W = cast int %Z to int* + store int* %W, int** %X + ret void +} + +void %test2(int* %P) { + %X = malloc int* + %Y = malloc int + store int* %P, int** %X + ret void +} + +internal int *%test3(int* %P) { + ret int* %P +} + +void %test4() { + %X = malloc int + %Y = call int* %test3(int* %X) + %ZZ = getelementptr int* null, int 17 + ret void +} diff --git a/test/Analysis/Andersens/external.ll b/test/Analysis/Andersens/external.ll new file mode 100644 index 0000000..117a690 --- /dev/null +++ b/test/Analysis/Andersens/external.ll @@ -0,0 +1,22 @@ +; RUN: llvm-as < %s | opt -anders-aa -load-vn -gcse -deadargelim | llvm-dis | grep store | not grep null + +; Because the 'internal' function is passed to an external function, we don't +; know what the incoming values will alias. As such, we cannot do the +; optimization checked by the 'arg-must-alias.llx' test. + +declare void %external(int(int*)*) +%G = internal constant int* null + +implementation + +internal int %internal(int* %ARG) { + ;;; We *DON'T* know that ARG always points to null! + store int* %ARG, int** %G + ret int 0 +} + +int %foo() { + call void %external(int(int*)* %internal) + %V = call int %internal(int* null) + ret int %V +} |