Chris Lattner | d263dbe | 2009-11-02 01:58:03 +0000 | [diff] [blame] | 1 | ; RUN: opt < %s -instcombine -S | FileCheck %s |
Chris Lattner | 2357f25 | 2005-01-31 05:36:19 +0000 | [diff] [blame] | 2 | |
Tanya Lattner | 5640bd1 | 2008-03-01 09:15:35 +0000 | [diff] [blame] | 3 | define void @test1(i32* %P) { |
| 4 | store i32 undef, i32* %P |
| 5 | store i32 123, i32* undef |
| 6 | store i32 124, i32* null |
| 7 | ret void |
Chris Lattner | d263dbe | 2009-11-02 01:58:03 +0000 | [diff] [blame] | 8 | ; CHECK: @test1( |
Chris Lattner | a73ecf0 | 2009-11-26 22:04:42 +0000 | [diff] [blame] | 9 | ; CHECK-NEXT: store i32 123, i32* undef |
Chris Lattner | d263dbe | 2009-11-02 01:58:03 +0000 | [diff] [blame] | 10 | ; CHECK-NEXT: store i32 undef, i32* null |
| 11 | ; CHECK-NEXT: ret void |
Chris Lattner | 2357f25 | 2005-01-31 05:36:19 +0000 | [diff] [blame] | 12 | } |
Chris Lattner | 158dd8a | 2006-05-26 19:18:40 +0000 | [diff] [blame] | 13 | |
Tanya Lattner | 5640bd1 | 2008-03-01 09:15:35 +0000 | [diff] [blame] | 14 | define void @test2(i32* %P) { |
| 15 | %X = load i32* %P ; <i32> [#uses=1] |
| 16 | %Y = add i32 %X, 0 ; <i32> [#uses=1] |
| 17 | store i32 %Y, i32* %P |
| 18 | ret void |
Chris Lattner | d263dbe | 2009-11-02 01:58:03 +0000 | [diff] [blame] | 19 | ; CHECK: @test2 |
| 20 | ; CHECK-NEXT: ret void |
Chris Lattner | 158dd8a | 2006-05-26 19:18:40 +0000 | [diff] [blame] | 21 | } |
Tanya Lattner | 5640bd1 | 2008-03-01 09:15:35 +0000 | [diff] [blame] | 22 | |
Chris Lattner | db3311e | 2009-11-02 02:00:18 +0000 | [diff] [blame] | 23 | ;; Simple sinking tests |
| 24 | |
| 25 | ; "if then else" |
| 26 | define i32 @test3(i1 %C) { |
| 27 | %A = alloca i32 |
| 28 | br i1 %C, label %Cond, label %Cond2 |
| 29 | |
| 30 | Cond: |
| 31 | store i32 -987654321, i32* %A |
| 32 | br label %Cont |
| 33 | |
| 34 | Cond2: |
| 35 | store i32 47, i32* %A |
| 36 | br label %Cont |
| 37 | |
| 38 | Cont: |
| 39 | %V = load i32* %A |
| 40 | ret i32 %V |
| 41 | ; CHECK: @test3 |
| 42 | ; CHECK-NOT: alloca |
| 43 | ; CHECK: Cont: |
| 44 | ; CHECK-NEXT: %storemerge = phi i32 [ 47, %Cond2 ], [ -987654321, %Cond ] |
| 45 | ; CHECK-NEXT: ret i32 %storemerge |
| 46 | } |
| 47 | |
| 48 | ; "if then" |
| 49 | define i32 @test4(i1 %C) { |
| 50 | %A = alloca i32 |
| 51 | store i32 47, i32* %A |
| 52 | br i1 %C, label %Cond, label %Cont |
| 53 | |
| 54 | Cond: |
| 55 | store i32 -987654321, i32* %A |
| 56 | br label %Cont |
| 57 | |
| 58 | Cont: |
| 59 | %V = load i32* %A |
| 60 | ret i32 %V |
| 61 | ; CHECK: @test4 |
| 62 | ; CHECK-NOT: alloca |
| 63 | ; CHECK: Cont: |
| 64 | ; CHECK-NEXT: %storemerge = phi i32 [ -987654321, %Cond ], [ 47, %0 ] |
| 65 | ; CHECK-NEXT: ret i32 %storemerge |
| 66 | } |
| 67 | |
Chris Lattner | 3cd6a61 | 2009-11-02 02:06:37 +0000 | [diff] [blame] | 68 | ; "if then" |
| 69 | define void @test5(i1 %C, i32* %P) { |
| 70 | store i32 47, i32* %P, align 1 |
| 71 | br i1 %C, label %Cond, label %Cont |
| 72 | |
| 73 | Cond: |
| 74 | store i32 -987654321, i32* %P, align 1 |
| 75 | br label %Cont |
| 76 | |
| 77 | Cont: |
| 78 | ret void |
| 79 | ; CHECK: @test5 |
| 80 | ; CHECK: Cont: |
| 81 | ; CHECK-NEXT: %storemerge = phi i32 |
| 82 | ; CHECK-NEXT: store i32 %storemerge, i32* %P, align 1 |
| 83 | ; CHECK-NEXT: ret void |
| 84 | } |
| 85 | |