diff options
-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 0000000000..5aef808b84 --- /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 0000000000..66bf672ec7 --- /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 0000000000..117a690ab0 --- /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 +} |