Dan Gohman | f17a25c | 2007-07-18 16:29:46 +0000 | [diff] [blame] | 1 | ; Test that LICM uses basicaa to do alias analysis, which is capable of |
| 2 | ; disambiguating some obvious cases. If LICM is able to disambiguate the |
Owen Anderson | e73dd1b | 2008-05-16 04:25:09 +0000 | [diff] [blame^] | 3 | ; two pointers, then the load should be hoisted, and the store sunk. |
Dan Gohman | f17a25c | 2007-07-18 16:29:46 +0000 | [diff] [blame] | 4 | |
Owen Anderson | e73dd1b | 2008-05-16 04:25:09 +0000 | [diff] [blame^] | 5 | ; RUN: llvm-as < %s | opt -basicaa -licm | llvm-dis | %prcontext @A 1 | not grep Loop |
Dan Gohman | f17a25c | 2007-07-18 16:29:46 +0000 | [diff] [blame] | 6 | |
Tanya Lattner | a695f01 | 2008-02-14 06:56:27 +0000 | [diff] [blame] | 7 | @A = global i32 7 ; <i32*> [#uses=3] |
| 8 | @B = global i32 8 ; <i32*> [#uses=2] |
| 9 | @C = global [2 x i32] [ i32 4, i32 8 ] ; <[2 x i32]*> [#uses=2] |
Dan Gohman | f17a25c | 2007-07-18 16:29:46 +0000 | [diff] [blame] | 10 | |
Tanya Lattner | a695f01 | 2008-02-14 06:56:27 +0000 | [diff] [blame] | 11 | define i32 @test(i1 %c) { |
| 12 | %Atmp = load i32* @A ; <i32> [#uses=2] |
| 13 | br label %Loop |
Dan Gohman | f17a25c | 2007-07-18 16:29:46 +0000 | [diff] [blame] | 14 | |
Tanya Lattner | a695f01 | 2008-02-14 06:56:27 +0000 | [diff] [blame] | 15 | Loop: ; preds = %Loop, %0 |
| 16 | %ToRemove = load i32* @A ; <i32> [#uses=1] |
| 17 | store i32 %Atmp, i32* @B |
| 18 | br i1 %c, label %Out, label %Loop |
| 19 | |
| 20 | Out: ; preds = %Loop |
| 21 | %X = sub i32 %ToRemove, %Atmp ; <i32> [#uses=1] |
| 22 | ret i32 %X |
Dan Gohman | f17a25c | 2007-07-18 16:29:46 +0000 | [diff] [blame] | 23 | } |
| 24 | |
Tanya Lattner | a695f01 | 2008-02-14 06:56:27 +0000 | [diff] [blame] | 25 | define i32 @test2(i1 %c) { |
| 26 | br label %Loop |
Dan Gohman | f17a25c | 2007-07-18 16:29:46 +0000 | [diff] [blame] | 27 | |
Tanya Lattner | a695f01 | 2008-02-14 06:56:27 +0000 | [diff] [blame] | 28 | Loop: ; preds = %Loop, %0 |
| 29 | %AVal = load i32* @A ; <i32> [#uses=2] |
| 30 | %C0 = getelementptr [2 x i32]* @C, i64 0, i64 0 ; <i32*> [#uses=1] |
| 31 | store i32 %AVal, i32* %C0 |
| 32 | %BVal = load i32* @B ; <i32> [#uses=2] |
| 33 | %C1 = getelementptr [2 x i32]* @C, i64 0, i64 1 ; <i32*> [#uses=1] |
| 34 | store i32 %BVal, i32* %C1 |
| 35 | br i1 %c, label %Out, label %Loop |
Dan Gohman | f17a25c | 2007-07-18 16:29:46 +0000 | [diff] [blame] | 36 | |
Tanya Lattner | a695f01 | 2008-02-14 06:56:27 +0000 | [diff] [blame] | 37 | Out: ; preds = %Loop |
| 38 | %X = sub i32 %AVal, %BVal ; <i32> [#uses=1] |
| 39 | ret i32 %X |
Dan Gohman | f17a25c | 2007-07-18 16:29:46 +0000 | [diff] [blame] | 40 | } |
| 41 | |