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 |
Kenneth Uildriks | a092c12 | 2009-11-03 15:29:06 +0000 | [diff] [blame^] | 6 | target datalayout = "E-p:64:64:64-a0:0:8-f32:32:32-f64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-v64:64:64-v128:128:128" |
Dan Gohman | f17a25c | 2007-07-18 16:29:46 +0000 | [diff] [blame] | 7 | |
Tanya Lattner | a695f01 | 2008-02-14 06:56:27 +0000 | [diff] [blame] | 8 | @A = global i32 7 ; <i32*> [#uses=3] |
| 9 | @B = global i32 8 ; <i32*> [#uses=2] |
| 10 | @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] | 11 | |
Chris Lattner | 16078ca | 2009-08-30 21:36:06 +0000 | [diff] [blame] | 12 | define i32 @test1(i1 %c) { |
Tanya Lattner | a695f01 | 2008-02-14 06:56:27 +0000 | [diff] [blame] | 13 | %Atmp = load i32* @A ; <i32> [#uses=2] |
| 14 | br label %Loop |
Dan Gohman | f17a25c | 2007-07-18 16:29:46 +0000 | [diff] [blame] | 15 | |
Tanya Lattner | a695f01 | 2008-02-14 06:56:27 +0000 | [diff] [blame] | 16 | Loop: ; preds = %Loop, %0 |
| 17 | %ToRemove = load i32* @A ; <i32> [#uses=1] |
| 18 | store i32 %Atmp, i32* @B |
| 19 | br i1 %c, label %Out, label %Loop |
| 20 | |
| 21 | Out: ; preds = %Loop |
| 22 | %X = sub i32 %ToRemove, %Atmp ; <i32> [#uses=1] |
| 23 | ret i32 %X |
Chris Lattner | 16078ca | 2009-08-30 21:36:06 +0000 | [diff] [blame] | 24 | |
| 25 | ; The Loop block should be empty after the load/store are promoted. |
| 26 | ; CHECK: @test1 |
| 27 | ; CHECK: load i32* @B |
| 28 | ; CHECK: Loop: |
| 29 | ; CHECK-NEXT: br i1 %c, label %Out, label %Loop |
| 30 | ; CHECK: Out: |
| 31 | ; CHECK: store i32 %Atmp, i32* @B |
Dan Gohman | f17a25c | 2007-07-18 16:29:46 +0000 | [diff] [blame] | 32 | } |
| 33 | |
Tanya Lattner | a695f01 | 2008-02-14 06:56:27 +0000 | [diff] [blame] | 34 | define i32 @test2(i1 %c) { |
| 35 | br 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 | Loop: ; preds = %Loop, %0 |
| 38 | %AVal = load i32* @A ; <i32> [#uses=2] |
| 39 | %C0 = getelementptr [2 x i32]* @C, i64 0, i64 0 ; <i32*> [#uses=1] |
| 40 | store i32 %AVal, i32* %C0 |
| 41 | %BVal = load i32* @B ; <i32> [#uses=2] |
| 42 | %C1 = getelementptr [2 x i32]* @C, i64 0, i64 1 ; <i32*> [#uses=1] |
| 43 | store i32 %BVal, i32* %C1 |
| 44 | br i1 %c, label %Out, label %Loop |
Dan Gohman | f17a25c | 2007-07-18 16:29:46 +0000 | [diff] [blame] | 45 | |
Tanya Lattner | a695f01 | 2008-02-14 06:56:27 +0000 | [diff] [blame] | 46 | Out: ; preds = %Loop |
| 47 | %X = sub i32 %AVal, %BVal ; <i32> [#uses=1] |
| 48 | ret i32 %X |
Chris Lattner | 16078ca | 2009-08-30 21:36:06 +0000 | [diff] [blame] | 49 | ; The Loop block should be empty after the load/store are promoted. |
| 50 | ; CHECK: @test2 |
| 51 | ; CHECK: Loop: |
| 52 | ; CHECK-NEXT: br i1 %c, label %Out, label %Loop |
Dan Gohman | f17a25c | 2007-07-18 16:29:46 +0000 | [diff] [blame] | 53 | } |
| 54 | |