Chris Lattner | ac39b4e | 2002-08-22 17:31:36 +0000 | [diff] [blame] | 1 | ; Test that GCSE uses basicaa to do alias analysis, which is capable of |
| 2 | ; disambiguating some obvious cases. All loads should be removable in |
| 3 | ; this testcase. |
| 4 | |
Bill Wendling | d5cc8b8 | 2012-04-24 09:15:38 +0000 | [diff] [blame] | 5 | ; RUN: opt < %s -basicaa -gvn -instcombine -dce -S | FileCheck %s |
Chris Lattner | ac39b4e | 2002-08-22 17:31:36 +0000 | [diff] [blame] | 6 | |
Tanya Lattner | dcd188d | 2008-02-14 06:56:27 +0000 | [diff] [blame] | 7 | @A = global i32 7 |
| 8 | @B = global i32 8 |
Chris Lattner | ac39b4e | 2002-08-22 17:31:36 +0000 | [diff] [blame] | 9 | |
Bill Wendling | d5cc8b8 | 2012-04-24 09:15:38 +0000 | [diff] [blame] | 10 | ; CHECK: define i32 @test() |
| 11 | ; CHECK-NEXT: store i32 123, i32* @B |
| 12 | ; CHECK-NEXT: ret i32 0 |
| 13 | |
Tanya Lattner | dcd188d | 2008-02-14 06:56:27 +0000 | [diff] [blame] | 14 | define i32 @test() { |
| 15 | %A1 = load i32* @A |
Chris Lattner | ac39b4e | 2002-08-22 17:31:36 +0000 | [diff] [blame] | 16 | |
Tanya Lattner | dcd188d | 2008-02-14 06:56:27 +0000 | [diff] [blame] | 17 | store i32 123, i32* @B ; Store cannot alias @A |
Chris Lattner | ac39b4e | 2002-08-22 17:31:36 +0000 | [diff] [blame] | 18 | |
Tanya Lattner | dcd188d | 2008-02-14 06:56:27 +0000 | [diff] [blame] | 19 | %A2 = load i32* @A |
| 20 | %X = sub i32 %A1, %A2 |
| 21 | ret i32 %X |
Chris Lattner | ac39b4e | 2002-08-22 17:31:36 +0000 | [diff] [blame] | 22 | } |
| 23 | |
Bill Wendling | d5cc8b8 | 2012-04-24 09:15:38 +0000 | [diff] [blame] | 24 | ; CHECK: define i32 @test2() |
| 25 | ; CHECK-NEXT: br label %Loop |
| 26 | ; CHECK: Loop: |
| 27 | ; CHECK-NEXT: store i32 0, i32* @B |
| 28 | ; CHECK-NEXT: br i1 true, label %out, label %Loop |
| 29 | ; CHECK: out: |
| 30 | ; CHECK-NEXT: ret i32 0 |
| 31 | |
Tanya Lattner | dcd188d | 2008-02-14 06:56:27 +0000 | [diff] [blame] | 32 | define i32 @test2() { |
| 33 | %A1 = load i32* @A |
Chris Lattner | 8673e44 | 2002-08-22 20:22:55 +0000 | [diff] [blame] | 34 | br label %Loop |
| 35 | Loop: |
Tanya Lattner | dcd188d | 2008-02-14 06:56:27 +0000 | [diff] [blame] | 36 | %AP = phi i32 [0, %0], [%X, %Loop] |
| 37 | store i32 %AP, i32* @B ; Store cannot alias @A |
Chris Lattner | 8673e44 | 2002-08-22 20:22:55 +0000 | [diff] [blame] | 38 | |
Tanya Lattner | dcd188d | 2008-02-14 06:56:27 +0000 | [diff] [blame] | 39 | %A2 = load i32* @A |
| 40 | %X = sub i32 %A1, %A2 |
| 41 | %c = icmp eq i32 %X, 0 |
| 42 | br i1 %c, label %out, label %Loop |
Chris Lattner | 8673e44 | 2002-08-22 20:22:55 +0000 | [diff] [blame] | 43 | |
| 44 | out: |
Tanya Lattner | dcd188d | 2008-02-14 06:56:27 +0000 | [diff] [blame] | 45 | ret i32 %X |
Chris Lattner | 8673e44 | 2002-08-22 20:22:55 +0000 | [diff] [blame] | 46 | } |
| 47 | |
Tanya Lattner | dcd188d | 2008-02-14 06:56:27 +0000 | [diff] [blame] | 48 | declare void @external() |
Chris Lattner | 1306089 | 2004-03-12 22:38:31 +0000 | [diff] [blame] | 49 | |
Bill Wendling | d5cc8b8 | 2012-04-24 09:15:38 +0000 | [diff] [blame] | 50 | ; CHECK: define i32 @test3() |
| 51 | ; CHECK-NEXT: call void @external() |
| 52 | ; CHECK-NEXT: ret i32 7 |
| 53 | |
Tanya Lattner | dcd188d | 2008-02-14 06:56:27 +0000 | [diff] [blame] | 54 | define i32 @test3() { |
| 55 | %X = alloca i32 |
| 56 | store i32 7, i32* %X |
| 57 | call void @external() |
| 58 | %V = load i32* %X |
| 59 | ret i32 %V |
Chris Lattner | 1306089 | 2004-03-12 22:38:31 +0000 | [diff] [blame] | 60 | } |
| 61 | |