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 | |
Dan Gohman | 3c7d308 | 2009-09-11 18:01:28 +0000 | [diff] [blame] | 5 | ; RUN: opt < %s -basicaa -licm -S | FileCheck %s |
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 | |
Chris Lattner | 16078ca | 2009-08-30 21:36:06 +0000 | [diff] [blame] | 11 | define i32 @test1(i1 %c) { |
Tanya Lattner | a695f01 | 2008-02-14 06:56:27 +0000 | [diff] [blame] | 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 |
Chris Lattner | 16078ca | 2009-08-30 21:36:06 +0000 | [diff] [blame] | 23 | |
| 24 | ; The Loop block should be empty after the load/store are promoted. |
| 25 | ; CHECK: @test1 |
| 26 | ; CHECK: load i32* @B |
| 27 | ; CHECK: Loop: |
| 28 | ; CHECK-NEXT: br i1 %c, label %Out, label %Loop |
| 29 | ; CHECK: Out: |
| 30 | ; CHECK: store i32 %Atmp, i32* @B |
Dan Gohman | f17a25c | 2007-07-18 16:29:46 +0000 | [diff] [blame] | 31 | } |
| 32 | |
Tanya Lattner | a695f01 | 2008-02-14 06:56:27 +0000 | [diff] [blame] | 33 | define i32 @test2(i1 %c) { |
| 34 | br label %Loop |
Dan Gohman | f17a25c | 2007-07-18 16:29:46 +0000 | [diff] [blame] | 35 | |
Tanya Lattner | a695f01 | 2008-02-14 06:56:27 +0000 | [diff] [blame] | 36 | Loop: ; preds = %Loop, %0 |
| 37 | %AVal = load i32* @A ; <i32> [#uses=2] |
| 38 | %C0 = getelementptr [2 x i32]* @C, i64 0, i64 0 ; <i32*> [#uses=1] |
| 39 | store i32 %AVal, i32* %C0 |
| 40 | %BVal = load i32* @B ; <i32> [#uses=2] |
| 41 | %C1 = getelementptr [2 x i32]* @C, i64 0, i64 1 ; <i32*> [#uses=1] |
| 42 | store i32 %BVal, i32* %C1 |
| 43 | br i1 %c, label %Out, label %Loop |
Dan Gohman | f17a25c | 2007-07-18 16:29:46 +0000 | [diff] [blame] | 44 | |
Tanya Lattner | a695f01 | 2008-02-14 06:56:27 +0000 | [diff] [blame] | 45 | Out: ; preds = %Loop |
| 46 | %X = sub i32 %AVal, %BVal ; <i32> [#uses=1] |
| 47 | ret i32 %X |
Chris Lattner | 16078ca | 2009-08-30 21:36:06 +0000 | [diff] [blame] | 48 | ; The Loop block should be empty after the load/store are promoted. |
| 49 | ; CHECK: @test2 |
| 50 | ; CHECK: Loop: |
| 51 | ; CHECK-NEXT: br i1 %c, label %Out, label %Loop |
Dan Gohman | f17a25c | 2007-07-18 16:29:46 +0000 | [diff] [blame] | 52 | } |
| 53 | |