blob: db557b7a248b1c77f7ae883adc27cf278f04adfb [file] [log] [blame]
Chris Lattnerac39b4e2002-08-22 17:31:36 +00001; 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 Wendlingd5cc8b82012-04-24 09:15:38 +00005; RUN: opt < %s -basicaa -gvn -instcombine -dce -S | FileCheck %s
Chris Lattnerac39b4e2002-08-22 17:31:36 +00006
Tanya Lattnerdcd188d2008-02-14 06:56:27 +00007@A = global i32 7
8@B = global i32 8
Chris Lattnerac39b4e2002-08-22 17:31:36 +00009
Bill Wendlingd5cc8b82012-04-24 09:15:38 +000010; CHECK: define i32 @test()
11; CHECK-NEXT: store i32 123, i32* @B
12; CHECK-NEXT: ret i32 0
13
Tanya Lattnerdcd188d2008-02-14 06:56:27 +000014define i32 @test() {
15 %A1 = load i32* @A
Chris Lattnerac39b4e2002-08-22 17:31:36 +000016
Tanya Lattnerdcd188d2008-02-14 06:56:27 +000017 store i32 123, i32* @B ; Store cannot alias @A
Chris Lattnerac39b4e2002-08-22 17:31:36 +000018
Tanya Lattnerdcd188d2008-02-14 06:56:27 +000019 %A2 = load i32* @A
20 %X = sub i32 %A1, %A2
21 ret i32 %X
Chris Lattnerac39b4e2002-08-22 17:31:36 +000022}
23
Bill Wendlingd5cc8b82012-04-24 09:15:38 +000024; 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 Lattnerdcd188d2008-02-14 06:56:27 +000032define i32 @test2() {
33 %A1 = load i32* @A
Chris Lattner8673e442002-08-22 20:22:55 +000034 br label %Loop
35Loop:
Tanya Lattnerdcd188d2008-02-14 06:56:27 +000036 %AP = phi i32 [0, %0], [%X, %Loop]
37 store i32 %AP, i32* @B ; Store cannot alias @A
Chris Lattner8673e442002-08-22 20:22:55 +000038
Tanya Lattnerdcd188d2008-02-14 06:56:27 +000039 %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 Lattner8673e442002-08-22 20:22:55 +000043
44out:
Tanya Lattnerdcd188d2008-02-14 06:56:27 +000045 ret i32 %X
Chris Lattner8673e442002-08-22 20:22:55 +000046}
47
Tanya Lattnerdcd188d2008-02-14 06:56:27 +000048declare void @external()
Chris Lattner13060892004-03-12 22:38:31 +000049
Bill Wendlingd5cc8b82012-04-24 09:15:38 +000050; CHECK: define i32 @test3()
51; CHECK-NEXT: call void @external()
52; CHECK-NEXT: ret i32 7
53
Tanya Lattnerdcd188d2008-02-14 06:56:27 +000054define 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 Lattner13060892004-03-12 22:38:31 +000060}
61