Chris Lattner | e4f318c | 2002-09-08 18:08:36 +0000 | [diff] [blame] | 1 | ; This testcase tests for various features the basicaa test should be able to |
| 2 | ; determine, as noted in the comments. |
| 3 | |
| 4 | ; RUN: if as < %s | opt -basicaa -load-vn -gcse -instcombine -dce | dis | grep REMOVE |
| 5 | ; RUN: then exit 1 |
| 6 | ; RUN: else exit 0 |
| 7 | ; RUN: fi |
| 8 | |
Chris Lattner | 1ae9143 | 2003-06-17 15:16:35 +0000 | [diff] [blame^] | 9 | %Global = external global { int } |
| 10 | |
| 11 | implementation |
| 12 | |
Chris Lattner | e4f318c | 2002-09-08 18:08:36 +0000 | [diff] [blame] | 13 | |
| 14 | ; Array test: Test that operations on one local array do not invalidate |
| 15 | ; operations on another array. Important for scientific codes. |
| 16 | ; |
Chris Lattner | 6648645 | 2002-10-25 22:29:07 +0000 | [diff] [blame] | 17 | int %different_array_test(long %A, long %B) { |
Chris Lattner | e4f318c | 2002-09-08 18:08:36 +0000 | [diff] [blame] | 18 | %Array1 = alloca int, uint 100 |
| 19 | %Array2 = alloca int, uint 200 |
| 20 | |
Chris Lattner | 6648645 | 2002-10-25 22:29:07 +0000 | [diff] [blame] | 21 | %pointer = getelementptr int* %Array1, long %A |
Chris Lattner | e4f318c | 2002-09-08 18:08:36 +0000 | [diff] [blame] | 22 | %val = load int* %pointer |
| 23 | |
Chris Lattner | 6648645 | 2002-10-25 22:29:07 +0000 | [diff] [blame] | 24 | %pointer2 = getelementptr int* %Array2, long %B |
Chris Lattner | e4f318c | 2002-09-08 18:08:36 +0000 | [diff] [blame] | 25 | store int 7, int* %pointer2 |
| 26 | |
| 27 | %REMOVE = load int* %pointer ; redundant with above load |
| 28 | %retval = sub int %REMOVE, %val |
| 29 | ret int %retval |
| 30 | } |
| 31 | |
| 32 | ; Constant index test: Constant indexes into the same array should not |
| 33 | ; interfere with each other. Again, important for scientific codes. |
| 34 | ; |
| 35 | int %constant_array_index_test() { |
| 36 | %Array = alloca int, uint 100 |
Chris Lattner | 6648645 | 2002-10-25 22:29:07 +0000 | [diff] [blame] | 37 | %P1 = getelementptr int* %Array, long 7 |
| 38 | %P2 = getelementptr int* %Array, long 6 |
Chris Lattner | e4f318c | 2002-09-08 18:08:36 +0000 | [diff] [blame] | 39 | |
| 40 | %A = load int* %P1 |
| 41 | store int 1, int* %P2 ; Should not invalidate load |
| 42 | %BREMOVE = load int* %P1 |
| 43 | %Val = sub int %A, %BREMOVE |
| 44 | ret int %Val |
| 45 | } |
| 46 | |
Chris Lattner | 7e38fbe | 2003-02-09 19:01:00 +0000 | [diff] [blame] | 47 | ; Test that if two pointers are spaced out by a constant getelementptr, that |
| 48 | ; they cannot alias. |
| 49 | int %gep_distance_test(int* %A) { |
| 50 | %REMOVEu = load int* %A |
| 51 | %B = getelementptr int* %A, long 2 ; Cannot alias A |
| 52 | store int 7, int* %B |
| 53 | %REMOVEv = load int* %A |
| 54 | %r = sub int %REMOVEu, %REMOVEv |
| 55 | ret int %r |
| 56 | } |
| 57 | |
Chris Lattner | 7b9b1f9 | 2003-02-25 21:43:37 +0000 | [diff] [blame] | 58 | ; Test that if two pointers are spaced out by a constant offset, that they |
| 59 | ; cannot alias, even if there is a variable offset between them... |
| 60 | int %gep_distance_test2({int,int}* %A, long %distance) { |
| 61 | %A = getelementptr {int,int}* %A, long 0, ubyte 0 |
| 62 | %REMOVEu = load int* %A |
| 63 | %B = getelementptr {int,int}* %A, long %distance, ubyte 1 |
| 64 | store int 7, int* %B ; B cannot alias A, it's at least 4 bytes away |
| 65 | %REMOVEv = load int* %A |
| 66 | %r = sub int %REMOVEu, %REMOVEv |
| 67 | ret int %r |
| 68 | } |
Chris Lattner | 2271fdd | 2003-02-26 21:39:52 +0000 | [diff] [blame] | 69 | |
Chris Lattner | cd4d41c | 2003-02-26 22:01:58 +0000 | [diff] [blame] | 70 | ; Test that we can do funny pointer things and that distance calc will still |
| 71 | ; work. |
| 72 | int %gep_distance_test3(int * %A) { |
Chris Lattner | 2271fdd | 2003-02-26 21:39:52 +0000 | [diff] [blame] | 73 | %X = load int* %A |
| 74 | %B = cast int* %A to sbyte* |
| 75 | %C = getelementptr sbyte* %B, long 4 |
| 76 | %Y = load sbyte* %C |
| 77 | ret int 8 |
| 78 | } |
Chris Lattner | 1ae9143 | 2003-06-17 15:16:35 +0000 | [diff] [blame^] | 79 | |
| 80 | ; Test that we can disambiguate globals reached through constantexpr geps |
| 81 | int %constexpr_test() { |
| 82 | %X = alloca int |
| 83 | %Y = load int* %X |
| 84 | store int 5, int* getelementptr ({ int }* %Global, long 0, ubyte 0) |
| 85 | %REMOVE = load int* %X |
| 86 | %retval = sub int %Y, %REMOVE |
| 87 | ret int %retval |
| 88 | } |